ssrf漏洞科普
2016-04-17 21:34
246 查看
csrf全称是跨站请求伪造,是对客户端的请求伪造,而ssrf全称是服务端请求伪造,利用的是服务端的请求伪造。ssrf是利用存在缺陷的web应用作为代理攻击远程和本地的服务器。常见的方式如下:
2.攻击运行在内网或本地的应用程序(比如溢出);
3.对内网web应用进行指纹识别,通过访问默认文件实现;
4.攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2,sqli等);
5.利用file协议读取本地文件等。
这段代码使用file_get_contents获取用户指定图片的内容,然后随机命名保存在硬盘里,最后展示给用户。
这段代码跟服务器建立tcp链接,发送原始数据,通过发送http信息,来获取返回信息。
通过curl获取信息。
用来端口扫描等
乌云实例
http://wooyun.org/bugs/wooyun-2010-0112082
http://wooyun.org/bugs/wooyun-2010-0109257
http://wooyun.org/bugs/wooyun-2010-0108113
http://wooyun.org/bugs/wooyun-2010-0103675
绕过ssrf ip过滤一些方法
2、添加端口号
3、短地址
4、可以指向任意ip的域名:xip.io
5、ip地址转换成进制来访问
查找方法
可以从以下url参数中查找
防御方法
1,过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
2, 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
3,限制请求的端口为http常用的端口,比如,80,443,8080,8090。
4,黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。
5,禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。
主要的攻击方式
1.可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息;2.攻击运行在内网或本地的应用程序(比如溢出);
3.对内网web应用进行指纹识别,通过访问默认文件实现;
4.攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2,sqli等);
5.利用file协议读取本地文件等。
常用的后端实现
<?php if (isset($_POST['url'])) { $content = file_get_contents($_POST['url']); $filename = './images/'.rand().'img1.jpg'; file_put_contents($filename, $content); echo $_POST['url'].""; $img = "<img src=\"".$filename."\"/>"; } echo $img; ?>
这段代码使用file_get_contents获取用户指定图片的内容,然后随机命名保存在硬盘里,最后展示给用户。
<?php function GetFile($host,$port,$link) { $fp = fsockopen($host, intval($port), $errno, $errstr, 30); if (!$fp) { echo "$errstr (error number $errno) \n"; } else { $out = "GET $link HTTP/1.1\r\n"; $out .= "Host: $host\r\n"; $out .= "Connection: Close\r\n\r\n"; $out .= "\r\n"; fwrite($fp, $out); $contents=''; while (!feof($fp)) { $contents.= fgets($fp, 1024); } fclose($fp); return $contents; } } ?>
这段代码跟服务器建立tcp链接,发送原始数据,通过发送http信息,来获取返回信息。
<?php if (isset($_POST['url']) { $link = $_POST['url']; $curlobj = curl_init(); curl_setopt($curlobj, CURLOPT_POST, 0); curl_setopt($curlobj,CURLOPT_URL,$link); curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($curlobj); curl_close($curlobj); $filename = './curled/'.rand().'.txt'; file_put_contents($filename, $result); echo $result; } ?>
通过curl获取信息。
攻击实例
<?php if (isset($_POST['url'])) { $link = $_POST['url']; $filename = './curled/'.rand().'txt'; $curlobj = curl_init($link); $fp = fopen($filename,"w"); curl_setopt($curlobj, CURLOPT_FILE, $fp); curl_setopt($curlobj, CURLOPT_HEADER, 0); curl_exec($curlobj); curl_close($curlobj); fclose($fp); $fp = fopen($filename,"r"); $result = fread($fp, filesize($filename)); fclose($fp); echo $result; } ?>
用来端口扫描等
乌云实例
http://wooyun.org/bugs/wooyun-2010-0112082
http://wooyun.org/bugs/wooyun-2010-0109257
http://wooyun.org/bugs/wooyun-2010-0108113
http://wooyun.org/bugs/wooyun-2010-0103675
绕过ssrf ip过滤一些方法
存在过滤的时候可以试试以下姿势:
1、@http://abc@127.0.0.1
2、添加端口号
http://127.0.0.1:8080
3、短地址
http://dwz.cn/11SMa
4、可以指向任意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
5、ip地址转换成进制来访问
115.239.210.26 = 16373751032
查找方法
可以从以下url参数中查找
share wap url link src source target u 3g display sourceURl imageURL domain
防御方法
1,过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
2, 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
3,限制请求的端口为http常用的端口,比如,80,443,8080,8090。
4,黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。
5,禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。
相关文章推荐
- Tomcat7 搭建 websocket服务
- python 2.7 安装MySQLdb模块
- C语言中递归什么时候可以省略return引发的思考:通过内联汇编解读C语言函数return的本质
- PIE结对编程
- 关于UIView中相关坐标及改变的相关方法
- NDK开发历程(一):android native code的调试方法
- NYOJ364田忌赛马
- 关于UIView中相关坐标及改变的相关方法
- 第2次实验报告
- 学习进度06
- 20145307第二次JAVA学习实验报告
- 20145317彭垚 《Java程序设计》第7周学习总结
- 第五次作业
- 《构建之法》阅读笔记07
- Go和C类型对应关系
- MySQL的安装问题解决
- 欧几里得算法及扩展欧几里得
- Haproxy+keepalived 高可用负载 推荐
- 线程、进程、及其区别
- Thread