DVWA Brute ForceCommand Injection CSRF Insecure CAPTCHA Weak Session IDs CSP Bypass JavaScript 全讲解
ps:sql xss 文件包含上传部分之前已经单独发 需要另取
一、Brute Force(暴力破解)
Low 级
-
源码逻辑:没有任何防护,直接接收用户名密码查询数据库。
-
攻击流程:
- 浏览器打开 DVWA Brute Force 页面,输入任意账号密码,提交。
- Burp Suite 开启拦截,抓到 GET /vulnerabilities/brute/?username=admin&password=123&Login=Login。
- 右键 Send to Intruder,Clear §,选中 password 值添加§。
- Payloads 加载字典,Start Attack。
- 根据响应长度差异找出正确密码。
-
防御思维:应限制单位时间内登录尝试次数,加入验证码,或锁定账户。
Medium 级
- 源码逻辑:登录失败后 sleep(2) 延迟响应。
- 攻击流程:使用相同爆破方法,只是速度变慢,依然可破。
- 防御缺陷:只增加时间成本,未限制尝试次数。
High 级
-
源码逻辑:加入 Anti-CSRF token,每次登录页面生成一个随机 token,表单提交时需带上,否则拒绝。
-
攻击流程(Burp Macro 自动获取 token):
- Burp 抓到登录请求,发现参数 user_token。
- Project options → Sessions → Macros → Add,录制获取登录页面(GET 请求)的宏。
- 在宏中提取响应里的 user_token 值(使用正则:name='user_token' value='(.+?)')。
- 设置 Session Handling Rule,让每次 Intruder 请求前先执行宏,将提取的 token 替换到请求中。
- 再启动爆破,每次自动携带最新 token。
-
防御缺陷:token 可被工具自动获取,防御强度依赖于 token 的不可预测性和一次性。可结合验证码或账户锁定。
Impossible 级
- 防御逻辑:账户锁定机制(3次失败锁定15分钟)+ 强密码策略 + Anti-CSRF token。
- 攻击者视角:无法暴力破解,只能尝试社会工程学或密码喷洒(用极常见密码,不触发锁定)。
- 正确防御:限制登录频率、账户锁定、多因素认证。
二、Command Injection(命令注入)
Low 级
-
源码:shell_exec('ping ' . $target);
-
攻击流程:
- 输入框填 127.0.0.1 & whoami,直接执行额外命令。
- Windows 可尝试 127.0.0.1 && net user。
-
防御思维:避免调用系统命令,必须使用时对参数进行严格白名单校验。
Medium 级
-
源码逻辑:str_replace(array('&', ';'), '', $target),只过滤 & 和 ;。
-
攻击流程:
- 输入 127.0.0.1 | whoami,管道符未被过滤,命令执行。
- 或 127.0.0.1 || whoami。
-
绕过思维:黑名单总有遗漏,攻击者会尝试所有可能的命令连接符(|, ||, &&, %0a 等)。
High 级
-
源码逻辑:更复杂的正则,过滤 |, &, ;, (空格)等。
-
攻击流程:
- 尝试换行符注入:127.0.0.1%0awhoami(需要手动修改请求,Burp 中 URL-encoded 后发送)。
- 或使用 $(whoami) 命令替换(Linux)。
- 通过编码绕过:空格用 ${IFS} 或 < 重定向等。
-
防御缺陷:黑名单正则几乎不可能覆盖所有可能,必须使用白名单。
Impossible 级
- 防御:IP 地址白名单验证(filter_var 检查是否为合法 IP),并使用 escapeshellarg 转义参数。
- 攻击者视角:无注入点,只能通过其他漏洞获取命令执行。
三、CSRF(跨站请求伪造)
Low 级
-
源码逻辑:修改密码接口直接接收 password_new、password_conf,无任何校验。
-
攻击流程:
-
攻击者制作一个页面,包含自动提交的表单:
<form action="http://dvwa/vulnerabilities/csrf/" method="GET"> <input type="hidden" name="password_new" value="hack"> <input type="hidden" name="password_conf" value="hack"> <input type="hidden" name="Change" value="Change"> </form> <script>document.forms[0].submit();</script> -
诱导受害者访问该页面,其浏览器会携带 DVWA 的 Cookie 自动提交,密码被改为 hack。
-
-
防御思维:任何敏感操作必须加入攻击者无法预知的 token。
Medium 级
-
源码逻辑:检查 HTTP_REFERER 头,确保请求来自本域名。
-
攻击流程(隐藏 Referer):
- 使用 <meta name="referrer" content="no-referrer"> 构造攻击页面,这样浏览器不会发送 Referer 头。
- 有些环境直接不发送 Referer,即可绕过。
- 或利用 data: URI 发起请求(部分浏览器不发送 Referer)。
-
防御缺陷:Referer 头可由浏览器策略控制,不是可信防御手段。
High 级
-
源码逻辑:生成 Anti-CSRF token 存在 session,表单提交时验证。
-
攻击流程:
- 如果没有 XSS,无法直接获取 token,CSRF 基本不可行。
- 但若网站存在反射型 XSS,可编写 JS 自动获取页面 token 并发起修改密码请求(XSRF 结合)。
-
防御评价:token 是最基础的防御,但需确保不泄露,并设置 SameSite Cookie。
Impossible 级
- 防御:要求输入 当前密码 才能修改,token 单次有效。
- 攻击者视角:不知道原密码,无法伪造请求。
- 正确防御:关键操作必须验证用户凭证(二次认证)。
四、Insecure CAPTCHA(不安全的验证码)
Low 级
-
源码逻辑:密码修改分两步,第一步输入密码,第二步显示验证码页面,但后端不校验验证码,可直接跳过第二步。
-
攻击流程:
- Burp 抓取正常修改密码的第一步请求。
- 分析参数,发现可以直接提交 step=2&password_new=abc&password_conf=abc&Change=Change。
- 跳过验证码步骤,直接修改密码。
-
防御思维:验证码的验证必须与核心操作原子绑定。
Medium 级
-
源码逻辑:验证了 g-recaptcha-response 参数是否存在,但未向 Google reCAPTCHA 服务器验证其有效性。
-
攻击流程:
- 伪造请求,添加 g-recaptcha-response=1 即可绕过。
-
防御缺陷:验证形同虚设。
High 级
-
源码逻辑:向 Google reCAPTCHA API 真实验证,但验证成功后只设置 $_SESSION['captcha'] 为 true,后续修改密码时只检查这个 session 标记。
-
攻击流程:
- 攻击者在自己的浏览器中正常完成一次验证码验证,使自己的 session 中标记为已验证。
- 然后利用 CSRF 漏洞,诱导受害者在同一个浏览器(共享 session)下点击攻击链接。
- 由于 session 已验证,密码修改成功。
-
防御缺陷:验证未与具体请求绑定,可被复用。
Impossible 级
- 防御:验证码验证结果以一次性 token 形式绑定到修改密码的请求,用后即失效,且需要原密码。
- 正确方案:状态机设计严谨,每次敏感操作都独立验证。
五、Weak Session IDs(弱会话 ID)
Low 级
-
源码逻辑:Session ID 可能是自增数字或简单时间戳。
-
攻击流程:
- 用浏览器查看自己的 Cookie,PHPSESSID=100。
- 推测其他用户的 ID 可能是 99、101 等。
- 修改 Cookie 为 101,刷新页面即可劫持他人会话。
-
防御思维:会话 ID 必须高熵、不可预测。
Medium 级
- 源码:md5(time()) 生成 Session ID。
- 攻击流程:获取服务器时间(可通过 HTTP Date 头),在一个小时间窗口内计算可能的 MD5 值,暴力枚举。
High 级
- 源码:md5(uniqid(rand(), true)),熵增加,但 uniqid 基于微秒和服务器时间,rand() 可能可预测。
- 攻击可行性:理论可预测,实践难度大。
Impossible 级
- 防御:使用 PHP 原生 session_start() 生成的真随机 ID,且设置 HttpOnly, Secure, SameSite 属性。
- 正确方案:使用框架提供的强加密随机数生成器。
-
六、JavaScript Attacks(JavaScript 攻击)
核心思路:前端通过 JS 生成 token 并与 phrase 绑定,提交时验证 token。攻击者需绕过 token 校验,通过浏览器控制台手动执行 JS 函数重新生成匹配的 token。
Low 级
源码审计
前端直接包含生成 token 的 JS 代码:- 页面加载时,调用 generate_token() 基于默认 phrase 生成 token。
- 用户提交时,后端会对比 token 和 phrase 是否匹配(实际检测在服务端,但 token 生成逻辑全在客户端)。
攻击流程
- 在输入框直接提交 success,抓包发现返回 “Invalid token”。
- 因为修改了 phrase,token 还是原来默认 phrase 生成的,所以不匹配。
- 浏览器 F12 → Console,输入 generate_token() 并执行。
- 函数会根据当前输入框中的 phrase(即 success)重新计算 token 并更新到隐藏字段。
- 再次提交,成功。
- 若 Console 执行后仍失败,可手动抓包修改 token 值为执行函数后的值。
Medium 级
源码审计
JS 代码被抽出到单独文件,且经过压缩。核心逻辑:- do_something(e) 函数:字符串反转。
- do_elsesomething(e) 函数:将传入参数 + phrase + "XX" 拼接,反转后设置为 token。
- 页面加载 300ms 后执行 do_elsesomething("XX")。
攻击流程
- 提交 success,token 错误。
- 抓包查看当前 token,为 "XXsuccessXX" 的反转。
- 打开 F12 Console,手动输入 do_elsesomething("XX") 执行。
- 函数重新生成与 success 匹配的 token。
- 提交即可通过。
High 级
源码审计
JS 经过高度混淆,需反混淆后得到逻辑:-
do_something(e):字符串反转。
-
token_part_1(a, b):将 phrase 反转后赋给 token。
-
token_part_2(e = "YY"):将 e + 当前 token 值做 sha256 后赋给 token。
-
token_part_3(t, y = "ZZ"):将当前 token 值 + y 做 sha256 后赋给 token。
-
执行顺序:
- 立即执行 token_part_1("ABCD", 44) → token = 反转(phrase)
- 300ms 后执行 token_part_2("XX") → token = sha256("XX" + token)
- 点击提交时触发 token_part_3() → token = sha256(token + "ZZ")
攻击流程
-
输入 success,直接点击提交肯定失败。
-
在控制台按顺序手动执行:
javascripttoken_part_1("ABCD", 44); token_part_2("XX");这会在后台生成正确的 token 值。
-
再点击提交按钮(此时会触发 token_part_3()),最终生成的 token 与服务端校验逻辑一致,通过。
Impossible 级
官方说明:无法做到 Impossible,因为任何发送给用户的客户端代码都可被操纵或绕过。因此本模块没有 Impossible 等级,永远不要信任客户端验证。
七、CSP Bypass(内容安全策略绕过)
核心思路:利用 CSP 头允许的脚本来源,将恶意 JavaScript 放在被信任的源上,通过 <script> 标签加载执行。
Low 级
CSP 策略
php
$headerCSP = "Content-Security-Policy: script-src 'self' https://pastebin.com hastebin.com www.toptal.com example.com code.jquery.com https://ssl.google-analytics.com ;";允许从 self 及 pastebin.com、hastebin.com 等外部源加载脚本。
源码逻辑
用户提交 include 参数后,页面直接插入:html
<script src="用户输入URL"></script>攻击姿势
- 找一个 CSP 允许的外部站点,如 pastebin.com,新建一个 paste,内容为 alert(1)。
- 点击 raw 获取纯文本 JS 文件地址。
- 复制该地址,在输入框中提交。
- 页面生成 <script src="https://pastebin.com/raw/xxxxx"></script>,CSP 放行,弹窗成功。
Medium 级
CSP 策略
php
$headerCSP = "Content-Security-Policy: script-src 'self' 'unsafe-inline' 'nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=';";使用固定 nonce 值,仅允许带此 nonce 的内联脚本执行。
源码逻辑
用户输入直接作为 HTML 插入到页面中(echo $_POST['include'])。攻击姿势
构造如下 payload:html
<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert('xss')</script>输入后,因带有正确的 nonce,浏览器会执行该内联脚本,弹窗成功。
(nonce 值也可从 HTTP 响应头的 CSP 中直接复制)High 级
CSP 策略
php
$headerCSP = "Content-Security-Policy: script-src 'self';";仅允许同源脚本。
源码逻辑
页面包含一个按钮,点击时动态创建 <script src="source/jsonp.php?callback=solveSum">。
JSONP 接口 /vulnerabilities/csp/source/jsonp.php 会根据 callback 参数返回对应的函数调用。攻击姿势
由于 callback 参数完全可控,可以构造:text
<script src="source/jsonp.php?callback=alert('xss')"></script>提交该 payload 后,浏览器加载同源脚本,返回 alert('xss')({}),触发弹窗。
绕过点:CSP 信任同源脚本,但同源下存在未过滤回调的 JSONP 接口。Impossible 级
CSP 策略
仍为 script-src 'self',但 JSONP 接口不再接受 callback 参数,改为固定函数名 solveSum。
impossible.js 中硬编码了 s.src = "source/jsonp_impossible.php";,不接收任何用户可控参数。防御效果
无法通过构造回调来执行任意代码,CSP 与接口均安全。完美防御。
总结:攻击与防御思维全景图
| 攻击阶段 | 攻击者行为 | 防御者策略 |
|---|---|---|
| 信息收集 | 目录扫描、报错探测、源码泄露 | 关闭错误回显,移除调试信息 |
| 输入探测 | 提交特殊字符、超长数据、编码绕过 | 白名单验证、类型强制、正则限制 |
| 漏洞利用 | SQL注入、XSS、文件包含等 | 参数化查询、输出编码、白名单包含 |
| 提权/扩大 | 上传 Webshell、横向移动 | 最小权限、应用隔离、WAF |
| 持久化 | 定时任务、后门文件 | 文件完整性监控、日志审计 |
核心三原则:
- 永不信任用户输入
- 数据与代码分离(参数化、输出编码)
- 纵深防御(多层防护叠加,CSP+Token+加密+审计)
更多推荐
所有评论(0)