从靶场搭建到源码分析:Pikachu+PHPStudy环境下的SQL注入漏洞初探
在网络安全领域,靶场环境是学习漏洞原理和攻防技术的绝佳实验平台。Pikachu靶场以其丰富的漏洞场景和清晰的代码结构,成为众多安全初学者的首选。本文将带您从零开始搭建Pikachu靶场环境,并深入分析其中最具代表性的SQL注入漏洞模块,通过实战演练与源码解读相结合的方式,帮助您真正理解漏洞背后的技术原理。
1. 环境搭建与初始化
搭建Pikachu靶场需要准备两个核心组件:Pikachu源码和PHPStudy集成环境。以下是具体步骤:
下载Pikachu源码:
git clone https://github.com/zhuifengshaonianhanlu/pikachu.git或直接从GitHub仓库下载ZIP压缩包。
安装PHPStudy:
- 访问小皮面板官网下载最新版本
- 选择与操作系统匹配的安装包(Windows推荐64位版本)
- 安装路径避免使用中文或空格
环境配置关键点:
- 将解压后的Pikachu文件夹放置在PHPStudy的
www目录下 - 修改
/pikachu/inc/config.inc.php中的数据库配置:$dbuser = 'root'; //数据库用户名 $dbpass = 'root'; //数据库密码 $dbname = 'pikachu'; //数据库名 - 在PHPStudy中创建网站,PHP版本选择5.6.9
- 将解压后的Pikachu文件夹放置在PHPStudy的
注意:首次访问必须通过
127.0.0.1/install.php完成初始化,否则会出现数据库连接错误。
2. SQL注入漏洞实战演练
Pikachu靶场提供了多种SQL注入场景,我们先从最基本的数字型注入开始:
2.1 数字型注入分析
在"SQL-Inject"模块选择"数字型注入",提交用户ID查询时,观察URL参数变化:
http://127.0.0.1/vul/sqli/sqli_id.php?id=1尝试构造特殊Payload:
1 AND 1=1 -- 1 AND 1=2 --通过返回结果差异判断是否存在注入点。
2.2 联合查询获取数据库信息
利用UNION SELECT提取敏感信息:
1 UNION SELECT 1,group_concat(schema_name) FROM information_schema.schemata --关键信息获取Payload示例:
| 目标信息 | SQL语句 |
|---|---|
| 所有数据库 | UNION SELECT 1,group_concat(schema_name) FROM information_schema.schemata |
| 当前数据库表 | UNION SELECT 1,group_concat(table_name) FROM information_schema.tables WHERE table_schema=database() |
| 用户表字段 | UNION SELECT 1,group_concat(column_name) FROM information_schema.columns WHERE table_name='users' |
3. 漏洞源码深度解析
理解漏洞原理需要分析Pikachu后端处理逻辑,主要关注两个文件:
3.1 数据库连接配置
/inc/config.inc.php中定义了数据库连接方式:
$link = mysqli_connect($host,$dbuser,$dbpass) or die('数据库连接失败'); mysqli_select_db($link,$dbname) or die('数据库选择失败'); mysqli_query($link,"set names utf8");3.2 注入点代码分析
查看/vul/sqli/sqli_id.php关键代码:
$id = $_GET['id']; $query = "SELECT username,email FROM member WHERE id=$id"; $result = mysqli_query($link,$query);漏洞成因:
- 直接拼接用户输入的
$id到SQL语句 - 未对输入参数进行任何过滤或预处理
- 错误信息直接返回给客户端
4. 防御方案与安全实践
针对发现的SQL注入漏洞,我们可以实施多种防护措施:
4.1 参数化查询改造
使用预处理语句修复漏洞:
$stmt = $link->prepare("SELECT username,email FROM member WHERE id=?"); $stmt->bind_param("i", $id); $stmt->execute(); $result = $stmt->get_result();4.2 输入过滤策略
实施白名单验证:
if(!preg_match('/^\d+$/', $id)) { die("非法输入参数"); }4.3 最小权限原则
数据库用户权限配置建议:
| 权限级别 | 适用场景 | 风险等级 |
|---|---|---|
| root | 数据库管理 | 极高 |
| 读写权限 | 应用常规操作 | 中 |
| 只读权限 | 查询类操作 | 低 |
在实际项目中,应该为Web应用创建专属数据库用户,仅授予必要权限。