ssrf(server—side request forgery)服务器端请求伪造定义:利用漏洞伪造服务发起请求,从而突破客户端获取不到数据的限制。
SSRF漏洞产生环节:目标网站接受请求后在服务器端验证请求是否合法。
服务器端的验证并没有对其请求获取图片的参数(image=)做出严格的过滤以及限制,导致可以从其他服务器获取一定量的数据。
比如我们请求www.xxx.com/a.php?image=1.jpg
可以改为:www.xxx.com/a.php?image=www.abc.com/1.jpg
这样就形成了SSRF 没有对用户的输入做严格的限制,且服务器端提供了从其他服务器应用获取数据的功能。
代码审计层面:
file_get_content() 从用户指定的url获取图片,用一个随机的文件名保存在硬盘上,展示给用户。
curl 使用curl获取数据并保存
fsockopen() 实现用户指定url的数据(文件或html),这个函数使用socket与服务器建立tcp连接,传输原始数据。
还有一些java常用的函数。
防护方法:
添加白名单
或者指定下载
漏洞利用方法:
首先介绍一下常用协议:
https:主要用于探测内网服务,根据响应的状态判断内网端口及服务。
dict:词典网络协议,在RFC 2009中进行描述,允许客户端在使用过程中访问更多的字典。
file:主要用于访问本地计算机中的文件
ftp:可以从一台计算机将文件传送到另一台计算机
gopher:协议支持发出GRT,POST请求
本地利用:
操作Redis
curl -vvv ‘dict://127.0.0.1:6379/info
远程利用:
#利用file协议进行文件读取
curl -v ‘http://xxx.com:8082/xxx/sstrf.php?url=file:///etc/passwd’
#利用dict协议查看端口
curl -v ‘http://xxx.com:8082/xxx/sstrf.php?url=dict://127.0.0.1:22’
#利用gopher协议反弹shell
bypass技巧:
- 添加@符号 http://baidu.com@www.baidu.com/与http://www.baidu.com/请求时是相同的
- 各种IP地址的进制转换(依然可以解析) 115.239.210.26=16373751032
- URL跳转绕过 http://www.hack.cn/redirect.php?url=http://192.168.0.1/
- 短网址绕过 http://t.cn/RwbLKDx
-
xip.io绕过 http://xxx.192.168.0.1.xip.io/==192.168.0.1
(指向任意ip的域名:xip.io(37signals开发实现的定制DNS服务) - 限制了子网段,可以加端口(例如80绕过)
- 探测内网域名,或者将自己的域名解析到内网ip
漏洞主要存在于以下几个功能
:
分享:通过url地址分享网页的内容
转码服务:通过url地址把源地址的网页内容调优使其适合手机屏幕浏览
在线翻译:通过url地址翻译对应的文本内容
图片加载与下载:通过URL地址加载或者下载图片
图片,文章收藏功能
未公开的api实现以及其他调用url的功能
网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作
url中关键字
share,wap,url,link,src,source,target,u,3g,display,sourceURL,imageURL,domai