web21 基于Basic的爆破

暴破什么的,都是基操

访问网站,出现如下页面:

image-20231018150240979

这里则是 HTTP 的 Basic 认证。我们输入用户名 admin 密码 随便输入 然后使用 BP 进行抓包。

image-20231018150348800

在发往服务器的请求中,添加了属性 Authorization 其值为 Basic YWRtaW46YWRtaW4xMjM= 其中 Basic 后方的为 Base64 编码。

我们使用 BP 自带的 Decode 模块进行解码,观察其特征:

image-20231018150559503

发现是 用户名:密码 的形式,知道该形式之后我们将其发送至暴破模块 Intrude

image-20231018151531884

选择 默认的 Sniper 狙击手模式,然后在选择PAYLOAD的时候,加载题目给的字典(注意:对于新版本的BP,字典不能是中文,需要修改为英文)。

image-20231018151646686

加载题目给出的字典,接着添加前缀 admin: 之后添加 Encode 模块为 Base64 编码即可。

在设置PAYLOAD的底部找到 Payload Encoding 默认会自动对 特殊字符进行URL编码,这里我们将前面取消勾选即可。让其不对 = 进行URL编码。

image-20231018151802502

最后点击 Start attack 即可,根据页面返回长度的不同,暴破成功的响应长度为 237,暴破失败的长度为313。

image-20231018151922859

经过解密之后的密码为:shark63

web22 基于子域名的爆破

域名也可以爆破的,试试爆破这个ctf.show的子域名

利用在线子域名爆破,发现了域名 flag.ctf.show

image-20231018153345280

web23 基于数学的爆破

访问网站,源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
error_reporting(0);

include('flag.php');
if(isset($_GET['token'])){
$token = md5($_GET['token']);
if(substr($token, 1,1)===substr($token, 14,1) && substr($token, 14,1) ===substr($token, 17,1)){
if((intval(substr($token, 1,1))+intval(substr($token, 14,1))+substr($token, 17,1))/substr($token, 1,1)===intval(substr($token, 31,1))){
echo $flag;
}
}
}else{
highlight_file(__FILE__);

}
?>

通过代码审计发现:

  1. 要第2位与第15位与第18位相同 (因为下标是从0开始)
  2. 要第2位+第15位+18位 / 第2位 的结果 等于 第32位。

这里我们编写脚本进行枚举:

1
2
3
4
5
6
7
8
9
10
11
<?php 
error_reporting(0);
for ($i=0;$i < 5000;$i++) {
$token = md5($i);
if(substr($token, 1,1)===substr($token, 14,1) && substr($token, 14,1) ===substr($token, 17,1)) {
if((intval(substr($token, 1,1))+intval(substr($token, 14,1))+substr($token, 17,1))/substr($token, 1,1)===intval(substr($token, 31,1))){
echo $i . "<br />";
}
}
}
?>

最终符合条件的有:4221202

image-20231018154823551

web24 随机种子

Hint: 爆个🔨

访问网站,源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
error_reporting(0);
include("flag.php");
if(isset($_GET['r'])){
$r = $_GET['r'];
mt_srand(372619038);
if(intval($r)===intval(mt_rand())){
echo $flag;
}
}else{
highlight_file(__FILE__);
echo system('cat /proc/version');
}
?>

mt_srand() 函数的作用是播下一个更好的随机数发生器种子,当有了随机数种子的时候,那么每次运行得到的随机数也是固定的。

比如种子 372619038 得到固定随机数为 1155388967(当然可能PHP的版本有所差异,题目是PHP7.3的版本)

image-20231018164138215

这里我们本地使用 PHP7.2 进行测试得到的随机数为 1155388967,测试代码如下:

1
2
3
4
<?php 
mt_srand(372619038);
echo mt_rand(); // 1155388967
?>

image-20231018164257819

web25 随机种子爆破

Hint: 爆个锤子,不爆了

题目源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
error_reporting(0);
include("flag.php");
if(isset($_GET['r'])){
$r = $_GET['r'];
mt_srand(hexdec(substr(md5($flag), 0,8)));
$rand = intval($r)-intval(mt_rand());
if((!$rand)){
if($_COOKIE['token']==(mt_rand()+mt_rand())){
echo $flag;
}
}else{
echo $rand;
}
}else{
highlight_file(__FILE__);
echo system('cat /proc/version');
}
?>

