0x01漏洞简介
很多web应用都提供了从其他的服务器上获取数据的功能。使用用户指定的URL,web应用可以获取图片,下载文件,读取文件内容等。这个功能如果被恶意使用,可以利用存在缺陷的web应用作为代理攻击远程和本地的服务器。这种形式的攻击称为服务端请求伪造攻击(Server-side Request Forgery)
0x02漏洞危害
- 可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息;
- 攻击运行在内网或本地的应用程序(比如溢出);
- 对内网web应用进行指纹识别,通过访问默认文件实现;
- 攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2,sqli等);
- 利用file协议读取本地文件等。
0x03漏洞原理测试
| 12
 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>
 
 | 
后端处理代码如下:
| 12
 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的一些总结