CTFshow-web爆破

目录

web21

web22

web23

web24

web25

web26

web27

web28


web21

刚开始的第一个题,由于不好好看题,导致没注意下面已经给出了网页后台的爆破密码的字典,导致我使用了10w的字典去跑,很尴尬。这里我使用的是第一种方法,就是brupsuite种的暴力破解模块。

上来就是让我们输入账号密码。输入账号为admin,密码随便输入,经过抓包查看。

由于是小白,我没看到数据在哪里,但是发现这不是一串base64编码的值吗,尝试解码,咦,发现了这就是账号和密码。

然后看了wp,这是tomcat认证爆破。Authorization后面就是账号:密码,经过了base64编码。之后我就拿着它到Intruder模块去爆破了。

这里就先经过标记下,payload type选择custom iterator(自定义迭代器),position为3,因为payload的构成是账号:密码。其中position 1 为admin。position 2 为:

position 3 为:

这里密码的位置就加载我们的字典。加密的方式选择base64-encode。

取消url对特殊字符的编码。

开启爆破,找到状态码为200的数据包,通过base64解码,发现了密码为shark63。登录之后便可以发现flag。

web22

题目描述为:域名也可以爆破的,试试爆破这个ctf.show的子域名

但是找到的域名失效了,题目提示:页面如果失效,提交flag{ctf_show_web}

web23

附上代码:

<?php
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__);

}
?>

这里我自己分析:通过GET方式传入token参数,然后经过了md5加密,再赋值给token,截取token的第1位,第14位,以及第17位,他们是相等的。然后第1位,第14位,以及第17位相加的和再除以第一位等于第31位的值。就会输出flag。但是一直不理解的就是token为什么就是由两位组成的呢?(如果有大佬知道的话,希望能指点一下,非常感谢。)

这里也是存在两种方法,一种就是使用brup爆破。另一种就是使用脚本。提供的脚本如下:

import requests

strings='01234567989abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
for i in strings:
    for j in strings:
        url = 'http://0b47349f-dd88-4a11-a6aa-ec797c1d3222.challenge.ctf.show/?token='+str(i)+str(j)
        req = requests.get(url)
        if 'ctfshow' in req.text:
            print(req.text)
            exit()

web24

题目描述为:爆个锤子。

打开链接:得到的源码为

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

?>

开始代码审计。get方式提交参数名r。mt_srand()函数:mt_srand() 播种 Mersenne Twister 随机数生成器。语法为:

mt_srand(seed);其中的seed是必需的。用 seed 来给随机数发生器播种。

百度没明白。这里我拿着他的代码,去运行了一下看了一下结果是什么。

<?php
    mt_srand(372619038);
    echo(intval(mt_rand()));
    /**/
?>
//输出1155388967

这里我就直接get提交r =1155388967。就得到了flag。

wp中用了脚本,看不懂。

web25

在这里就搞懂了,上面的那两个函数存在的漏洞是怎么回事。

先来看这里的代码。

<?php  
mt_srand(372619038);    
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
?> 
/*
1155388967
125197722
1461103528
623173601
79064459
*/

上面讲到,就是生成随机数,但是通过第一个数1155388967,就能发现一个很奇怪的地方,这不是和24题生成的结果是一样的嘛!所以这就是漏洞所在的地方,虽然是生成随机数,但是存在一定的可预测性。

经过代码审计。当r=0的时候,rand的值就是第一次生成的随机数的相反数,这里下载种子的链接如下:php_mt_seed - PHP mt_rand() seed cracker

在kali中运行:

tar -zxvf php_mt_seed-4.0.tar.gz    
su root  #需要root用户权限
cd php_mt_seed-4.0
make
./php_mt-seed 输入第一次生成的随机值

 这里还遇到一个问题,在运行su root的时候,出现了su:鉴定故障。这里的解决方案就是sudo passwd root 修改密码。

 得到了不同版本的随机值。查看php的版本为:X-Powered-By:PHP/7.3.11

由于hexdec是讲十六进制转换为十进制。先尝试4053774893

<?php  
mt_srand(4053774893);    
mt_rand();
$token = mt_rand()+mt_rand();
echo $token;

?>    
//输出的结果为1006930507    

接下来看关键的代码:

if((!$rand)){
        if($_COOKIE['token']==(mt_rand()+mt_rand())){
            echo $flag;
        }
    }

if((!rand))只有条件为0的时候才会执行内部的代码,所以r的值要等于第一次的值即1193648967

接下来就是使用brup抓包。token的值为第二次和第三次随机值的和。(注意:我是先尝试的4053774893,其实不对,后来我又尝试了2731346054,得到的第二次随机值加上第三次随机值的结果为1138349886)。

web26

 抓包爆破密码。

 

得到密码为7758521,查看response,得到flag。

web27

打开网站之后,可以获取到网站的录取名单,查看名单,发现了有姓名和身份证号,身份证中缺少了出生年月日。

 尝试在学籍管理系统中爆破出生年月。

这里只能使用谷歌进行抓包

这里发现了19900201的数据包的长度有变化。 

 这里发现了应答数据包中存在着一串经过unicode编码,尝试解码。

 

尝试使用账号和密码进行登录。

 

登陆成功得到了flag。 

web28

进入界面:

刚开始没有头绪,不过注意到了url是http://xxxx/0/1/2.txt ,有点奇怪,没想到是爆破url,查看了hint:通过暴力破解目录/0-100/0-100/看返回数据包。爆破的时候去掉2.txt 仅仅爆破目录即可。

接下来就是抓包,去爆破目录。

发现目录为/72/20/的时候状态码为200。

这里就找到了flag。

猜你喜欢

转载自blog.csdn.net/weixin_44770698/article/details/125430254