下面是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
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__); } ?> |
通过代码审计发现:
- 要第 2 位与第 15 位与第 18 位相同 (因为下标是从 0 开始)
- 要第 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

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

这里我们本地使用 PHP7.2 进行测试得到的随机数为 1155388967
,测试代码如下:
PHP
1 2 3 4 | <?php mt_srand(372619038); echo mt_rand(); // 1155388967 ?> |

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’); } ?> |
源码解读如下:

由于种子是由 FLAG 的 md5 值,截取前 8 位转为十进制生成的,我们并不知道随机数种子是多少,因此这里需要使用 php_mt_seed
进行种子爆破。
首先我们先传入 ?r=0
会得到一个负的随机数

PHP
1 2 | # 当我们传入 ?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
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 3 | if($_COOKIE[‘token’]==(mt_rand()+mt_rand())){ echo $flag; } |
添加 Cookie 属性 token
字段值为:2274592836
,并传入参数 r
其值为 192346317

这里为什么传入 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 空密码登陆
访问靶机出现如下页面:

使用 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 的页面:


以上是这一章节所有的内容的详解。
暂无评论内容