1.SSRF漏洞基础
1.1SSRF漏洞概述与成因
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。
一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
1.2SSRF攻击流程
1.攻击者向易受 SSRF 攻击且与目标服务器位于同一内部网络的 Web 服务器发送伪造请求。
2.易受攻击的 Web 服务器将攻击者控制的请求发送到受害者的服务器,绕过防火墙。
3.受害者的服务器用请求的数据响应网络服务器。
4.如果特定的 SSRF 漏洞允许,数据将被发送回攻击者。在大多数情况下,攻击者需要通过其他方式(带外)泄露或推断此信息。
1.3SSRF与CSRF的区别
CSRF是服务器端没有对用户提交的数据进行随机值校验,且对http请求包内的refer字段校验不严,导致攻击者可以利用用户的cookie信息伪造用户请求发送至服务器;
SSRF是服务器对用户提供的可控URL过于信任,没有对攻击者提供的URL进行地址限制和足够的检测,导致攻击者可以以此为跳板攻击内网或者其它服务器
由攻击者构造的攻击链接传给服务端执行造成的漏洞,一般用来在外网探测或攻击内网服务
1.4漏洞危害
- 对外网、服务器所在内网、本地进行端口扫描;
- 攻击运行在内网或本地的服务、应用;
- 对内网web应用进行指纹识别、识别内网资产信息;
- 实现 CRLF 注入:利用 Redis 未授权访问,HTTP CRLF 注入实现 getshell。
1.5漏洞挖掘
1.5.1从web页面的功能去查找
- 分享:通过URL地址分享网页内容
- 转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览:由于手机屏幕大小的关系,直接浏览网页内容的时候会造成许多不便,因此有些公司提供了转码功能,把网页内容通过相关手段转为适合手机屏幕浏览的样式。例如百度、腾讯、搜狗等公司都有提供在线转码服务。
- 在线翻译:通过URL地址翻译对应文本的内容。提供此功能的国内公司有百度、有道等。
1.5.2通过URL关键字查找
- share
- wap
- url
- link
- src
- source
- target
- 3g
- displaysourceURL
- imageURL
- domain
1.6产生SSRF漏洞的函数
1.6.1file get contents
使用file_get_contents函数从用户指定的url获取图片。然后把它用一个随即文件名保存在硬盘上,并展示给用户
1.6.2.fsockopen():
使用fsockopen函数实现获取用户制定url的数据(文件或者html)。这个函数会使用socket跟服务器建立tcp连接,传输原始数据。
1.6.3.curl_exec():
CURL这是另一个非常常见的实现,它通过 PHP获取数据。文件/数据被下载并存储在“curled”文件夹下的磁盘中,并附加了一个随机数和“.txt”文件扩展名。
注意事项
1.一般情况下PHP不会开启fopen的gopher wrapper
2.file_get_contents的gopher协议不能URL编码
3.file_get_contents关于Gopher的302跳转会出现bug,导致利用失败
4.curl/libcurl 7.43 上gopher协议存在bug(%00截断) 经测试7.49 可用
5.curl_exec() 默认不跟踪跳转
6.file_get_contents() file_get_contents支持php://input协议
2.漏洞利用
2.1.SSRF中URL的伪协议
1.file:// 从文件系统中获取文件内容,如,file:///etc/passwd
2.dict://字典服务器协议,访问字典资源,如aict://ip:6379/info
3.sftp://ssh文件传输协议或安全文件传输协议
4.dap://轻量级目录访问协议
5.tftp:// 简单文件传输协议
6.gopher://分布式文档传递服务,可使用gopherus生成payload
2.2.本地文件读取
windows:file://c:windows\system.ini
linux:file:///etc/hosts
2.3.探测内网端口
使用dict探测哪些端口是开放的,可以结合burp使用,通过添加端口号字典,接着通过回显去判断哪些端口是开放的
3gopher协议利用
3.1gopher简介与原理
Gopher是Internet上一个非常有名的信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。在WWW出现之前,Gopher是Internet上最主要的信息检索工具,Gopher站点也是最主要的站点,使用tcp70端口。
gopher协议支持发出GET、POST请求:可以先截获get请求包和post请求包,在构成符合gopher协议的请求。gopher协议是ssrf利用中最强大的协议
3.2限制
3.3gopher协议格式
URL:gopher://<host>:<port>/<gopher-path>_后接TCP数据流
接受时候,接受方默认从第二个字符即下划线后开始接受,因此可以利用这点进行拼接
3.4gopher协议反弹shel
4. 绕过
部分存在漏洞,或者可能产生SSRF的功能中做了白名单或者黑名单的处理,来达到阻止对内网服务和资源的攻击和访问。因此想要达到SSRF的攻击,需要对请求的参数地址做相关的绕过处理
4.1. @绕过白名单限域名制
限制为http://www.xxx.com 域名时(利用@)
可以尝试采用http基本身份认证的方式绕过
如:http://www.aaa.com@www.bbb.com@www.ccc.com,在对@解析域名中,不同的处理函数存在处理差异
在PHP的parse_url中会识别www.ccc.com,而libcurl则识别为www.bbb.com。
4.2. 采用短网址绕过
比如百度短地址https://dwz.cn/
4.3. 采用进制转换
4.4. 利用特殊域名
原理是dns解析。ceye.io可以指向任意域名,即127.0.0.1.ceye.io
4.5. 利用[:]
可以利用[::]来绕过localhost
4.6. 利用封闭的数字
利用Enclosed alphanumerics
ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ >>> example.com
http://169.254.169.254>>>http://[::①⑥⑨。②⑤④。⑯⑨。②⑤④]
List:
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳
⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇
⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛
⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵
Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ
ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ
⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴
⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿
5.防御
通常有以下5个思路:
1,过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
2, 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
3,限制请求的端口为http常用的端口,比如,80,443,8080,8090。
4,黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。
5,禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。