CSRF&SSRF

Posted lovesec

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSRF&SSRF相关的知识,希望对你有一定的参考价值。

什么是csrf

csrf通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

csrf的攻击方式

攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。


csrf

完成一次csrf攻击必须要有的条件

登录受信任的网站A,在本地生成Cookie,在不登出A的情况下,访问危险网站B,
下面有例子:
1.
使用GET请求更新资源,在访问危险网站B的之前没有登出A,而B中的<'img'>以GET的方式请求第三方资源,
2.使用POST请求完成转账操作,
表单如下

<form action="Transfer.php" method="POST">
  <p>ToBankId: <input type="text" name="toBankId" /></p>
  <p>Money: <input type="text" name="money" /></p>
  <p><input type="submit" value="Transfer" /></p></form>

后台处理php

<?php    session_start();     if (isset($_REQUEST['toBankId'] && isset($_REQUEST['money']))     {         buy_stocks($_REQUEST['toBankId'], $_REQUEST['money']);     }   ?>

这样依旧会让网站存在csrf漏洞,

 银行后台使用了$_REQUEST去获取请求的数据,而$_REQUEST既可以获取GET请求的数据,也可以获取POST请求的数据,这就造成了在后台处理程序无法区分这到底是GET请求的数据还是POST请求的数据。在PHP中,可以使用$_GET和$_POST分别获取GET请求和POST请求的数据。在JAVA中,用于获取请求数据request一样存在不能区分GET请求数据和POST数据的问题。依旧可以使用GET完成请求资源的操作,达到恶意攻击

3.经过$_GET,$_REQUEST请求之后,依旧出现了漏洞,使用$_POST来请求资源,
php代码如下:

<?php    session_start();     if (isset($_POST['toBankId'] && isset($_POST['money']))     {         buy_stocks($_POST['toBankId'], $_POST['money']);     }   ?>

此时的危险B网站,也构造了一个form表单,使用javascript自动提交表单,请求资源

<html>  <head>    <script type="text/javascript">      function steal()       {               iframe = document.frames["steal"];                iframe.document.Submit("transfer");       }     </script>  </head>  <body onload="steal()">    <iframe name="steal" display="none">      <form method="POST" name="transfer" action="http://www.myBank.com/Transfer.php">        <input type="hidden" name="toBankId" value="11">        <input type="hidden" name="money" value="1000">      </form>    </iframe>  </body></html>

总结一下上面3个例子,CSRF主要的攻击模式基本上是以上的3种,其中以第1,2种最为严重,因为触发条件很简单,一个<'img'>就可以了,而第3种比较麻烦,需要使用JavaScript,所以使用的机会会比前面的少很多,但无论是哪种情况,只要触发了CSRF攻击,后果都有可能很严重。

csrf的防御方法

  • 服务端进行CSRF防御
    服务端的CSRF方式方法很多样,但总的思想都是一致的,就是在客户端页面增加伪随机数。
    1.Cookie Hashing(所有表单都包含同一个伪随机值):
    这可能是最简单的解决方案了,因为攻击者不能获得第三方的Cookie(理论上),所以表单中的数据也就构造失败了:>
    2.这个方案的思路是:每次的用户提交都需要用户在表单中填写一个图片上的随机字符串,厄....这个方案可以完全解决CSRF,但个人觉得在易用性方面似乎不是太好,还有听闻是验证码图片的使用涉及了一个被称为MHTML的Bug,可能在某些版本的微软IE中受影响。
    3.可以证件Token值,使用加密的方式,用session的方式进行,验证,避免csrf漏洞。
    4.referer
    因为伪造的请求一般是从第三方网站发起的,所以第一个防御方法就是判断 referer 头,如果不是来自本网站的请求,就判定为CSRF攻击。但是该方法只能防御跨站的csrf攻击,不能防御同站的csrf攻击(虽然同站的csrf更难)。

什么是ssrf

服务器端请求伪造,是一种有攻击者构造形成有服务器发起的攻击,一般是外网无法访问的内网。

ssrf形成的原因

  • file_get_content()

    <?phpif (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获取图片。然后把它用一个随即文件名保存在硬盘上,并展示给用户。
  • curl-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; }?>这段代码使用fsockopen函数实现获取用户制定url的数据(文件或者html)。这个函数会使用socket跟服务器建立tcp连接,传输原始数据。
  • socket-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; } }?>

    ssrf利用方式

  • 可以对外网,服务器所在内网,本地端口扫描,获取一些服务的banner信息

  • 攻击运行在内网或本地的应用程序(溢出攻击)

  • 对内网web应用进行指纹识别,通过默认文件实现,

  • 攻击内外网web应用,只要是使用get参数就可以是实现的攻击(比如struts2,sqli等)

  • 利用file协议读取本地文件

    ssrf漏洞如何挖掘

1.从web功能上寻找

1.分享:通过URl地址分享网页内容2.转码服务:通过URL地址吧原地址的网页内容调优,时期适合手机屏幕浏览3.在线翻译:通过URL地址翻译对应文本内容4.图片的加载与下载:通过URL地址加载或下载图片5.图片,文章收藏功能

2.从URL关键字中寻找

share,wap,url,link,src,source,target,u,
3g,display,sourceURl,imageURL,domain

排除法

  • 使用burp抓包工具来判断是否不是ssrf,首先ssrf是由服务器发起的请求,因此在加载图片的时候是有服务器发起的请求,所以在本地浏览器的请求中就不应该存在图片的请求,再次例子中,如果刷新当前页面,有如下请求,侧可判断不是ssrf(前提设置burpsuite截断图片的请求,默认是放行的)
    验证是否可以探测内网

  • 利用@
    1.
    2.

  • 端口绕过

  • xip.io
    1.
    2.10.0.0.1.xip.io 10.0.0.1
    3.www.10.0.0.1.xip.io 10.0.0.1
    4.mysite.10.0.0.1.xip.io 10.0.0.1

  • 通过js跳转

    ssrf防御

    1.过滤返回信息,验证远程服务器对请求时的响应是比较容易的方式,如果web应用是去获取某一种类型文件,那么在把返回结果展示给用户之前先验证返回的信息是否符合标准,
    2.统一错误信息,避免用户可以根据错误信息来判断远程服务器的端口状态
    3.限制请求的端口为http常用端口,比如,80,443,8080,8090
    4.黑名单内网ip,避免应用被用来获取获取内网数据,攻击内网
    5.禁用不需要的协议,仅仅永续http和https请求

    可以通过burpsuite插件自动化监测ssrf漏洞,
    实例:
    weblogic配置不当,天生ssrf漏洞
    discuz x2.5/x3.0/x3.1/x3.2 ssrf漏洞
    CVE-2016-1897/8 - FFMpeg
    CVE-2016-3718 - ImageMagick


                                                                                                    转自

                                                                                              http://www.jianshu.com/p/2f60dbd68eb8


以上是关于CSRF&SSRF的主要内容,如果未能解决你的问题,请参考以下文章

web安全CSRF&SSRF&内网探针&漏洞利用

理论篇|WEB安全基础知识之CSRF&SSRF漏洞

CSRF与SSRF

CSRF与SSRF

csrf和ssrf总结

CSRF与SSRF