用户
搜索

[思路/技术] XSS之UXSS

该用户从未签到

实习版主

Rank: 7Rank: 7Rank: 7

13

主题

57

帖子

322

魔法币
收听
16
粉丝
1
注册时间
2017-7-21
发表于 2019-9-5 10:23:38 21290
英语好的大神 可以去看原版



滥用Internet Explorer 8XSS过滤器摘要Internet Explorer 8实现了一种反跨站点脚本(XSS)机制来检测某些类型的XSS附件CKS。攻击者可以滥用此功能,以便在不受XSS影响的网站和网页上启用XSS。背景InternetExplorer8引入了一种新型的防御跨站点脚本(XSS)攻击的方法。其目的是在浏览器中构建过滤器,以检测和防止某些类型的恶意xss攻击。大多数基于过滤器的XSS方法是在Web应用程序内部的服务器端实现的,或者作为Web应用程序防火墙的一部分实现的。这使得微软的方法有些新颖,但其他浏览器供应商已经开始效仿。尽管这些过滤器不能抵御所有类型的xss攻击,也不能试图抵御这些攻击,但它们确实试图通过使某些常见的攻击场景不可利用来提高潜在攻击者的攻击门槛。过滤器通过扫描出站请求以查找潜在的恶意字符串来工作。当检测到这样的字符串时,ie8将动态生成与出站字符串匹配的正则表达式。然后,浏览器在服务器的响应中查找相同的模式。如果在服务器响应中的任何位置进行匹配,则浏览器假定正在执行反射的XSS攻击,并且浏览器将自动更改响应,以使XSS攻击不成功。用于更改服务器响应的确切方法是防止xss攻击的关键组件。如果攻击没有被正确地压制,那么恶意脚本仍可能执行。另一方面,不意外地检测到良性请求也是至关重要的。InternetExplorer8团队决定使用“中性化”技术来消除检测到的攻击。更具体地说,当过滤器与服务器的响应进行正匹配时,响应的恶意部分将修改某个字符(或多个字符),使攻击无法执行(或无法正确呈现)。例如,如果在传出请求的get参数中检测到字符串,然后在响应主体中再次检测到该字符串,则会触发中性机制,并且该字符串的所有出现都将更改为警报(0)。因此不会执行注入的脚本。在大多数检测到恶意注入的情况下,Internet Explorer 8将通过用字符替换某些字符来更改响应的恶意部分。下表显示了用于检测恶意攻击的每个筛选器。突出显示将被阉割的字符,即在检测到攻击时更改为符号。
•(v|(&[#()=]x?0*((86)|(56)|(118)|(76));?))([\t]|(&[#()=]x?0*(9|(13)|(10)|A|D);?))*(b|(&[#()=]x?0*((66)|(42)|(98)|(62));?))([\t]|(&[#()=]x?0*(9|(13)|(10)|A|D);?))*(s|(&[#()=]x?0*((83)|(53)|(115)|(73));?))([\t]|(&[#()=]x?0*(9|(13)|(10)|A|D);?))*(c|(&[#()=]x?0*((67)|(43)|(99)|(63));?))([\t]|(&[#()=]x?0*(9|(13)|(10)|A|D);?))*{(r|(&[#()=]x?0*((82)|(52)|(114)|(72));?))}([\t]|(&[#()=]x?0*(9|(13)|(10)|A|D);?))*(i|(&[#()=]x?0*((73)|(49)|(105)|(69));?))([\t]|(&[#()=]x?0*(9|(13)|(10)|A|D);?))*(p|(&[#()=]x?0*((80)|(50)|(112)|(70));?))([\t]|(&[#()=]x?0*(9|(13)|(10)|A|D);?))*(t|(&[#()=]x?0*((84)|(54)|(116)|(74));?))([\t]|(&[#()=]x?0*(9|(13)|(10)|A|D);?))*(:|(&[#()=]x?0*((58)|(3A));?)).
• (j|(&[#()=]x?0*((74)|(4A)|(106)|(6A));?))([\t]|(&[#()=]x?0*(9|(13)|(10)|A|D);?))*(a|(&[#()=]x?0*((65)|(41)|(97)|(61));?))([\t]|(&[#()=]x?0*(9|(13)|(10)|A|D);?))*(v|(&[#()=]x?0*((86)|(56)|(118)|(76));?))([\t]|(&[#()=]x?0*(9|(13)|(10)|A|D);?))*(a|(&[#()=]x?0*((65)|(41)|(97)|(61));?))([\t]|(&[#()=]x?0*(9|(13)|(10)|A|D);?))*(s|(&[#()=]x?0*((83)|(53)|(115)|(73));?))([\t]|(&[#()=]x?0*(9|(13)|(10)|A|D);?))*(c|(&[#()=]x?0*((67)|(43)|(99)|(63));?))([\t]|(&[#()=]x?0*(9|(13)|(10)|A|D);?))*{(r|(&[#()=]x?0*((82)|(52)|(114)|(72));?))}([\t]|(&[#()=]x?0*(9|(13)|(10)|A|D);?))*(i|(&[#()=]x?0*((73)|(49)|(105)|(69));?))([\t]|(&[#()=]x?0*(9|(13)|(10)|A|D);?))*(p|(&[#()=]x?0*((80)|(50)|(112)|(70));?))([\t]|(&[#()=]x?0*(9|(13)|(10)|A|D);?))*(t|(&[#()=]x?0*((84)|(54)|(116)|(74));?))([\t]|(&[#()=]x?0*(9|(13)|(10)|A|D);?))*(:|(&[#()=]x?0*((58)|(3A));?)). •.*?((@[i\\])|(([:=]|(&[#()=]x?0*((58)|(3A)|(61)|(3D));?)).*?([(\\]|(&[#()=]x?0*((40)|(28)|(92)|(5C));?))))
• [ /+\t\"\'`]st{y}le[/+\t]*?=.*?([:=]|(&[#()=]x?0*((58)|(3A)|(61)|(3D));?)).*?([(\\]|(&[#()=]x?0*((40)|(28)|(92)|(5C));?)) •
有关过滤器及其工作方式的详细信息,请访问
http://blogs.msdn.com/ie/archive/2008/07/02/ie8-security-part-iv-the-xss-filter.aspx
http://blogs.msdn.com/dross/archive/2008/07/03/ie8-xss-filter-design-philosm-indepth.aspx
http://blogs.technet.com/srd/archive/2008/08/19/ie-8-xss-filter-architectureemplementation.aspx
简单的虐待案
在大多数情况下,这种中性化机制在阻止某些类型的XSS方面是有效的。
发生的攻击。但是,在服务器的响应由
浏览器可能会产生意想不到的后果。
首先,攻击者可以滥用绝育机制来阻止良性
页面上的内容。例如,可以通过
“伪造”XSS攻击。这是可能的,因为字符串<脚本将触发
过滤器,如果存在于请求和响应中。此字符串自然出现在大多数
网页,因此如果攻击者附加了一个伪get参数,如&foo=<script,则
Internet Explorer 8将在出站请求和响应正文中看到这一点,因此
启动绝育机制。攻击者可以利用此行为来防止
客户端安全功能无法正常工作。例如,防止框架的代码
(与点击劫持和用户界面修正攻击相关)可以被禁用(尽管有可能
以更直接的方式绕过这种控制)。
阻止嵌入在页面上的良性javascript的另一个有趣的结果是
浏览器将不正确地将javascript代码本身解释为HTML。最多
在某些情况下,这不是一个问题,但在某些情况下可能会导致XSS
可能的。例如,考虑一个持久包含用户控制的网页
javascript字符串中的内容,同时去掉单引号、双引号和转发
斜线字符(但不过滤尖括号)。然后攻击者可以注入
字符串<img src=x:x onerror=alert0>。通常,这不会是一个可利用的
场景,因为注入的字符串无法从封装的javascript字符串转义
引用。但是,强制中性化打开的脚本标记将强制脚本块
解析为HTML,允许注入的字符串执行警报。
尽管在“野外”观察到了这样的情况,但是
在持久的XSS中运行到无法通过更多
传统手段。但是,关于过滤器的一些重要事实可以在
这一点。
1。攻击者可以滥用过滤机制来更改页面的呈现方式。
2。过滤器可能会被滥用以在其他情况下启用xss
可能。
通用XSS
有了这些知识,有必要再看看所有xss过滤器,看看是否有
其他的过滤器可能会被这样滥用。人们很快就会注意到
大多数过滤器最终都会删除打开的标记名或事件处理程序,以便
普通字母字符被符号替换。但是要注意的是
滤波器实际上使等号中性化。有没有改变一个相等的
签名会影响页面的呈现方式?当然可以!
假设攻击者能够持续地将内容注入到网页上引用的属性中。
大多数网站都允许这种或那种形式的攻击,并且不受传统xss攻击的影响。
因为它们过滤掉和/或编码某些字符,如引号字符和角度
括号。如果攻击者要在这样一个持久的
注入,则可以将注入的属性值呈现为
属性值,但作为新的属性名-值对。
例如,考虑向图像标记的alt属性注入:<img
alt=[[injection here]]src=x.png>。假设字符串xonload=alert0x
注入。现在考虑以下两种变体,它们只因一个字符而不同:
<img alt=x onload=alert0xsrc=x.png>不会执行警报。
<img altx onload=alert0xsrc=x.png>将执行警报!(假设
找到图像。)
在本例中,注入中包含一个空格字符(%20),用于分隔
onload=注入的警报(0)部分。这使得它可以被解释为一个单独的
属性名-值对。请注意,其他字符也可以使用,例如新行
字符和正斜杠(/)。这种情况最重要的是
大多数网站允许将这些字符包含在属性中,因为它们不构成风险
当考虑到传统的xss攻击时。
要使这种技术发挥作用,攻击者必须首先触发绝育,以便
=字符可以替换为字符,如上所述。这可以通过
识别在
持续注射。然后攻击者可以简单地将一个伪get参数作为一部分
其值为该触发器字符串(或一个简化的可能是url)的页请求的-
仍然会触发中性化的编码版本)并提交请求。
这两个过滤器都可用于中性化等号:
• [\"\'][ ]*(([^a-z0-9~_:\'\" ])|(in)).*?(((l|(\\u006C))(o|(\\u006F))(c|(\\u0063))(a|(\\u0061))(t|(\\u0074))(i|(\\u0069))(o|(\\u006F))(n|(\\u006E)))|((n|(\\u006E))(a|(\\u0061))(m |(\\u006D))(e|(\\u0065)))).*?{=}
•[\"\'][ ]*(([^a-z0-9~_:\'\" ])|(in)).+?(([.].+?)|([\[].*?[\]].*?)){=}
识别合适的触发字符串(即与这些筛选器之一匹配的字符串)需要
对这些正则表达式的详细理解。在我们的现场测试中,
通过识别与
对着第二个过滤器。要了解原因,请考虑第二个
正则表达式:
1. [\"\'][ ]*
2. (([^a-z0-9~_:\'\" ])|(in))
3. .+?
4. (([.].+?)|([\[].*?[\]].*?))
5. {=}
正则表达式的第一部分匹配后跟任意
空格字符数(不包括空格字符)。
第二部分将与单词“in”或任何不是下列字符之一的字符匹配:
字母数字、引号字符、~\、:、或空格。所以像<>、(、和)这样的字符将
每场比赛(还有更多)。
第三部分将匹配任何重复多次的字符(这是
重要)。这场比赛不是贪得无厌的。
第四部分有两个可以匹配的组件。第一部分对
标识触发器字符串并将与匹配。(a句点,%2e)后跟
字符重复任何次数(同样,非贪婪)。
第五部分将与我们正在阉割的等号相匹配。
把这些放在一起,我们可以识别出几种常见的字符串类型
触发字符串。例如,“>等等等等。呜呜呜呜<a
在大多数页面上都可以找到
有合适的持续注射。关键部分是它以一个报价开头
字符,包括以某种方式由字母字符包围的句点,然后结束
以阉割为目标的等号。
但在最坏的情况下,网页将不包含任何与之匹配的文本
上面的过滤器。如果有第二次注入,这样的页面仍然可以被利用
在页面上的某个位置指向持久化的页面。这似乎不太可能
然而,在实践中,这种情况是相当普遍的。有几个原因
为了这个。首先,第二个注入点不需要持续。第二,第二
注入点可以是页面上持久注入之前的任何位置,也可以是
上下文。第三,也是最重要的,任何传统的xss过滤/编码都是无用的。
因为需要注入的只是一个看起来像字符串的“良性”位置或foo.bar
因为这样的字符串将提供识别合适触发器所需的必要字符
目标页上的字符串。
因此,综合起来,我们有两个常见的场景,允许攻击者
在其他安全页上执行xss
1)持续注入带引号的属性,字符串类似于x
onerror=alert0x,位于还包含(自然发生的)触发器的页上
持续注入前的字符串。
2)对引用属性的持久注入,字符串类似于“x
OnError=警报(0x“,位于同时显示用户控制数据(反射或
持续)在持续注射之前。
演示
请考虑以下位于http://x.lv/attr.phputlra简化网页
包含以下HTML:
<form method="GET"action="attr.php">
<input name="name"value="test" type="text">
<input type=submit>
</form>
窗体顶端



页面包含一个简单的表单,允许提交任意数据。服务器将
将提交的数据持久化并在页面的后续视图上重新显示,直到新的
提交已提交。双引号字符编码防止了传统的xs
攻击。通过以下步骤,可以在未修补的IE8版本中利用此页:
1。导航到位于http://x.lv/attr.php的易受攻击页面。
2。在输入框中,输入此字符串x
style=x:expressiondocument.writealert0)))x,然后单击Submit
三。再次导航到http://x.lv/attr.php并验证字符串是否被持久化。
4。标识适当的触发器字符串。在本例中,“attr.php><input
name=namevalue=就足够了。
5。导航到http://x.lv/attr.phpfoo=attr.php><input+name=name+value=
foo是不存在的get变量)警报将触发。
在步骤2中,以下字符串还可以作为持久注入使用:
• /style=x:expression(document.write(alert(0)))//
• /onmouseover=alert(0)//
• x onmouseover=location=name x
• xonmouseover=eval(location.hash.slice(1)) x
范围
哪些网站容易受到此问题的攻击?好吧,差不多我们每个人
已测试。例如:
•google.com:ie8过滤器在我们获得屏幕抓取之前被禁用
•wikipedia.org:(允许
匿名编辑也易受攻击)
•几乎每个bbcode论坛/博客
•基于网络的电子邮件服务
•digg.com:
•twitter.com:(以及大多数让您
创建配置文件)
•还有更多……
减轻
如何减轻这种脆弱性?有几种不同的技术可以
用于防止此类XSS攻击。
从服务器端,可以通过以下方式保护用户:
•过滤所有用户生成的内容,以便即使以不同的方式解释
上下文,它无法执行。
•利用站点范围内的反CSRF令牌,防止在
第一名。
•使用响应头退出机制禁用IE8S筛选器。很明显
这样做的利弊,所以仔细考虑你的选择。尽管很严重
在本文中讨论的漏洞中,过滤器在保护
来自传统XSS攻击的IE8用户。显然,一旦用户升级到
补丁版本我们强烈建议您保持过滤器启用。
在浏览器端,您可以通过以下方式避免任何安全风险:
•停止使用互联网:)
•从浏览器中禁用过滤器,直到升级到补丁版本
IE8。同样,这些过滤器并不邪恶——它们确实有助于阻止许多标准XSS攻击。
一旦应用了必要的补丁,我们强烈建议启用过滤器
再一次。
杰里迈亚·格罗斯曼提供了一些优秀的信息,在决定
是否从服务器禁用筛选器。基本上,如果你不相信
您已经消除了整个域中的xs,然后禁用过滤器是
方向不对。他的具体指导见
http://jeremiahgrossman.blogspot.com/2010/01/to-disable-ie8s-xss-filter-or-not.html。
我们的理解是,微软正在考虑支持
允许对中性化机制进行更细粒度控制的响应头。
例如,在未来的Internet Explorer版本中,可以指定
页眉使整个网页被阻止,而不是执行选择性阉割。
这对于允许网站所有者管理过滤器的行为非常有用,以便
以匹配对其应用程序和域构成的风险。
确认
我们要感谢加雷斯·海耶斯、马里奥·海德里奇、亚历克斯·K(库扎55)和
sla.ckers.org社区,提供许多关于网络混淆和规避的优秀想法。我们
还要感谢Jack Ramsdell(MSRC)以及David Ross和IE8
开发团队在解决这个问题上的合作非常出色。
欲了解更多信息,请使用联系信息联系Eduardo和/或David
上面。窗体底端


村长CZ 管理员 有事找村长QQ:780876774 i春秋认证 幽默灌水王 春秋文阁 春秋达人 春秋巡逻 春秋游侠 积极活跃奖 核心白帽
沙发
发表于 2019-9-5 14:42:54
让我们一起干大事!
村里现在正在招聘:村委宣传队!
有兴趣的表哥加村长QQ:780876774!
使用道具 举报 回复
发表于 2019-9-5 20:42:03
有一天他会突然觉得累了甚至忘了初衷 放弃了梦想也许因为年纪的关系奔波于现实 然后拉黑了网络认识的所有人或者说不用了一个号码换了一个QQ 那么记得他叫大叔 这个网络他曾来过
使用道具 举报 回复
发新帖
您需要登录后才可以回帖 登录 | 立即注册