【DVWA系列】——JavaScript——Medium详细教程
本文仅用于技术研究,禁止用于非法用途。
Author:枷锁
文章目录
- 一、JavaScript漏洞核心原理
- 二、各难度级别攻击手法对比
- 三、攻击流程
- 漏洞分析
- 漏洞利用步骤
- 方法一:使用开发者工具控制台
- 方法二:直接调用页面函数
- 自动化攻击脚本
- 防御建议
- 四、防御措施与最佳实践
- 五、漏洞危害与扩展风险
- 六、法律与道德声明
本文环境Security Level:Medium
以下是关于DVWA(Damn Vulnerable Web Application)中 JavaScript安全漏洞的详细介绍,结合漏洞原理、攻击案例和防御措施的系统性总结:
一、JavaScript漏洞核心原理
DVWA的JavaScript模块主要演示客户端逻辑缺陷导致的验证绕过问题,其核心漏洞表现为:
- 前端敏感逻辑暴露
- 关键验证逻辑(如Token生成)完全由前端JavaScript处理,例如Low级别直接硬编码
ROT13+MD5
加密规则。 - 攻击者可通过浏览器开发者工具查看源码,逆向生成合法Token。
- 关键验证逻辑(如Token生成)完全由前端JavaScript处理,例如Low级别直接硬编码
- 缺乏服务器端验证
- 即使输入正确短语(如"success"),后端未对Token进行二次校验,仅依赖前端生成的结果。
- 混淆代码的局限性
- High级别虽采用JS混淆技术增加分析难度,但通过反混淆工具(如deobfuscatejavascript.com)仍可破解逻辑。
二、各难度级别攻击手法对比
难度 | 漏洞特征 | 攻击方法 | 关键代码片段示例 |
---|---|---|---|
Low | 明文生成规则(ROT13+MD5) | 控制台调用generate_token() 生成合法Token | md5(rot13("success")) → 38581812b435... |
Medium | 逻辑分离到外部JS文件(字符串反转) | 调用do_elsesomething("XX") 拼接参数并反转字符串 | do_something("XXsuccessXX") → "XXsseccusXX" |
High | 混淆代码+SHA256多层加密 | 反混淆后按顺序执行token_part_1("ABCD",44) 和token_part_2("XX") | sha256(sha256("XXsseccus")+"ZZ") |
三、攻击流程
- 发现漏洞点
- 提交"success"后提示Token无效,通过浏览器控制台发现前端生成逻辑。
- 提交"success"后提示Token无效,通过浏览器控制台发现前端生成逻辑。
漏洞分析
Medium级别的JavaScript攻击机制已经改变:
-
vulnerabilities/javascript/source/medium.php:
$page[ 'body' ] .= '<script src="' . DVWA_WEB_PAGE_TO_ROOT . 'vulnerabilities/javascript/source/medium.js"></script>';
该文件只是引入了medium.js脚本
-
vulnerabilities/javascript/source/medium.js:
function do_something(e) {for(var t = "", n = e.length - 1; n >= 0; n--) t += e[n];return t } setTimeout(function() {do_elsesomething("XX") }, 300); function do_elsesomething(e) {document.getElementById("token").value = do_something(e + document.getElementById("phrase").value + "XX") }
关键点解析:
do_something(e)
函数将输入字符串反转- 页面加载300毫秒后执行
do_elsesomething("XX")
do_elsesomething(e)
函数:- 获取用户输入的短语
- 在短语前后添加"XX"(例如:用户输入"test" → “XXtestXX”)
- 使用
do_something
反转整个字符串(“XXtestXX” → “XXtsetXX”) - 将结果设为token值
漏洞利用步骤
方法一:使用开发者工具控制台
访问到目标页面,点击F12
打开控制台,输入以下脚本
// 1. 输入短语
document.getElementById("phrase").value = "success";// 2. 手动定义源函数(确保可用)
function do_something(e) {return e.split("").reverse().join("");
}// 3. 执行函数生成正确Token
const tokenValue = do_something("XX" + "success" + "XX");
document.getElementById("token").value = tokenValue;// 4. 提交表单
document.forms[0].submit();
方法二:直接调用页面函数
// 确保页面已加载超过300ms(即do_elsesomething已执行过)
// 设置短语
document.getElementById("phrase").value = "success";// 直接调用页面函数(必须等到原函数已定义)
do_elsesomething("XX");// 立即提交表单(防止token被后续操作覆盖)
document.forms[0].submit();
自动化攻击脚本
<!DOCTYPE html>
<html>
<head><title>DVWA JS Attack (Medium)</title>
</head>
<body><script>async function exploit() {// 目标URL(根据实际修改)const targetUrl = "http://localhost/dvwa/vulnerabilities/javascript/";// 获取页面内容const response = await fetch(targetUrl);const html = await response.text();// 提取token生成逻辑const scriptContent = html.match(/function do_something\(e\)\s*\{[^}]*}/)[0] + html.match(/function do_elsesomething\(e\)\s*\{[^}]*}/)[0];// 创建iframe执行目标页面代码const iframe = document.createElement('iframe');iframe.style.display = 'none';document.body.appendChild(iframe);// 构建iframe内容const iframeDoc = iframe.contentDocument;iframeDoc.write(html);// 确保函数加载const script = iframeDoc.createElement('script');script.textContent = scriptContent;iframeDoc.head.appendChild(script);// 等待函数执行setTimeout(() => {// 设置短语const phrase = "success";iframeDoc.getElementById("phrase").value = phrase;// 调用token生成函数iframe.contentWindow.do_elsesomething("XX");// 获取生成的tokenconst token = iframeDoc.getElementById("token").value;// 构建提交表单const form = document.createElement('form');form.method = 'POST';form.action = targetUrl;const phraseInput = document.createElement('input');phraseInput.name = 'phrase';phraseInput.value = phrase;const tokenInput = document.createElement('input');tokenInput.name = 'token';tokenInput.value = token;const submitInput = document.createElement('input');submitInput.type = 'submit';form.appendChild(phraseInput);form.appendChild(tokenInput);form.appendChild(submitInput);document.body.appendChild(form);form.submit();}, 500);}exploit();</script>
</body>
</html>
防御建议
-
服务器端验证:
session_start(); $validTokens = [];if ($_SERVER['REQUEST_METHOD'] === 'POST') {$phrase = $_POST['phrase'];$token = $_POST['token'];// 基于服务端存储的有效token验证if (in_array($token, $validTokens) && $token === hash('sha256', $_SESSION['secret'] . $phrase)) {echo "Success!";} else {echo "Invalid token!";} }
-
CSRF防护:
// 生成一次性CSRF令牌 $_SESSION['csrf_token'] = bin2hex(random_bytes(32));// 在表单中包含 <input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>">
-
避免敏感逻辑暴露:
- 不要将核心验证逻辑放在客户端JavaScript中
- 混淆或加密重要业务逻辑
- 使用HTTPS防止中间人攻击
这些方法展示了如何利用DVWA中的Medium级别JavaScript漏洞,同时强调了将关键验证逻辑放在服务器端的重要性。
四、防御措施与最佳实践
- 服务器端主导验证
- 所有敏感验证(如Token生成)应在后端完成,前端仅作为交互界面。
- PHP示例:
$secret = "server_side_key"; if ($_POST['token'] === hash('md5', str_rot13($secret))) {echo "验证通过"; }
- 禁用客户端敏感逻辑
- 避免在前端存储密钥或加密规则,采用API接口动态获取临时Token。
- 增强代码保护(辅助手段)
- 对必要的前端加密逻辑使用WebAssembly或强混淆工具(如JScrambler)。
五、漏洞危害与扩展风险
此类漏洞可能引发:
- 未授权操作:攻击者伪造验证通过状态,执行高权限功能(如密码重置)。
- 逻辑漏洞组合利用:结合CSRF或XSS,实现自动化攻击链。
- 供应链攻击:若混淆JS依赖第三方库,可能被注入恶意代码。
六、法律与道德声明
DVWA仅用于授权测试环境,实际渗透测试需遵守:
- 授权原则:仅测试自有系统或获得书面授权的目标。
- 数据保护:禁止访问或泄露非授权数据,发现漏洞后应及时报告。
引用来源:
- DVWA JavaScript模块Low级别分析
- CSDN博客-JavaScript攻击分类
- 混淆JS解密与High级别绕过
- Low级别Token生成逻辑
- 客户端验证缺陷的根本问题
- 反混淆与动态调试技术
- XSS与CSRF关联风险
- 渗透测试法律边界
宇宙级免责声明
🚨 重要声明:本文仅供合法授权下的安全研究与教育目的!🚨
1.合法授权:本文所述技术仅适用于已获得明确书面授权的目标或自己的靶场内系统。未经授权的渗透测试、漏洞扫描或暴力破解行为均属违法,可能导致法律后果(包括但不限于刑事指控、民事诉讼及巨额赔偿)。
2.道德约束:黑客精神的核心是建设而非破坏。请确保你的行为符合道德规范,仅用于提升系统安全性,而非恶意入侵、数据窃取或服务干扰。
3.风险自担:使用本文所述工具和技术时,你需自行承担所有风险。作者及发布平台不对任何滥用、误用或由此引发的法律问题负责。
4.合规性:确保你的测试符合当地及国际法律法规(如《计算机欺诈与滥用法案》(CFAA)、《通用数据保护条例》(GDPR)等)。必要时,咨询法律顾问。
5.最小影响原则:测试过程中应避免对目标系统造成破坏或服务中断。建议在非生产环境或沙箱环境中进行演练。
6.数据保护:不得访问、存储或泄露任何未授权的用户数据。如意外获取敏感信息,应立即报告相关方并删除。
7.免责范围:作者、平台及关联方明确拒绝承担因读者行为导致的任何直接、间接、附带或惩罚性损害责任。
🔐 安全研究的正确姿势:
✅ 先授权,再测试
✅ 只针对自己拥有或有权测试的系统
✅ 发现漏洞后,及时报告并协助修复
✅ 尊重隐私,不越界
⚠️ 警告:技术无善恶,人心有黑白。请明智选择你的道路。
希望这个教程对你有所帮助!记得负责任地进行安全测试。