第7章 第77-78课
DVWA代码审计实战:从漏洞挖掘到安全加固
今天带你们用DVWA这个"漏洞博物馆"进行实战审计,就像在校园网系统里做安全体检 ( •̀ ω •́ )✧
DVWA项目简介
想象学校有个故意留后门的教务系统:
- 基于PHP/MySQL搭建(和80%的校园系统相同架构)
- 包含十大常见漏洞,安全级别可调
- 从"新生模式"到"黑客地狱"逐步升级
# 宿舍快速搭建(Docker版)
docker run -d -p 8080:80 vulnerables/web-dvwa
# 访问 http://localhost:8080 账号admin/password
审计环境搭建避坑指南
Win11实测踩坑记录:
- PHP版本锁定5.4-7.4(DVWA不兼容PHP8)
- 配置文件关键修改:
// dvwa/config/config.inc.php
$_DVWA['db_password'] = 'p@ssw0rd'; // 一定要改默认密码!
error_reporting(E_ALL);// 打开错误显示
ini_set('display_errors', 1); // 审计必备
- 文件权限修复:
chmod 755 hackable/uploads/ # 否则文件上传失败
八大漏洞审计实战
1. 暴力破解(社团管理系统案例)
漏洞代码:
// login.php
if(isset($_POST['Login'])) {
$user = $_POST['username'];
$pass = $_POST['password'];
$query = "SELECT * FROM users WHERE user='$user' AND password='$pass'";
// 无验证码/失败锁定 → 可暴力破解
}
修复方案:
session_start();
if ($_SESSION['login_fail'] > 5) die("请5分钟后再试"); // 失败锁定
2. 命令注入(成绩查询系统)
漏洞代码:
// ping功能(网络检测模块)
$target = $_REQUEST['ip'];
system("ping -c 4 " . $target); // 直接拼接命令
// 输入:127.0.0.1; cat /etc/passwd → 泄露系统信息
安全写法:
$target = escapeshellarg($_REQUEST['ip']); // 参数转义
3. CSRF(奖学金申请篡改)
攻击场景:
<!-- 恶意页面 -->
<img src="http://dvwa/vul/csrf.php?password_new=hack&password_conf=hack" />
<!-- 用户访问即修改密码 -->
防御方案:
// 添加CSRF Token
$_SESSION['token'] = bin2hex(random_bytes(32));
// 表单中增加
<input type="hidden" name="token" value="<?=$_SESSION['token']?>">
4. 文件包含(课表泄露漏洞)
漏洞代码:
$file = $_GET['page'];
include($file . ".php"); // 未过滤路径
// 输入:?page=../../../../etc/passwd%00 → 读取敏感文件
修复方案:
$allowed = ['home', 'about'];
if (!in_array($file, $allowed)) die("非法访问!"); // 白名单控制
5. 文件上传(社团网站后门)
漏洞代码:
// upload.php
$name = $_FILES['file']['name'];
move_uploaded_file($_FILES['file']['tmp_name'], $name);
// 上传.php文件 → 获取服务器控制权
安全措施:
$ext = pathinfo($name, PATHINFO_EXTENSION);
if ($ext !== 'jpg') die("仅支持JPG"); // 扩展名检查
// 更推荐:文件重命名 $new_name = md5_file().'.jpg';
6. SQL注入(选课系统案例)
漏洞代码:
$id = $_GET['id'];
$query = "SELECT * FROM courses WHERE id = $id";
// 输入:1 UNION SELECT user,password FROM users → 拖库
参数化查询:
$stmt = $pdo->prepare("SELECT * FROM courses WHERE id = :id");
$stmt->execute(['id' => $id]);
7. 盲注(成绩查询延时攻击)
漏洞特征:
$id = $_GET['id'];
$query = "SELECT * FROM users WHERE id = '$id'";
// 无错误回显 → 通过延时判断
// 输入:' AND IF(ASCII(SUBSTR(database(),1,1))>100,SLEEP(5),0) --
防御统一:参数化查询+错误抑制(ini_set('display_errors', 0))
8. XSS漏洞(校园公告板攻击)
存储型XSS:
// 留言保存
$message = $_POST['msg'];
$query = "INSERT INTO messages VALUES ('$message')";
// 前端直接输出 → 植入<script>盗取Cookie
反射型XSS:
echo "搜索关键词:" . $_GET['q']; // 未过滤直接输出
净化输出:
echo "搜索关键词:" . htmlspecialchars($_GET['q'], ENT_QUOTES);
审计技巧进阶
- 数据流追踪法:
- 从
$_GET/$_POST出发 → 跟踪到SQL/系统命令执行点
- 危险函数清单:
system(), exec(), eval(), preg_replace("/e"), include(), unlink()...
- 二次漏洞挖掘:
- 先过滤后使用的场景(如:
htmlspecialchars转义后存入DB,取出时直接使用)
防御体系搭建
校园系统开发必做:
# Nginx安全配置
add_header X-Content-Type-Options "nosniff"; # 防MIME嗅探
add_header Content-Security-Policy "default-src 'self'"; # 防XSS
// PHP全局防护
set_exception_handler() // 自定义错误页(避免泄露路径)
ini_set('session.cookie_httponly', 1) // Cookie防窃取
实战路线图
建议按难度逐步攻克:
graph LR
A[暴力破解] --> B[文件上传]
B --> C[SQL注入]
C --> D[XSS/CSRF]
D --> E[命令注入]
重要原则:
- 所有测试务必在本地环境进行
- 真实系统漏洞需提交学校信息中心(别当黑客!)
代码审计就像解数学题,看到$_GET要条件反射想过滤。下期带大家审计真实校园系统源码,记得三连支持 (๑•̀ㅂ•́)و✧
感谢浏览和学习,作者:鱼油YOU,转载请注明原文链接:https://www.cnblogs.com/OmegaYOU3/p/19024362,或者可以➕主播WX:OmegaAnimeman_desu;QQ:3819054512
浙公网安备 33010602011771号