(转) XSS Attacks – Exploiting XSS Filter
中文翻译:
from wooyun'drops
0x00 前言
这又是一篇来自全职赏金猎人Masato kinugawa的神作。一次双杀,用一篇报告拿下了两个CVE,分别是CVE-2015-6144和CVE-2015-6176。报告内容指出IE的XSS Filter在对XSS攻击进行屏蔽时,由于正则的匹配不当在一些场景下会让本不存在XSS漏洞的页面产生XSS漏洞的问题。
0x01 IE的XSS Filter
Internet Explorer自IE8开始也就是2009年左右的时候首次导入了XSS Filter这一机制。不得不说,XSS Filter让很多安全研究者头疼。因为有时候你还真的就绕不过去。这会让我们产生兴趣说XSS Filter到底是怎么去阻挡xss攻击的。说简单也简单,IE会去比对用户的request和response如果IE认为有害的内容同时出现在了request和response当中,IE就会选择屏蔽掉response中部分xss关键字。(根据情况有时候会屏蔽整个response body)举个例子,如果你用IE像example.com发送如下的请求:
#!html
http://example.com/?q=<img src=x onerror=alert(1)>
那么你看到的response body就会是这样:
#!html
q param is : <img src=x #error=alert(1)>
onerror变成#nerror后这段html确实没有办法执行JavaScript也就谈不上什么XSS攻击。看似非常合理,其实设计上存在非常的大的问题。问题的核心在于IE不会去管response body中出现与request相匹配的内容是原始的response内容还是攻击者发送请求后所增加的内容。可能说的有点绕口,所以我得再举个例子。假设你像example.com发送如下的请求:
#!html
http://example.com/?q=AAA&<meta charset=
即便你没有任何参数(不难想到不看参数是在防范HPP攻击)它也会毅然决然地把原始的meta tag给屏蔽掉。所以response body会变成这样:
#!php
<m#ta charset=“utf-8”>
一次完美的误杀。这也是这两个CVE所利用到的IE的特性之一。居然说到了之一,就肯定有之二。之二是什么呢?之二就是负责防守不同场景下的XSS的正则在特定情况下,产生了交集。所以在这里我得再再举个例子来说明这个问题。在IE负责虐杀XSS的mshtml.dll当中有这么一段正则:
#!bash
[ /+\t\"\"`]style[ /+\t]*? =.*?([:=]|(&[#()\[\].]x?0*((58)|(3A)| (61)|(3D));?)).*?([(\\]|(&[#()\[\].]x? 0*((40)|(28)|(92)|(5C));?))
这个正则是用来防谁的呢?就是下面这段xss攻击:
#!php
<p style="x:expression(alert(1))">
这里的[ /+\t]*?
会匹配style
和=
之间出现多余0的空白字符(0x09-0x0D
,0x20
,/
,+
)。看似没有问题,然而研究者再次发现url中出现的“+”
可以被任意的[0-6]byte
的html内容所匹配。
也就是说当我们对下面的页面发送类似这样的请求URL:?/style++++++=++=\
时
#!html
<style> body{background:gold} </style>
</head>
<body>
<input name="q" value="">
由于URL中的”+”可以被看作是任意的[0-6]byte
的html内容,所以从style结束到第一个等号开始的31 bytes内容会被[ /+\t]*?
匹配上。浏览器认为这是一次类<p style="x:expression(alert(1))">
攻击,毫不犹豫的把style
替换成st#le
,response body再一次变成:
#!html
<style> body{background:gold} </st#le>
</head>
<body>
<input name="q" value="">
又一次的误杀。伴随着误杀xss注入点也瞬间从html attribute content变成css content。这时我们便可以发送请求?q=%0A{}* {x:expression(alert(1))}&/style++++++=++=\
来对本不存在xss漏洞的页面进行xss攻击。
类似的误杀还有:
[\"\"][ ]* (([^a-z0-9~_:\"\" ])|(in)) .+?[.].+?=
这段原来是为了防止script content中被注入类似location.href=xxoo
的内容时会产生xss的问题。不料却又匹配到了其它的内容。
请求:
URL:?"/++.+++=
被IE篡改过后的响应:
#!html
<script src="//example.co#jp/test.js" type="text/javascript">
</script>
原本该从example.co.jp/test.jp
读取的内容代码,却又跑去读example.co去了。这也就意味着针对于特定的域名和特定的目标攻击者是只需要注册example.co然后诱导用户去访问自己构造的example.com/?”/++.+++=
就能实现xss攻击。
URL里没有xss攻击的迹象,页面不存在XSS漏洞,并没有xss注入点,然而这是一次xss攻击。
同一个正则还有可能在这样的场景下出现问题:
一旦内容被匹配../1.css
就会变成#./1.css
也就意味着当前页面会被当作css被加载。构造类似第一个xss vector的攻击向量,我们就可以再一次对不存在xss漏洞的页面进行xss攻击:
这也就是我们所说的其二,正则存在交集的问题。
0x02 关于修复
facebook和google选择关闭x-xss-protection
或者使用1;mode=block
来解决这种不可预期的问题。
(转) XSS Attacks – Exploiting XSS Filter的更多相关文章
- XSS Attacks - Exploiting XSS Filter
XSS Attacks - Exploiting XSS Filter mramydnei · 2015/12/21 10:11 from:http://l0.cm/xxn/ 0x00 前言 这又是一 ...
- 反射型xss绕过IE xss filter
反射xss利用方法,绕过IE XSS Filter 假设 1.php页面代码如下: echo $_GET['str']; 使用IE浏览器访问该页面 1.php?str=<xss code> ...
- XSS过滤JAVA过滤器filter 防止常见SQL注入
Java项目中XSS过滤器的使用方法. 简单介绍: XSS : 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩 ...
- Mitigate XSS attacks
JavaScriptEncode //使用“\”对特殊字符进行转义,除数字字母之外,小于127使用16进制“\xHH”的方式进行编码,大于用unicode(非常严格模式). var JavaScrip ...
- 【XSS】延长 XSS 生命期
XSS 的本质仍是一段脚本.和其他文档元素一样,页面关了一切都销毁.除非能将脚本蔓延到页面以外的地方,那样才能获得更长的生命力. 庆幸的是,从 DOM 诞生的那一天起,就已为我们准备了这个特殊的功能, ...
- xss小结-从xss平台搭建到csp规则
0x00前言 xss是跨站脚本攻击,利用嵌入js代码达到‘控制’对方浏览器的作用,测试的时候我们是用alert(1)弹窗,而做CTF也好,实际中的漏洞利用也好一般是用xss获取管理员的cookie 0 ...
- XSS练习平台-XSS Challenges
XSS Challenges http://xss-quiz.int21h.jp/ XSS基础不好的建议优先查看 关于XSS中使用到的html编码 js编码各种场景用法 http://su.xmd ...
- DVWA之Stored XSS(存储型XSS)
目录 Low Medium High Impossible Low 源代码: <?php if( isset( $_POST[ 'btnSign' ] ) ) { // Get input $m ...
- (转) fuzzing XSS filter
//转自isno在wooyun知识库所写 题记:这是09年自己写的总结文章,之后多年也不搞这个了,技术显然是过时了,但我觉得思路还是有用的,算抛砖引玉吧,各位见笑 0x00 前言 这是一篇学习总结,首 ...
随机推荐
- Linux 内核 低级 sysfs 操作
kobject 是在 sysfs 虚拟文件系统之后的机制. 对每个在 sysfs 中发现的目录, 有一个 kobject 潜伏在内核某处. 每个感兴趣的 kobject 也输出一个或多个属性, 它出现 ...
- Maven 运行 tomcat:run 时出现 Unable to compile class for JSP...
近来无事便去看了看神奇的 Maven , 但写第一个 Hello,World 就非常不友好的怼给我一个 500, 很是郁闷; 开发环境: JDK1.8, Maven 3.5 项目目录: \maven_ ...
- CSS 高度居中方案
实现高度自适应并且上下居中 <div id="wrap"> <div class="box">DemoSeat</div> ...
- k8s生产环境部署
建议配置: 服务器 900G*2 SSD 安装操作系统 CPU 16核心*2 40G网卡*2 RAM 64G*8 操作系统建议:Centos7.4/Centos 7.6 不建议使用CentOS8 分布 ...
- 【Docker Compose】简介与安装
1.简介 Compose 是一个用户定义和运行多个容器的 Docker 应用程序.在 Compose 中你可以使用 YAML 文件来配置你的应用服务.然后,只需要一个简单的命令,就可以创建并启动你配置 ...
- hadoop fs、hadoop dfs与hdfs dfs命令的区别
Hadoop fs:使用面最广,可以操作任何文件系统. hadoop dfs与hdfs dfs:只能操作HDFS文件系统相关(包括与Local FS间的操作),前者已经Deprecated,一般使用后 ...
- DEVOPS技术实践_07:Jenkins 管道工作
一 简介 由于在公司构建很多工作,都是使用的maven工作构建的,这种构建方式很大缺点就是所有的工作都需要一步一步的配置,当项目较多,需求变动时,需要很大的精力去修改配置,很费劲 Pipeline即为 ...
- vc++简单的vector动态数组实现
#ifndef __MYVECTOR__ #define __MYVECTOR__ #include <Windows.h> #define SUCCESS 1 // 成功 #define ...
- 获取出口ip or api获取请求者ip
艾玛,这两天为了整这个ip 真的可谓无所不用其极. 在网上查阅了各种资料,其实我想实现的功能很简单 就像百度 直接看到自己的出口ip 奈何查了许多资料,都没有适合的解决办法. 灵机一动,我是不是可以访 ...
- C Primer Plus(二)
重读C Primer Plus ,查漏补缺 重读C Primer Plus,记录遗漏的.未掌握的.不清楚的知识点 分支和跳转 1.ctype.h头文件里包含了一些列用于字符判断的函数,包括判断数字.大 ...