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

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

web21 基于 Basic 的爆破

暴破什么的,都是基操

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

1705107906_65a1e1c2b51d5fd7e8c3c-2.png

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

1705107912_65a1e1c8a7201288fb8a2-2.png

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

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

1705108072_65a1e2682358a309e0207-2.png

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

1705107916_65a1e1cc87676bd73ba81-2.png

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

1705107922_65a1e1d22f3c1f64be997-2.png

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

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

1705107926_65a1e1d619112e8036694-2.png

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

1705107929_65a1e1d95248daf2c0444-2.png

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

web22 基于子域名的爆破

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

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

1705107933_65a1e1ddcac993e66a863-2.png

web23 基于数学的爆破

访问网站,源码如下:

PHP

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 位。

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

PHP

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

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

1705107940_65a1e1e47e90fae4f1e79-2.png

web24 随机种子

Hint: 爆个🔨

访问网站,源码如下:

PHP

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

1705107944_65a1e1e88b43ddaaaa7c5-2.png

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

PHP

1 2 3 4<?php mt_srand(372619038); echo mt_rand(); // 1155388967 ?>
1705107948_65a1e1ec4d11245d83a86-2.png

web25 随机种子爆破

Hint: 爆个锤子,不

题目源码如下:

PHP

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

源码解读如下:

1705107953_65a1e1f157dd7001bf5a4-2.png

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

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

1705107965_65a1e1fd3f3fd3a9421c9-2.png

PHP

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

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

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

1705107968_65a1e200b633749fa3989-2.png

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

1705107973_65a1e20590fedc0dd44db-2.png

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

1705107977_65a1e2093034edc0be98a-2.png

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

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

PHP

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

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

题目源码:

PHP

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

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

1705107983_65a1e20f2890dd5543650-2.png

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

PHP

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 空密码登陆

访问靶机出现如下页面:

1705107989_65a1e2152a04f77379db7-2.png

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

1705107993_65a1e219d664e69789b66-2.png

web27 身份证枚举

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

1705107998_65a1e21e7b5e8ecbf44cd-2.png

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

1705108004_65a1e224412a7d5c91d20-2.png

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

1705108007_65a1e227893624e8e05c7-2.png

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

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

1705108011_65a1e22b3ed200a56dd59-2.png

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

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

1705108014_65a1e22eda3ddfa1e0676-2.png

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

1705108020_65a1e2348b82fadf73547-2.png

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

1705108027_65a1e23b17d54b86d3a7f-2.png

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

1705108032_65a1e240cda38e698856e-2.png

web28 目录枚举

访问网站出现如下页面:

1705108038_65a1e246451b10a448819-2.png

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

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

1705108041_65a1e249b92ecfc606d04-2.png

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

1705108045_65a1e24dc4832395dc24c-2.png
1705108051_65a1e253c5d987909f2a4-2.png

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

1705108055_65a1e257a4d4031c1c1f1-2.png
1705108063_65a1e25fb9160f7668651-1.png

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

© 版权声明
THE END
喜欢就支持一下吧
点赞13打赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容