1. 项目概述为什么Pikachu是Web安全新手的“新手村”如果你刚接触Web安全面对一堆术语和工具感到无从下手那Pikachu靶场绝对是你绕不开的“新手村”。它不像DVWA那样功能繁多但略显陈旧也不像一些商业靶场那样复杂。Pikachu靶场最大的特点就是“场景化”和“接地气”。它把OWASP Top 10里最常见的漏洞比如SQL注入、XSS、文件上传、暴力破解等都做成了一个个独立、完整的小应用场景。你不需要去理解一个庞大电商系统的业务逻辑只需要专注于眼前这个登录框、这个上传点理解漏洞是如何产生、如何被利用的。这种设计极大地降低了学习门槛让你能快速建立起对漏洞的直观感受。而Burp Suite则是我们手中的“瑞士军刀”。它不是一个单一的工具而是一个功能强大的集成平台代理、爬虫、扫描器、重放器、编码器……几乎所有手工测试需要的功能它都囊括了。很多新手会觉得Burp Suite界面复杂功能按钮太多不知道从何用起。我的建议是不要试图一次性掌握所有功能。最好的学习方法就是带着明确的目标去使用它。比如今天我们的目标就是用Burp Suite把Pikachu靶场里从暴力破解到文件上传这几个经典漏洞亲手“打”一遍。在这个过程中你会自然而然地熟悉Proxy的拦截与改包、Intruder的爆破功能、Repeater的重放测试。这种“以战代练”的方式远比看一百篇功能介绍文章来得有效。这篇文章就是为你这样想入门Web安全手工测试的朋友准备的。我会假设你已经按照教程在本地或虚拟机里搭好了Pikachu靶场并且给Burp Suite配好了浏览器代理。接下来我们不会讲太多空洞的理论而是直接进入实战。我会带你一步步操作重点不是告诉你“点这里点那里”而是解释“为什么要这么做”以及“操作时最容易在哪个环节翻车”。从最简单的暴力破解开始到稍微需要点技巧的文件上传绕过我们一个坑一个坑地踩过去把Burp Suite的核心功能用熟、用透。2. 环境准备与Burp Suite核心模块初探在开始“闯关”之前我们必须把“武器”调试到最佳状态。很多新手卡在第一步不是因为漏洞原理不懂而是环境没配通请求根本抓不到或者改不了。2.1 Burp Suite与浏览器的“握手”配置首先确保你的Burp Suite Community Edition社区版已经启动并且默认监听在127.0.0.1:8080。这个端口是Burp的代理端口所有经过它的流量都会被截获。接下来是浏览器的配置这里有个关键细节不要只在系统网络设置里配代理那样会影响你所有的网络请求。我强烈建议为安全测试专门配置一个浏览器或者至少是一个独立的浏览器配置文件。以Chrome为例你可以通过命令行启动一个专门用于测试的实例chrome.exe --proxy-server127.0.0.1:8080 --ignore-certificate-errors --user-data-dirC:\BurpProfile。这条命令做了三件事1. 设置代理到Burp2. 忽略证书错误因为Burp会生成自己的CA证书来解密HTTPS流量浏览器默认不信任3. 使用一个独立的用户数据目录和你日常的浏览记录、书签完全隔离。启动后访问http://burp下载并安装Burp的CA证书。这一步至关重要否则你访问HTTPS网站会看到一堆警告Pikachu靶场如果部署在HTTPS下也会抓不到包。配置完成后在Burp的Proxy - Intercept标签页确保Intercept is on是打开状态。然后用你的测试浏览器访问Pikachu靶场的首页通常是http://your-ip/pikachu。如果一切正常你会看到浏览器的请求“卡住”了而Burp的Intercept界面里出现了这个HTTP请求。这就意味着“握手”成功Burp已经成为了你和靶场之间的“中间人”。2.2 认识你的作战指挥中心Proxy, Intruder, Repeater成功抓到第一个包后别急着放行。我们来快速认识一下接下来会频繁使用的三个核心模块理解它们的分工。Proxy代理这是Burp的“前线哨所”。所有流经的请求和响应都会在这里被记录和展示。Intercept子标签用于手动拦截和修改单个请求适合精细操作。而HTTP history子标签则记录了所有经过的流量是你回顾操作、寻找漏网之鱼的“日志中心”。一个实用的技巧是在测试不同漏洞时可以右键点击HTTP history中的请求选择Send to Intruder或Send to Repeater这是你发起攻击的起点。Intruder入侵者这是你的“自动化爆破兵”。它的核心功能是对一个HTTP请求模板在指定的位置称为“攻击位置”或“Payload位置”替换上不同的载荷Payload然后自动发送大量请求并分析响应。它主要用来干两件事暴力破解如用户名/密码和模糊测试寻找参数中的潜在漏洞。它有四种攻击模式我们待会儿在暴力破解时会详细讲最常用的“狙击手”模式。Repeater重放器这是你的“实验室”和“调试器”。你可以把一个请求发送到Repeater然后随意修改它的任何部分——参数、头、方法——并手动发送观察响应。它不像Intruder那样自动化但给了你完全的控制权。在测试文件上传漏洞时Repeater是你的主战场因为你需要反复尝试不同的绕过姿势并立刻看到结果。把这三个模块的关系想象成Proxy负责“侦察和捕获”抓包Intruder负责“大规模火力覆盖”爆破Repeater负责“特种小队精确打击”手动测试。搞清楚这个你的测试思路会清晰很多。3. 第一关暴力破解漏洞实战与Intruder深度解析Pikachu靶场的暴力破解模块通常是一个简单的登录框。我们的目标是利用Burp Suite的Intruder模块自动化地尝试用户名和密码的组合直到找到正确的那个。3.1 抓取登录请求与攻击位置设定首先用浏览器访问暴力破解的页面随便输入一个用户名如test和密码如123点击登录。同时确保Burp的拦截是开启的。这时登录请求会被Burp拦截在Proxy的Intercept标签页。你会看到一个POST请求Body里大概是usernametestpassword123submitLogin这样的形式。这里第一个坑来了不要直接在这个拦截的请求上点“Attack”。虽然Burp提供了一个快捷按钮但我建议你养成习惯右键点击这个请求选择Send to Intruder。这样这个请求就被送到了Intruder模块作为我们攻击的模板。切换到Intruder - Positions标签。Burp会自动用§符号标记一些它认为可能是参数的攻击位置。通常它会标记username和password的值。但自动标记不一定准确你需要手动检查。点击右边的Clear §按钮清空所有标记然后手动用鼠标选中test这个值点击Add §。同样地选中123点击Add §。现在你的请求模板应该看起来像username§test§password§123§submitLogin。这告诉Intruder“请在§符号包围的这两个位置替换我提供的Payload进行测试。”3.2 Payload配置与攻击模式选择接下来是核心步骤配置Payload。切换到Intruder - Payloads标签。因为我们在两个位置做了标记Positions标签页顶部会显示Attack type和Payload Positions所以这里会有Payload set的选择。Payload set: 1对应第一个标记位置usernamePayload set: 2对应第二个标记位置password。攻击模式的选择至关重要。Intruder有四种模式Sniper狙击手使用一个Payload集合依次替换每一个攻击位置。适合测试单个参数如只爆破密码用户名已知。Battering ram攻城锤使用一个Payload集合同时替换所有攻击位置为相同的值。很少用。Pitchfork草叉使用多个Payload集合每个集合对应一个攻击位置并行遍历。这是爆破“用户名:密码”组合的标准模式。Set 1放用户名字典Set 2放密码字典它们会一一对应进行尝试。Cluster bomb集束炸弹使用多个Payload集合进行笛卡尔积式遍历。即Set 1的每个Payload都会与Set 2的所有Payload组合。这是最暴力、最全面的模式但请求量是乘积关系巨大。对于已知用户名爆破密码用Sniper。对于完全未知的用户名和密码组合爆破我们这里应该用Pitchfork。但请注意Pikachu靶场的暴力破解漏洞为了教学简化常常设置了一个已知的弱用户名如admin。所以更常见的实战是先用一个常见用户名字典如admin, root, test搭配一个密码字典用Pitchfork模式试一遍。如果发现admin这个用户存在但密码不对再针对admin用Sniper模式爆破密码。假设我们采用Pitchfork模式。在Payload set: 1Payload type选择Simple list然后在下面的输入框里直接添加几个常见的用户名比如admin administrator test pikachu在Payload set: 2同样选择Simple list添加一个简单的密码字典123456 password admin 12345678 qwerty注意在实际测试中你需要准备更全面的字典文件并通过Load...按钮载入。这里为了演示用手动输入。3.3 执行攻击与结果分析配置好Payload后点击右上角的Start attack。Intruder会弹出一个新窗口开始发送请求。你会看到一行行的请求和对应的响应。如何判断哪个请求成功了这是第二个关键点。我们不能只看返回的HTTP状态码比如200因为很多网站登录失败也返回200只是页面内容不同。我们需要关注响应长度Length或响应内容。在攻击结果窗口点击表头可以对各列排序。点击Length列让响应长度排序。通常登录成功和登录失败的页面内容大小会有明显差异。成功页面可能更长包含用户菜单也可能更短跳转到了新页面。仔细对比找到那个长度与众不同的行。然后切换到Response标签页查看该请求的响应体确认是否包含了“登录成功”、“Welcome”等关键字或者是否发生了302跳转在Response的Headers里找Location字段。在Pikachu靶场中成功登录通常会有明确的提示。找到成功的组合后你就可以用这个用户名密码去登录了。通过这个流程你不仅学会了爆破更重要的是理解了Intruder的攻击模式选择和结果分析技巧这是很多教程一笔带过但实际非常容易出错的地方。4. 第二关文件上传漏洞原理与绕过思路过了暴力破解我们来到Web安全中另一个高频且危害极大的漏洞——文件上传。Pikachu靶场的文件上传模块通常会设计多种防护措施让我们来逐一拆解。4.1 理解服务端的防御“检查点”一个具备基本安全意识的开发者会在文件上传功能上设置多层检查。我们的绕过就是针对这些检查点的“闯关”。常见的检查点包括客户端JavaScript校验这是最弱的一环。通常是在上传表单的onsubmit事件中用JavaScript检查文件的后缀名如是否.jpg, .png。绕过方法直接禁用浏览器JavaScript或者用Burp抓包后修改文件名再放行。因为JS运行在浏览器我们完全可控。服务端MIME类型检查服务器通过HTTP请求头中的Content-Type字段如image/jpeg来判断文件类型。绕过方法用Burp拦截上传请求将Content-Type改为允许的类型比如即使你上传的是.php文件也把Content-Type改成image/jpeg。服务端文件后缀名检查这是最核心的检查。服务器会检查文件名如shell.php的后缀是否在黑名单如php, asp, jsp或白名单如jpg, png, gif中。黑名单绕过尝试一些冷门但可执行的后缀如php3, php4, php5, phtml, phps如果服务器配置了将这些后缀解析为PHP。或者在后缀名后加空格、点号shell.php.利用系统处理文件名时的特性。白名单绕过这是重点。如果服务器只允许.jpg等我们需要进行“文件内容欺骗”。服务端文件内容检查更高级的防御会检查文件内容的开头字节文件头魔数判断是否是真实的图片。例如一个真正的JPEG图片文件开头是FF D8 FF E0。服务端二次渲染最严格的防御。服务器会对上传的图片进行真正的压缩、裁剪等处理任何嵌入在图片中的恶意代码都会被破坏。绕过难度极高通常需要结合图片本身的漏洞如图片解析漏洞。Pikachu靶场通常会涵盖前三种情况。我们的思路是准备一个包含恶意代码的文本文件然后利用各种技巧让它“骗过”服务器的检查最终被当成脚本执行。4.2 制作你的“特制”Payload对于Web安全测试最常见的恶意文件就是“一句话木马”Webshell。它体积小功能强。一个经典的PHP一句话木马如下?php eval($_POST[cmd]);?这段代码的意思是执行通过POST参数cmd传过来的任意PHP代码。符号用于抑制错误信息使其更隐蔽。但是直接上传一个内容为此代码的.php文件几乎肯定会被拦截。我们需要对它进行“包装”。一个万金油的方法是制作一个图片马。你可以用Windows的copy命令或者Linux的cat命令将一个真实的图片和一个一句话木马合并copy /b normal.jpg shell.php webshell.jpg这样生成的webshell.jpg用图片查看器打开是正常的图片但用文本编辑器查看末尾就包含了我们的PHP代码。服务器如果只检查文件头它会认为这是一张jpg图片。但如果服务器不仅检查文件头还要求文件后缀必须是.jpg那我们就需要结合后续的绕过技巧。5. 实战利用Burp Suite绕过文件上传限制现在我们进入实操环节。打开Pikachu的文件上传页面选择我们制作好的“图片马”webshell.jpg点击上传。同时Burp Proxy开启拦截。5.1 绕过客户端与MIME类型检查请求被Burp拦截后你看到的可能是一个multipart/form-data格式的POST请求。关键部分在Body里Content-Disposition: form-data; nameuploadfile; filenamewebshell.jpg Content-Type: image/jpeg ...这里是文件的二进制内容...如果这个请求被直接放行而靶场只有客户端JS校验那么很可能就上传成功了因为JS已经被我们绕过抓包意味着请求已发出JS检查已过。但如果靶场有服务端MIME检查它看到Content-Type: image/jpeg和.jpg后缀也可能通过。第一个绕过点如果上传失败返回“文件类型不正确”我们可以尝试修改两处1.filename将其改为webshell.php2.Content-Type将其改为text/php或application/x-php。然后放行请求观察响应。这是一个试探过程用于判断服务器检查的严格程度。5.2 绕过服务端后缀名检查黑名单/白名单假设我们将filename改为webshell.php后上传失败提示“不允许上传该类型文件”说明存在服务端后缀检查。黑名单绕过尝试将filename改为一些变异后缀尝试webshell.php3webshell.php5webshell.phtmlwebshell.phpswebshell.php.末尾加点Windows系统可能会自动去除webshell.php末尾加空格需要URL编码为%20 每次修改后都通过Burp的Repeater发送而不是在Proxy拦截界面直接放行。因为Repeater可以让你保留原始请求方便反复修改和测试。右键点击拦截的请求选择Send to Repeater。白名单绕过尝试如果黑名单绕过无效或者提示“只允许jpg、png格式”说明是白名单机制。这时我们的“图片马”就派上用场了。但光有图片内容还不够后缀必须是白名单内的。我们可以尝试以下经典绕过姿势双写后缀filenamewebshell.jpg.php。如果服务器的检查逻辑是简单的字符串匹配寻找.php并删除可能会错误地处理成删除中间的.php留下.jpg但实际保存的文件名可能是webshell.jpg。不过更常见的是它检查最后一个后缀。这个技巧在某些不严谨的代码中可能生效。路径截断较古老依赖特定环境filenamewebshell.jpg.php\0.jpg或利用%00空字节截断需要PHP版本5.3.4且特定配置。在现代环境中较少见。大小写绕过filenamewebshell.Php或filenamewebshell.PHP。如果服务器检查是大小写敏感的可能绕过。.htaccess文件攻击针对Apache如果服务器允许上传.htaccess文件我们可以上传一个自定义的.htaccess其内容为AddType application/x-httpd-php .jpg这行配置告诉Apache服务器将.jpg后缀的文件也当作PHP来解析。然后我们再上传webshell.jpg它就会被解析执行。这是非常厉害的一招但前提是服务器允许上传.htaccess且Apache配置未禁止覆盖。在Pikachu靶场中通常会设计其中一种或几种可绕过的方式。你需要像做实验一样在Repeater中系统地尝试这些filename的变体并观察响应。成功的响应通常会返回文件保存的路径比如Upload success! File path: uploads/webshell.php。5.3 验证漏洞与获取Webshell当你通过响应信息确认文件上传成功并且路径已知后最关键的一步是验证它是否真的能作为脚本执行。仅仅文件被保存到服务器并不代表漏洞利用成功。如果服务器没有将该文件放置在Web可访问目录或者没有配置相应的解析器比如上传了.php文件但服务器没装PHP那它只是一个静态文件。访问你上传的文件例如http://your-ip/pikachu/uploads/webshell.php。如果页面空白或者没有报“404 Not Found”或“Access denied”那很可能成功了。接下来我们需要验证命令执行。这里我们不推荐使用中国菜刀这类图形化工具进行初始连接因为它们特征明显容易被防护设备发现。更隐蔽的方式是直接使用浏览器或curl进行POST请求。打开浏览器开发者工具F12切换到Console控制台或使用FetchAPI或者使用curl命令。假设我们的一句话木马是?php eval($_POST[cmd]);?上传后的地址是/uploads/shell.php。使用浏览器控制台验证fetch(/pikachu/uploads/shell.php, { method: POST, headers: { Content-Type: application/x-www-form-urlencoded, }, body: cmdecho%20Hello,Pikachu!; // URL编码的PHP代码echo Hello,Pikachu!; }) .then(response response.text()) .then(data console.log(data)) .catch(error console.error(Error:, error));如果返回的data中包含了“Hello,Pikachu!”那么恭喜你你不仅找到了文件上传漏洞还成功获得了Webshell可以执行任意PHP代码了。这标志着你已经具备了初步的漏洞利用能力。6. 实战中常见问题与排查技巧实录理论讲得再透实战中还是会遇到各种“妖魔鬼怪”。下面是我在带新手和自身测试中总结的几个高频问题及解决思路。6.1 Burp抓不到本地流量或HTTPS流量问题现象浏览器访问PikachuBurp的HTTP history里一片空白。检查代理配置首先确认浏览器代理设置正确指向了127.0.0.1:8080。如果你用了其他代理插件如SwitchyOmega请确保它被正确配置或暂时禁用。检查Burp监听在Burp的Proxy - Options下查看Proxy Listeners。确保127.0.0.1:8080是Running状态。可以尝试点击Edit在Binding标签页勾选All interfaces有时能解决一些奇怪的问题。HTTPS抓包问题如果靶场是https://开头你必须完成安装CA证书的步骤。访问http://burp下载证书并导入到浏览器的“受信任的根证书颁发机构”存储中。对于Chrome/Edge它们使用系统的证书存储对于Firefox它有自己独立的证书存储需要单独导入。防火墙或杀毒软件拦截偶尔系统防火墙或安全软件会阻止Burp。尝试暂时关闭它们测试后请记得打开。使用localhost或127.0.0.1有些应用对localhost和127.0.0.1的处理不同。如果靶场部署在本机尝试在浏览器中用127.0.0.1代替localhost访问。6.2 Intruder攻击速度慢或无结果问题现象Intruder攻击启动后请求发送极慢或者全部失败状态码如443、502。调节线程和速率在Intruder攻击窗口的Options标签页找到Request Engine。Number of threads线程数不宜过高对于本地靶场10-20即可过高可能拖垮靶场或触发防护。Throttle延迟可以适当增加给服务器响应时间。检查Payload数量如果你加载了非常大的字典文件几十万条攻击会非常耗时。在测试阶段先用一个小的、精简的字典。服务器过载或防护如果靶场应用本身性能较差大量并发请求可能导致其无响应。观察服务器资源使用情况。此外一些应用有简单的防爆破机制如连续错误多次后锁定IP或账户。在Pikachu靶场中通常没有但真实环境需要考虑。网络问题确保你的测试环境网络稳定。如果是虚拟机检查网络连接模式NAT/桥接。6.3 文件上传成功但无法访问或执行问题现象Burp返回上传成功并给出了路径但浏览器访问该路径返回404、403或直接显示源代码。路径错误仔细看服务器返回的路径。是相对路径还是绝对路径是Web路径还是服务器物理路径uploads/shell.php是相对于网站根目录的。尝试访问http://靶场IP/pikachu/uploads/shell.php。权限问题文件虽然上传了但Web服务器进程如www-data, apache用户没有读取或执行该文件的权限。这在Linux服务器上很常见。真实环境中可能需要结合其他漏洞提权靶场中通常不会设置此障碍。未解析这是最可能的情况。你上传的文件后缀没有被服务器配置为可执行脚本。例如上传了.php文件但服务器是纯静态HTML服务器或者.php后缀没有被关联到PHP解析器。在Pikachu靶场中如果设计了这个坑那说明你绕过的姿势不对需要尝试.php5、.phtml等其他可解析后缀或者尝试.htaccess攻击。内容被破坏如果你上传的是“图片马”并且服务器有二次渲染你插入在图片末尾的代码很可能在图片被压缩处理时被清除。这种情况下需要研究更高级的图片隐写技术将代码写入图片的EXIF信息等不被处理的部分或者寻找不进行二次渲染的上传点。6.4 请求被靶场应用本身拦截问题现象无论怎么修改Payload返回的都是统一的错误页面或者提示“非法请求”。Token或Session验证检查上传请求的URL参数或表单数据中是否包含一个随机的token或csrf_token。这种Token通常在一次会话或一次页面加载时生成用于防止跨站请求伪造。如果你在Repeater里反复发送同一个请求Token会过期。解决办法是先用浏览器正常访问一次上传页面抓取这个包含Token的GET请求从中提取Token值再构造你的上传POST请求。或者编写脚本自动化这个“获取Token-构造请求”的过程。Referer检查服务器可能检查HTTP请求头中的Referer字段要求它必须来自本站的上传页面。在Burp中手动在请求头里添加或修改Referer: http://靶场IP/pikachu/upload_page.php。Cookie/Session依赖确保你的攻击请求在Intruder或Repeater中携带了正确的Cookie。从浏览器中成功访问页面后从Proxy的HTTP history里找到包含Cookie头的请求将其复制到你的攻击请求中。排查这些问题本质上是对比分析。将一个失败的请求和一个通过浏览器正常操作成功的请求在Burp的Proxy - HTTP history里找出来放在一起逐行对比Headers, Body, Parameters差异点往往就是问题所在。养成这种对比的习惯能解决你未来测试中80%的奇怪问题。