https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery
简介
原理
SSRF Server Side Request Forgery,服务端请求伪造。
通常出现在网站请求 url 资源的情况下。如果服务端对用户传入的 url 未适当检查,就可以使网站服务器请求自身敏感资源或者探测内网内其它机器(探针),或利用可以通过 url 触发的漏洞(利用)。
即端口扫描、与漏洞利用。
实际中的限制
进行端口扫描时,受限于不同编程语言对 url 协议的支持程度与配置情况。详见文末
例如,php 可禁用 allow_url_fopen ,以禁止对 url 风格的文件的支持。
如何攻击
主要是寻找攻击面,然后尝试突破防御,最后进行利用。
-
攻击面:留意数据包中的 url 参数。可以结合参数名和参数值根据经验判断。
-
突破常见代码防御,见下文。
-
进行利用,见下文。
如何防御
ssrf 属于输入验证不当,可以从这点进行防御,设定过滤规则良好的正则表达式。
此外还可以通过禁用某些参数,例如 php 中 allow_url_fopen 等。
常见防御绕过
-
不严谨的 url 检验方式。
-
更改其它协议。
-
常见的 本地 ip 替换形式,参考。
# 本地ip 127.0.0.1 的替代形式 127.1 localhost 127.127.127.127 # cdir 0x7f000001 # 16 进制 2130706433 # 10 进制 017700000001 # 8 进制
-
DNS 解析指向本地 ip ,参考。
# 以下域名进行解析都会返回 127.0.0.1 127.0.2.1.nip.io customer1.app.localhost.my.company.127.0.0.1.nip.io spoofed.burpcollaborator.net
-
dns 重绑定。
大致原理:当防御机制进行检测时,第一次请求 dns 时,返回正常ip。然后更改 dns 将其重绑定为 127.0.0.1,当代码中第二次请求时,就会返回 127.0.0.1。
参考 完整技术细节 、可用工具:singularity 、dnsFookup
利用手法
端口扫描
因为 url 格式中有多种协议,可以利用不同的协议进行探测。不同编程语言对 url 协议的支持度不同。
scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]
只要不显式 connect refuse ,那么就是 开放端口。
下表是利用中常见的一些协议,详见 这篇文章
http:// #获取敏感功能网页(对外不开放),扫描端口
file:// #获取服务器本地文件
dict:// #端口扫描
SFTP:// #端口扫描
LDAP:// #端口扫描
Gopher:// #可以构造其它协议请求 参考 https://zhuanlan.zhihu.com/p/112055947
若要探测版本信息,需要符合应用层协议,可以参考 nmap 中 banner 脚本
应用层协议属于应用程序通讯语法规则,若应用程序收到非法数据包,依据应用程序的处理规则可能进行响应,也可能不会响应。
漏洞利用
因为 ssrf 本质是发送 url 请求,所以只能利用可以通过 url 触发的漏洞。例如 Struts2-045
可以通过 url 触发的漏洞 。云主机、云服务器的 利用方式 。
盲 ssrf ,几乎无法利用,只能碰运气。可以用已知的通过 url 利用的漏洞盲打。
其它
不同编程语言支持的不同协议。