ssrf
什么是ssrf
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种利用漏洞伪造服务器端发起请求。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。
原理
通过控制功能中的发起请求的服务来当作跳板攻击内网中其他服务。比如,通过控制前台的请求远程地址加载的响应,来让请求数据由远程的URL域名修改为请求本地、或者内网的IP地址及服务,来造成对内网系统的攻击。
危害
扫描内网开放服务
向内部任意主机的任意端口发送payload来攻击内网服务
- DOS攻击(请求大文件,始终保持连接Keep-Alive Always)
- 攻击内网的web应用,例如直接SQL注入、XSS攻击等
- 利用file、gopher、dict协议读取本地文件、执行命令等
漏洞的典型场景
形如下面的url形式http://www.xxx.com/image.php?image=http://www.xxc.com/a.jpg
服务器向远程请求加载图片
大体步骤:用户输入图片地址->请求发送到服务端解析->服务端请求链接地址的图片数据->获取请求的数据加载到前台显示
理想情况下,开发者没有限制任何协议访问,也没限制ip,那么攻击者可以直接请求内网地址:127.0.0.1等等,或者利用伪协议如dict
、file
、gopher
等等
1 | http://www.xxx.com/image.php?image=file:///etc/passwd |
对于不同语言实现的web系统可以使用的协议也存在不同的差异,其中:1
2
3
4php:
http、https、file、gopher、phar、dict、ftp、ssh、telnet...
java:
http、https、file、ftp、jar、netdoc、mailto...
很重要的是:
判断漏洞是否存在的重要前提是,请求的服务器发起的,以上链接即使存在并不一定代表这个请求是服务器发起的。因此前提不满足的情况下,SSRF是不必要考虑的。
链接获取后,是由js来获取对应参数交由window.location来处理相关的请求,或者加载到当前的iframe框架中,此时并不存在SSRF ,因为请求是本地发起,并不能产生攻击服务端内网的需求。
常见绕过方式
八进制、十进制、十六进制:
利用nip.io:
302跳转:
dns重绑定:
利用网站:https://qiita.com/shimoju/items/81ed5055d2fec5bb9c1e
其他绕过方式:https://www.secpulse.com/archives/65832.html
还有猪猪侠的分享
测试
编写如下php脚本1
2
3
4
5
6
7
8
9<?PHP
ch = curl_init();
ch, CURLOPT_URL, $_GET['url']);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
ch);
ch);
?>
reference:
https://xz.aliyun.com/t/6235#toc-10
https://xz.aliyun.com/t/6373#toc-0
Author: damn1t
Link: http://microvorld.com/2019/04/15/vulnerable/ssrf/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.