CTFSHOW-Web入门 – 暴力破解详解

下面是CTFSHOW-Web入门 – 暴力破解详解,本篇文章是看了一个大佬写的非常的好,然后给他弄过来,重新来进行一下总结,喜欢的来看看吧。

web21 基于 Basic 的爆破

暴破什么的,都是基操

访问网站,出现如下页面:这个页面其实是一些网站里面设置的密码访问,晓得大家搭建网站的时候也可以这样设置,验证,用户名和密码才可以进行访问,他这种验证有一个缺点,是没有验证码,也是说可以直接爆破。

 

这里则是 HTTP 的 Basic 认证。我们输入用户名 admin 密码 随便输入 然后使用 BP 进行抓包,出了数据之后,我们来查看,会发现这个数据是一个加密的。

 

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

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

 

发现是 用户名:密码 的形式,知道该形式之后我们将其发送至暴破模块 按照他这个原来有的形式来进行爆破Intrude

 

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

 

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

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

 

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

 

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

web22 基于子域名的爆破

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

利用在线子域名爆破,发现了域名 ,我其实也可以不用在线字典,有些地方可以查询他的解析记录,这个解析一般它会有记录的,那么通过这个记录可以看到。flag.ctf.show

 

web23 基于数学的爆破

访问网站,源码如下:

PHP

 

12345678910111213141516 <?phperror_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 位。

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

PHP

 

1234567891011 <?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 />”;        }    }}?>

最终符合条件的有:422 和 1202

 

web24 随机种子

Hint: 爆个🔨

访问网站,源码如下:

PHP

 

1234567891011121314 <?phperror_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 的版本)

 

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

PHP

 

1234 <?php mt_srand(372619038);echo mt_rand(); // 1155388967?>

 

web25 随机种子爆破

Hint: 爆个锤子,不

题目源码如下:

PHP

 

12345678910111213141516171819 <?phperror_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’);}?>

源码解读如下:

 

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

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

 

PHP

 

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

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

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

 

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

 

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

 

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

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

PHP

 

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

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

题目源码:

PHP

 

123 if($_COOKIE[‘token’]==(mt_rand()+mt_rand())){            echo $flag;}

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

 

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

PHP

 

12345678910 # 第一次随机出来的值为 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 空密码登陆

访问靶机出现如下页面:

 

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

 

web27 身份证枚举

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

 

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

 

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

 

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

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

 

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

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

 

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

 

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

 

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

 

web28 目录枚举

访问网站出现如下页面:

 

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

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

 

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

 

 

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

 

以上是这一章节所有的内容的详解

© 版权声明
文章全是未果本果写的,尽量别直接复制粘贴
暂无评论

发送评论 编辑评论

上一篇
下一篇