0x01漏洞简介
很多web应用都提供了从其他的服务器上获取数据的功能。使用用户指定的URL,web应用可以获取图片,下载文件,读取文件内容等。这个功能如果被恶意使用,可以利用存在缺陷的web应用作为代理攻击远程和本地的服务器。这种形式的攻击称为服务端请求伪造攻击(Server-side Request Forgery)
0x02漏洞危害
- 可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息;
- 攻击运行在内网或本地的应用程序(比如溢出);
- 对内网web应用进行指纹识别,通过访问默认文件实现;
- 攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2,sqli等);
- 利用file协议读取本地文件等。
0x03漏洞原理测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>SSRF TEST</title> </head> <body> Enter the url: http://<input type="text" name="url" id="url" size="60"/> <input type="submit" value="submit" id="submit" /> <div id="content"></div>
<script type="text/javascript"> var xhr = function(){ var request = false; if(window.XMLHttpRequest){ request = new XMLHttpRequest(); } else if(window.ActiveXObject){ try{ request = new window.ActiveXObject("Msxml2.XMLHTTP"); } catch(e) {} } return request; }();
document.getElementById("submit").onclick = function() { var data = 'url=http://' + document.getElementById("url").value; xhr.open("POST", "ssrfTest.php"); xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhr.send(data); xhr.onreadystatechange = function() { if(xhr.readyState === 4){ if(xhr.status === 200){ document.getElementById("content").innerHTML = xhr.responseText; } else { alert("error: " + xhr.status); } } }; }; </script> </body> </html>
|
后端处理代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <?php error_reporting(0); if(isset($_POST['url'])){ $link = $_POST['url']; $filename = './curled'.rand().'.txt'; $curlObj = curl_init($link); $file = fopen($filename, 'w'); curl_setopt($curlObj, CURLOPT_FILE, $file); curl_setopt($curlObj, CURLOPT_HERDER, 0); curl_exec($curlObj); curl_close($curlObj); fclose($file);
$file = fopen($filename, 'r'); $result = fread($file, filesize($filename)); fclose($file);
echo $result; } ?>
|
0x04漏洞利用
- 端口扫描
- 攻击应用程序
- 内网web应用指纹识别
- 通过访问下列连接判断是否安装phpmyadmin
- 访问portName.js判断是否是DLink路由器
- manager/images/tomcat.gif
- 攻击内网web应用
- 读取本地文件
0x05绕过姿势
- @ http://abc@127.0.0.1
- 添加端口号 http://127.0.0.1:8080
- 短地址 http://dwz.cn/11SMa
- 可以指向任意ip的域名:xip.io
- 10.0.0.1.xip.io = 10.0.0.1
- www.10.0.0.1.xip.io = 10.0.0.1
- mysite.10.0.0.1.xip.io = 10.0.0.1
- foo.bar.10.0.0.1.xip.io = 10.0.0.1
- ip地址转换成进制来访问
- ip地址转换成进制来访问 115.239.210.26 = 16373751032
- 302绕过
0x06漏洞防御
- 过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
- 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
- 限制请求的端口为http常用的端口,比如,80,443,8080,8090。
- 黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。
- 禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。
0x07参考资料
利用 Gopher 协议拓展攻击面 长亭大牛写的,好文章
[安全科普]SSRF攻击实例解析
SSRF的一些总结