🌀 鱼油のB10g

✦ 不定期更新技术随想

✦ 分享奇妙发现

📌 近期动态:

探索AI和工具使用...

第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实测踩坑记录

  1. PHP版本锁定5.4-7.4(DVWA不兼容PHP8)
  2. 配置文件关键修改:
// dvwa/config/config.inc.php
$_DVWA['db_password'] = 'p@ssw0rd'; // 一定要改默认密码!
error_reporting(E_ALL);// 打开错误显示
ini_set('display_errors', 1); // 审计必备
  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);

审计技巧进阶

  1. 数据流追踪法
  • $_GET/$_POST 出发 → 跟踪到SQL/系统命令执行点
  1. 危险函数清单
system(), exec(), eval(), preg_replace("/e"), include(), unlink()...
  1. 二次漏洞挖掘
  • 先过滤后使用的场景(如: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要条件反射想过滤。下期带大家审计真实校园系统源码,记得三连支持 (๑•̀ㅂ•́)و✧

posted on 2025-08-06 07:38  鱼油YOU  阅读(52)  评论(0)    收藏  举报