CTFshow-爆破(Web21-28)

Web21

抓包

image-20241210113032407

选则dic.zip里的字典爆破,记得添加前缀admin:

答案admin:shark63

burp里有一个自定义迭代器,可以设置前几部分,很好用

Web22

题目失效了直接看wp吧

360quake 使用空间搜索引擎—>360quake 搜索语法—>domain=“ctf.show” 可以搜索出子域名—>vip.ctf.show 可以发现子域名vip.ctf.show下面有flag—>flag{ctf_show_web}

Web23

直接给源码

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

3+3+3/3=3

写解密代码

import hashlib

# 遍历可能的输入 token
for i in range(1000000):  # 6位以内的数字
    token = str(i)
    md5_hash = hashlib.md5(token.encode()).hexdigest()
    # 获取需要的索引值
    a = md5_hash[1]
    b = md5_hash[14]
    c = md5_hash[17]
    d = md5_hash[31]
    # 条件 1: 第1位, 第14位, 第17位相等
    if a == b == c:
        # 条件 2: (a + a + a) / a = 3 且第31位等于3
        if d == '3' and a.isdigit():
            a = int(a)
            if a != 0 and (a + a + a) / a == 3:  # 确保 a 不为 0,且 (a + a + a) / a == 3
                print(f"Found token: {token}")
                print(f"MD5: {md5_hash}")
                break

答案422

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

?> Linux version 5.4.0-163-generic (buildd@lcy02-amd64-067) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)) #180-Ubuntu SMP Tue Sep 5 13:21:23 UTC 2023 Linux version 5.4.0-163-generic (buildd@lcy02-amd64-067) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)) #180-Ubuntu SMP Tue Sep 5 13:21:23 UTC 2023

image-20241210144418325

mt_srand查了之后发现是个伪随机数

直接提交得Flag

Web25

<?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');
}
Linux version 5.4.0-163-generic (buildd@lcy02-amd64-067) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)) #180-Ubuntu SMP Tue Sep 5 13:21:23 UTC 2023 Linux version 5.4.0-163-generic (buildd@lcy02-amd64-067) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)) #180-Ubuntu SMP Tue Sep 5 13:21:23 UTC 2023

就是r要和hexdec(substr(md5($flag), 0,8))产生的伪随机数相同

flag的md5形式的前八位的十进制形式,token要为两个伪随机数相加

echo $rand;实际上会输出,我们不必去爆破10进制的8位

输入r =0 ,那么肯定会输出-rand

-1810958455

1810958455

mt_rand()+mt_rand())不是简单的相加,固定种子随机数,用过一次,下次就变了,但是有了第一次的结果,我们就可以反向推得种子值

php伪随机数爆破种子-CSDN博客

image-20241210200735980

<?PHP 
$x=2282835081; 
mt_srand($x); 
$a1=mt_rand(); 
$a2=mt_rand(); 
$a3=mt_rand(); 
$a4=$a2+$a3; 
echo "种子是:".$x.""; 
echo "随机数第1次的结果是:".$a1.""; 
echo "随机数第2次的结果是:".$a2.""; 
echo "随机数第3次的结果是:".$a3.""; 
echo "随机数第2+3次的合计数是:".$a4.""; 
?>

然后设置cookie,token=xxx就行

Web26

image-20241210202209232

注意前端一定要有@符号格式,我们可以抓包,然后修改,再去爆破

Web27

image-20241210202747773

可以查录取信息

621022xxxxxxxx 5237

爆破年月日可以得身份

依旧burp抓包

{“0”:“success”,“msg”:“\u606d\u559c\u60a8\uff0c\u60a8\u5df2\u88ab\u6211\u6821\u5f55\u53d6\uff0c\u4f60\u7684\u5b66\u53f7\u4e3a02015237 \u521d\u59cb\u5bc6\u7801\u4e3a\u8eab\u4efd\u8bc1\u53f7\u7801”}

image-20241210204303592

621022199002015237

image-20241210204359856

02015237

登陆即可

Web28

根据提示爆破,

通过暴力破解目录/0-100/0-100/看返回数据包。爆破的时候去掉2.txt 仅仅爆破目录即可

image-20241210205319816