ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Pikachu靶场详解:从搭建到Web漏洞实战通关

Pikachu靶场详解:从搭建到Web漏洞实战通关 简介Pikachu 靶场资源包pikachu-master.zip是一套面向网络安全学习者的综合漏洞演练环境适合从入门到进阶的安全爱好者、渗透测试人员及高校学生使用可用于在可控环境中理解并实践常见 Web 漏洞的攻防原理。包体共 284 个文件约 3.52MB以 PHP 源码、JavaScript 脚本、CSS 样式和 PNG/JPG 图片为主并包含 Dockerfile、配置文件与说明文档便于快速搭建和本地部署。资源完整覆盖 SQL 注入、XSS 跨站脚本、CSRF 跨站请求伪造、文件包含、命令注入、越权与权限提升等典型漏洞模块每个模块都配有实际页面和练习场景配合源码阅读与日志观察可深入掌握漏洞成因、利用手法和防御要点。已有 1548 人学习下载适合通过手动复现与代码审计相结合的方式系统提升 Web 安全检测与防护能力。 pikachu-master.zip这个文件名乍一看像个游戏资源包但老手一眼就认出来——这是Web安全圈流传很广的Pikachu漏洞测试平台的源码压缩包。它是一个专门用来练习Web漏洞挖掘与利用的本地靶场把SQL注入、XSS、CSRF、文件上传、反序列化等经典漏洞场景全部做成了图形化页面装上就能开打。很多人学Web安全卡在第一步理论书翻了三章Burp Suite装了但找不到地方练手。Pikachu解决的就是这个痛点——你不需要搭建复杂的漏洞环境解压、配置数据库、启动服务一个能练手的靶场就绪了。这套东西特别适合两类人一类是刚入门Web安全、想系统刷一遍漏洞类型的新手另一类是准备护网、面试需要短期找回手感的从业者。这篇文章我就从搭建开始把核心漏洞模块的通关思路和路上踩过的坑一次讲清楚。1. Pikachu是个什么项目——先搞清它的设计思路1.1 为什么叫Pikachu它和DVWA有什么不同Pikachu是国内安全圈一个开源Web漏洞靶场项目名字取自《精灵宝可梦》里的皮卡丘原因很简单项目作者希望把漏洞学习做得像收集宝可梦一样有趣。相比同类的DVWADamn Vulnerable Web ApplicationPikachu的界面更贴近国内开发者的使用习惯漏洞场景也更多样。DVWA的定位是最小化漏洞演示一个漏洞一个页面功能极简。而Pikachu更接近真实业务逻辑比如SQL注入模块里分了数字型、字符型、搜索型、宽字节四种场景XSS模块分了反射型、存储型、DOM型每个场景都模拟了一个具体的业务页面比如搜索框、留言板、个人信息修改。练的时候你会觉得是在对一个真实的网站做测试而不是对着教学Demo发呆。1.2 模块全景这套靶场到底能练什么我整理了一份Pikachu自带的漏洞模块清单基本上覆盖了Web渗透测试的常见类型漏洞类型涉及子场景难度评价暴力破解基于表单、验证码绕过入门友好XSS反射型、存储型、DOM型入门友好CSRF修改信息、删除操作中低难度SQL注入数字型、字符型、搜索型、宽字节由浅入深RCEexec命令执行、代码注入中高难度文件包含本地文件包含、远程文件包含中高难度文件上传前端限制、MIME类型、扩展名黑名单中高难度越权水平越权、垂直越权中低难度目录遍历路径穿越读取文件入门友好反序列化PHP反序列化漏洞高难度XXEXML外部实体注入高难度敏感信息泄露目录浏览、测试文件残留入门友好URL重定向跳转绕过入门友好我自己的经验是不需要按顺序刷但建议先过一遍SQL注入和XSS这两个模块是Web安全的基础后面理解RCE和反序列化会顺很多。2. 本地搭建一条龙从zip包到能打开的靶场2.1 环境准备Windows最简单Linux也不难Pikachu是基于PHPMySQL的Web应用所以需要一个能跑PHP的运行环境。最省事的方案是装phpStudy现在叫小皮面板它把Apache、Nginx、PHP、MySQL打包在一起一键启动。如果你不喜欢集成环境也可以手动装Apache/Nginx任意一个、PHP 5.6或7.x、MySQL 5.x这三件套跑起来就行。不过我给新手的建议还是phpStudy省去配置虚拟主机和PHP-FPM的麻烦Windows和macOS都支持。实测下来PHP 5.6和7.0对Pikachu的兼容性最好PHP 8.x可能有些旧函数被移除后面会说到这个坑。2.2 部署步骤解压、放目录、配数据库拿到pikachu-master.zip之后部署流程分三步走解压压缩包把里面的pikachu-master文件夹整个复制到Web根目录。用phpStudy的话就是WWW目录下一般是C:\phpstudy_pro\WWW\。重命名建议去掉-master后缀方便访问比如改成pikachu。打开inc目录下的config.inc.php修改数据库连接信息。默认配置是针对本地的如果你用的是phpStudy默认的MySQL账号密码是root/root那就不用改。如果改了密码把下面这三行改成你自己的define(DB_HOST, 127.0.0.1); define(DB_USER, root); define(DB_PASS, root); define(DB_NAME, pikachu);启动Apache和MySQL服务浏览器访问http://localhost/pikachu/。如果没有报错且出现安装引导页点击初始化或安装按钮系统会自动创建pikachu数据库并导入数据表。整个过程其实不超过五分钟。2.3 安装时的几个经典报错我第一次装的时候就遇到一个问题页面提示数据库连接失败。排查思路很简单——先确认MySQL启动了再看config.inc.php里的密码对不对最后确认MySQL端口是不是3306。如果用phpStudy改了MySQL端口还要同步该文件里的端口配置。另一个典型问题是访问http://localhost/pikachu/install.php时白屏。多数情况下是PHP版本太高导致的把phpStudy切回PHP 7.0或5.6就好了。还有一个容易被忽略的点PHP 8.0后mysql_*系列函数被移除了如果Pikachu的旧代码还在用这些函数开PHP 8会直接报Fatal Error。3. 六大核心漏洞模块通关解析3.1 SQL注入数字型、字符型、搜索型一个都不许跳过SQL注入是Web安全里最经典也是最基础的漏洞。Pikachu的SQL注入模块分为数字型、字符型、搜索型、宽字节正好对应了实际开发中常见的几种写法错误。数字型注入的原理很简单后台直接用字符串拼接的方式把参数拼到SQL语句里而参数值是数字类型没有用引号包裹。比如后台可能是这样写的SELECT * FROM users WHERE id $id;当你提交id1时SQL是WHERE id 1正常查询。但要是在参数后面拼上and 11SQL变成WHERE id 1 and 11永远为真返回所有数据。而提交and 12时SQL变成WHERE id 1 and 12恒为假页面就没有数据。通过这两种返回结果的差异就能判断出注入点存在。判断出是数字型注入后下一步就是爆字段数、找显示位、爆库名表名字段名。经典payload如下id1 order by 2 id1 and 12 union select 1,2,3 id1 and 12 union select 1,database(),version()字符型注入的区别在于后台SQL用了单引号包裹参数比如WHERE name $name。所以你需要先闭合引号再拼接自己的payload典型操作是必须把引号闭合完整。最经典的判断方法是用name1 and 11如果页面正常说明注入点成立。这个细节是新手最常卡住的地方数字型注入不用管引号字符型注入必须关注引号的闭合。搜索型注入本质上是字符型的一种变体后台用了LIKE %keyword%模糊查询。同样的闭合思路payload要写成keyword% and 11 and %这种形式俗称闭合并绕过百分号。这部分建议你在Pikachu上反复练几遍练到看见引号就知道怎么闭合的程度。宽字节注入稍微特殊一点它是因为数据库编码用了GBK而PHP对特殊字符转义时只加了一个反斜杠导致反斜杠被GBK编码吃掉。Pikachu这个场景设计得很有代表性遇到需要用%df这种构造方式去闭合的题目基本就是宽字节注入没跑了。3.2 XSS三兄弟反射、存储、DOM原理和利用大不同XSS跨站脚本攻击的本质是把恶意脚本注入到页面中被执行。Pikachu把XSS分成了反射型、存储型、DOM型三种类型看起来都是弹个弹窗但背后的原理和危害完全不一样。反射型XSS是最直白的一种恶意Payload通过URL参数提交给服务器服务器把参数内容原样拼进返回的HTML里。比如Pikachu的反射型XSS页面输入框会把你填的内容写入URL中的message参数后台返回的页面里直接用$_GET[message]拼到HTML输出。你提交scriptalert(1)/script页面就会弹出弹窗。这类XSS的核心特点是一次性Payload跟随着URL走所以常被用来构造钓鱼链接。存储型XSS的危险性更大因为它把Payload存到了数据库里任何访问该页面的用户都会中招。Pikachu的存储型XSS场景是一个留言板你在留言内容里写入恶意脚本后台存入数据库下一次刷新页面的时候脚本被重新加载执行。这种XSS在真实环境中会变成蠕虫式攻击——所有访问留言板的用户浏览器都会被劫持。DOM型XSS跟前两者不同它不经过服务器端完全是前端JavaScript代码把不可信数据写进了DOM节点。Pikachu的DOM型XSS场景里JavaScript会读取URL中的#号后内容然后通过innerHTML写入页面。这种情况下即使服务器做了过滤只要前端代码存在这样的DOM写入操作漏洞依然存在。练Pikachu的XSS模块时我的建议是别只停留在弹窗验证多试试svg onloadalert(1)、img srcx onerroralert(1)这类变体理解不同标签触发时机。你会发现真正到了实战中payload是不是能打出来取决于过滤规则到底滤掉了什么。3.3 暴力破解与验证码机制的博弈暴力破解模块也是Pikachu的重头戏。这一模块设计了四种场景没有验证码的登录框、有客户端验证码的登录框、有服务端验证码的登录框、基于Token防重复提交的登录框。这四种场景覆盖了最常见的登录安全措施。没有验证码的登录框是最容易打的直接上Burp Suite抓包发送到Intruder模块把密码字段设置为变量加载一个弱口令字典开跑。用默认的admin用户名弱密码字典两三分钟就能出一个结果。有客户端验证码的场景就有意思了。这个验证码是前端JavaScript生成的校验逻辑也在前端也就是说服务端根本不验证验证码对不对。你抓包把验证码参数删掉或者随便填一个居然就能正常登录。这种问题在真实环境里并不罕见很多系统为了用户体验把验证码校验做在前端等于没做。有服务端验证码的场景就正经多了。验证码的值存在Session里提交时需要带上正确的验证码才能继续。最基础的绕法是通过Burp的宏功能让每次请求都自动刷新验证码或者用验证码识别插件做OCR。这个场景的练习重点不是怎么绕过而是让你理解只要服务端每次都校验验证码且过期时间设置合理暴力破解的成本就会直线上升。基于Token的登录框更接近现在的主流设计。每次请求页面时服务端都生成一个随机的Token并写进表单里提交时必须带上正确的Token。如果你只提交用户名和密码会提示Token无效。绕过思路是通过正则表达式从响应页面中提取Token再拼进下一次请求里Burp里正则提取加变量引用的方式可以搞定。练这个模块最关键的收获是别一上来就开跑先抓包分析登录逻辑中哪里是薄弱点。验证码校验在前端还是服务端Token是否可预测是否有次数限制这些思考方式直接决定了你以后做接口安全测试的思维层级。3.4 反序列化漏洞入门难但理解后威力巨大PHP反序列化是Pikachu里难度较高的模块很多初学者看到unserialize($_GET[data])这种代码就懵。我尽量用大白话讲清楚。序列化serialize是把对象转换成字符串以便存储或传输反序列化unserialize则是把字符串还原成对象。这个机制本身没有问题但如果反序列化的数据来自用户输入且没有被严格过滤攻击者就可以构造一段恶意字符串让程序反序列化出一个设计好的特殊对象。Pikachu的反序列化模块给了你一段PHP源码class S{ var $test pikachu; function __destruct(){ echo $this-test; } } $s $_GET[data]; $unserialize unserialize($s);这里的关键是__destruct()析构函数对象被销毁时自动执行。如果攻击者把$test属性改成scriptalert(1)/script反序列化后对象销毁时就会输出这段脚本。构造payload的方式是把一个类实例序列化后再URL编码$s new S(); $s-test scriptalert(1)/script; echo serialize($s);这段脚本输出类似O:1:S:1:{s:4:test;s:19:scriptalert(1)/script;}把这个字符串作为data参数提交就能看到弹窗。理解这个模块的核心不是背payload而是理解反序列化会造成哪些魔术方法被执行。真实场景里PHP反序列化漏洞的利用链POP链非常复杂这也是它在CTF和攻防演练中比较少见但一旦出现就是高分题的原因。Pikachu给你的是一个最简入口先把对象属性注入的原理吃透后续再学利用链构造会轻松很多。4. 通关路上的高频问题与排查技巧4.1 经典报错速查表练靶场和真实项目一样最烦的不是漏洞本身而是环境报错。我从自己带新人的经验里整理了一份高频问题速查表现象可能原因解决办法安装页打不开PHP版本过高、扩展缺失换PHP 5.6/7.0开启php_openssl等扩展数据库连接失败密码错误、MySQL未启动、端口不对核对config.inc.php确认MySQL端口3306页面中文乱码数据库编码不是GBK/UTF8初始化前确认数据库字符集提示mysql_connect()未定义PHP 8移除了旧函数切到PHP 7.x版本暴力破解模块提示验证码错误未带Cookie/SessionBurp里设置Cookie启用宏刷新验证码反序列化模块无反应Payload未URL编码提交前对序列化字符串做URL编码4.2 我踩过的几个坑第一个坑是初始化不干净。如果之前装过一遍后来改动库结构或删了表重新访问安装页面可能会提示已安装而不让你重装。解决办法是打开phpMyAdmin手动删除pikachu数据库再重新走安装流程。第二个坑是路径问题。很多人把压缩包解压后没有把内容单独放到一个文件夹导致访问的时候路径里有pikachu-master和pikachu-master-master这种套娃结构。表面上能打开但一旦涉及跨页面跳转的模块比如CSRF和越权路径失配就会出各种莫名其妙的bug。建议统一规范解压后重命名为pikachu放到WWW目录所有操作都在这个路径下进行。第三个坑是Burp Suite的代理设置。很多人在浏览器里能打开靶场页面但Burp一开就访问不了典型症状是页面一直转圈或报502。解决方法是确认Burp代理端口默认8080和浏览器代理设置一致并确认HTTP History里能看到流量。另外一个进阶技巧URL重定向模块需要跟随跳转才能看到效果在Burp的Proxy Options里勾选Response Modification里的Unhide hidden form fields和Disable insecure redirects能省不少事。4.3 看源码比看答案有用Pikachu每个漏洞场景里其实都给出了后端源码这是它区别于很多靶场的一个优势。很多人在通关时第一反应是去搜索引擎找通关教程但我强烈建议先自己分析页面逻辑再点开提示或源码按钮对照着看。比如字符型SQL注入你闷头试 or 11 --试不出来的时候点开源码就会看到SQL语句是SELECT * FROM user WHERE name $name。这时候你就明白了注入的本质就是让开发者写的SQL语句按照你的意志变形。XSS模块也一样源码里直接展示echo $message;还是echo htmlspecialchars($message);的区别你一眼就能看出漏洞产生的根源。学安全最忌背答案式通关。把每个页面的源码和漏洞产生原理对应起来练完Pikachu你再去看真实项目的代码审计至少能建立起看到什么写法会有什么漏洞的条件反射。5. 从靶场走向实战把通关经验变成安全测试能力5.1 靶场和真实业务的差距在哪练完Pikachu不代表你就能对真实站点做渗透测试这里面隔着好几层真实系统有WAF拦截、有参数过滤、有代码框架的路由机制而且你没有一个源码按钮可以点开确认后端逻辑。但Pikachu给你练出的是手感和判断力——看见一个输入框第一反应是测试闭合方式看见一个文件上传点下意识想到扩展名和Content-Type校验看见一个登录框先分析验证码机制到底在前端还是服务端。这种条件反射恰恰是安全测试最核心的能力。我自己带人的时候发现练过Pikachu和完全没练过的人在面对一个真实授权的测试目标时分析路径和效率完全不在一个层级。有一点必须反复强调在任何未授权系统上做漏洞测试都属于违法行为。Pikachu这类靶场存在的意义就是让你在合法、可控的本地环境里积累经验。真正的实战能力应该在授权范围内、通过SRC或众测平台逐步积累。5.2 通关后建议深挖的几个修复点如果你不只是想当攻击方还想往蓝队或开发安全方向走Pikachu其实也是很好的反面教材。每通一个漏洞建议顺手把修复方案写一遍SQL注入的修复使用预处理语句PDO预处理或MySQLi绑定参数禁止拼接SQL。XSS的修复对输出做HTML实体编码配合CSP内容安全策略。CSRF的修复关键操作增加Token校验并验证Referer。文件上传的修复白名单机制校验扩展名重命名文件存储目录设为不可执行。反序列化的修复对输入做白名单类校验禁用PHP魔术方法的危险调用。我个人的做法是通关之后把每个模块对应的修复代码重新写一遍跑通一个安全版Pikachu。这样一轮下来你会发现自己对漏洞原理的理解深度明显不一样了。5.3 后续学习路径建议练完Pikachu比较自然的下一个台阶是DVWA的中高难度模式、Sqli-labs专门刷SQL注入的靶场和Upload-labs文件上传专项。再往后可以接触CTF题目从Web类的入门题开始会打开一个更广阔的视野。我在实际带教中还有一个感觉很多人把靶场刷完就扔了。其实隔一两个月回来再刷一遍往往会有新的收获。第一遍你可能照着Payload打第二遍你能不看Payload自己构造第三遍你开始琢磨漏洞背后的框架特性和绕过思路。同一个Pikachu三个阶段的学习深度完全不同。最后再分享一个我自己的习惯每通一个模块我习惯在笔记里画一张漏洞认知卡触发条件、利用过程、修复方案、绕过变体各写一行。积累到后面这套卡片比任何教程都值钱。Pikachu这个压缩包虽然只有几十MB但把它练透花在上面的时间绝对值回票价。本文还有配套的精品资源点击获取
返回列表