源码解读如下:

image-20231018215847154

由于种子是由 FLAG 的md5值,截取前8位转为十进制生成的,我们并不知道随机数种子是多少,因此这里需要使用php_mt_seed进行种子爆破。

首先我们先传入?r=0 会得到一个负的随机数

image-20231019185524562

1
2
# 当我们传入 ?r=0 的时候,此时获得的随机数 192346317
$rand = intval($r)-intval(mt_rand());

我们通过生成的随机数暴破出随机数种子,这里需要使用到 php_mt_seed 工具。

工具的安装地址:https://github.com/openwall/php_mt_seed

image-20231018221853368

通过在服务器的响应头中发现服务器的PHP版本为:php7.3

image-20231018222411323

接着使用 php_mt_seed 工具根据第一次生成的随机数枚举出 种子,我这里第一次生成的随机数为 192346317

image-20231019185759780

由于服务器的PHP版本为 php7.3 因此我们这里得到的种子十进制为 1142351452,十六进制为 0x4416e65c,这里得到了随机数的种子。

这里我们准一个 PHP7+ 的环境,运行如下代码(模拟服务器生成随机数):

1
2
3
4
5
<?php 
mt_srand(1142351452);
mt_rand(); // 服务器第一次生成随机数
echo mt_rand()+mt_rand(); // 服务器第二次生成随机数 将两次生成随机数的结果相加 即可得到服务器生成的随机数
?>

以上源码运行之后得到 2274592836,因此题目的mt_rand()+mt_rand()的结果为 2274592836

题目源码:

1
2
3
if($_COOKIE['token']==(mt_rand()+mt_rand())){
echo $flag;
}

添加Cookie属性 token 字段值为:2274592836,并传入参数r其值为 192346317

image-20231019190037702

这里为什么传入r=192346317呢,观察如下代码:

1
2
3
4
5
6
7
8
9
10
# 第一次随机出来的值为 192346317, 当我们传入?r=192346317 - 第一次随机生成的值 = 0
$rand = intval($r)-intval(mt_rand());
// 这里只有$rand值为0的时候才会走if里面
if((!$rand)){
if($_COOKIE['token']==(mt_rand()+mt_rand())){
echo $flag;
}
}else{
echo $rand;
}

web26 空密码登陆

访问靶机出现如下页面:

image-20231019191119903

使用 BP 进行抓包,这里因为后端判断逻辑问题,将参数的值全部清空即可得到FALG。

image-20231019191200397

web27 身份证枚举

访问网站出现如下页面,发现是个教务管理系统,并在首页中发现两个功能:录取名单、学生学籍信息管理系统

image-20231019191431995

点击录取名单即可下载一张Excel表格,内容如下:

image-20231019191525822

点击学生学籍信息查询系统出现如下页面:

image-20231019191544915

我们在学生学籍信息查询系统中可以发现,学生可以通过 姓名和身份证号进行查询。那么我们从录取名单中发现了学生的名称以及身份证号,只不过身份证号是对生日信息打码的。那么我们可以不可以对身份证号中的生日进行爆破呢?当然可以。

这里使用 BP 自带的功能进行暴破,首先进行抓包:

image-20231019192254019

将其中的生日作为变量,接着加载PAYLOAD进行爆破

这里我们从 1990年1月1日到2023年12月31日。并设置格式为 yyyyMMdd

image-20231019192844382

通过响应长度的不同,判断姓名为高先伊 身份号为621022199002015237

image-20231019193942994

这里我们直接进行登陆测试:

image-20231019194104790

得到学号以及初始密码,利用该密码登陆到教务系统。

image-20231019194235511

web28 目录枚举

访问网站出现如下页面:

image-20231019220713102

根据目录的结构,这里可能需要对目录进行爆破(删除2.txt文件)。我们还是使用BP进行暴破,先抓取该请求并将其发送至Intrude模块。

Attack Type 设置为 Cluster bomb模式,同时将两级目录分别设置为变量。

image-20231019220649001

这里分别为以上两个变量设置 PAYLOAD 类型为 Numbers,值为1-100。

image-20231019195603021

image-20231019195631277

通过响应内容的不同或者通过状态码的不同,判断FLAG的页面:

image-20231019220927031

image-20231019220951040