web21

需要用户名和密码才能继续访问

用户名猜一下admin

传到bp里爆破

GET / HTTP/1.1
Host: bb20197e-b7cb-42b4-a3ca-0d5a06291357.challenge.ctf.show
Cache-Control: max-age=0
Authorization: Basic MTExMTExMTExOjExMTExMTExMTExMTE=
Sec-Ch-Ua: "Chromium";v="133", "Not(A:Brand";v="99"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "Windows"
Accept-Language: zh-CN,zh;q=0.9
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Priority: u=0, i
Connection: keep-alive


我们注意到,

MTExMTExMTExOjExMTExMTExMTExMTE=

是我们刚刚随便输入的密码,中间被:分隔,再被base64编码了一次,传输到intruder里

标为payload处,设置条件

1.前缀admin:

2.base64编码

记得取消url编码

开始爆破

HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Wed, 02 Jul 2025 12:27:20 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
X-Powered-By: PHP/7.3.11
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: Content-Type,Cookies,Aaa,Date,Server,Content-Length,Connection
Access-Control-Allow-Headers: DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,x-auth-token,Cookies,Aaa,Date,Server,Content-Length,Connection
Access-Control-Max-Age: 1728000
Content-Length: 45

ctfshow{13e7a194-6d9a-4ed5-ae80-c51da9f628d8}

得到flag

ctfshow{13e7a194-6d9a-4ed5-ae80-c51da9f628d8}

web22

官方域名失效

web23

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-03 11:43:51
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-03 11:56:11
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/
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__);

}
?>

拿到题目,先对题目进行分析

传入token

if(substr($token, 1,1)===substr($token, 14,1) && substr($token, 14,1) ===substr($token, 17,1)){

要求token的MD5 的第 2 位、第 15 位、第 18 位字符必须相同

if((intval(substr($token, 1,1))+intval(substr($token, 14,1))+substr($token, 17,1))/substr($token, 1,1)===intval(substr($token, 31,1))){

把第 2、第 15、第 18 位字符转为数字(intval()),求和后除以其中一个(第 2 位),要求等于第 32 位字符的数值。

使用python脚本爆破得到符合题意的token

import hashlib

def check(md5_str):
c1 = md5_str[1]
c2 = md5_str[14]
c3 = md5_str[17]
c4 = md5_str[31]

# 条件1: 三位相等
if c1 != c2 or c2 != c3:
return False

# 条件2: (int(c1)+int(c2)+int(c3)) / int(c1) == int(c4)
try:
n1 = int(c1)
n2 = int(c2)
n3 = int(c3)
n4 = int(c4)
except:
return False

if n1 == 0:
return False

result = (n1 + n2 + n3) / n1
return result == n4

# 枚举输入
for i in range(0, 1000000):
s = str(i)
md5_val = hashlib.md5(s.encode()).hexdigest()
if check(md5_val):
print(f"[+] Found! Input: {s}")
print(f"MD5: {md5_val}")
break

最终得到token的值为422

提交得到flag

ctfshow{fd42cfa8-7422-4cba-b7c0-d5b628b0c492}

web24

mt_sand()伪随机数

mt_rand() 是 PHP 中的一个函数,用于生成 伪随机整数,它的全称是 Mersenne Twister random。它比早期的 rand() 函数速度更快、随机性更好,因此通常建议使用 mt_rand() 替代 rand()

这里给定了随机数种子372619038

若传递的r的值与随机出的一个值相同,就能得到flag

但mt_seed给定了种子,得到的随机数每一次都是相同的,我们可以提前运行一次mt_rand(372619038),把得到的值传递给r,就能得到flag

<?php
mt_srand(372619038);
echo mt_rand().'<br>';
?>

得到运行结果1155388967,将其传给r,得到flag

1155388967

web25

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-03 13:56:57
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-03 15:47:33
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


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

我的理解:

首先需要了解的几个值

1.种子:这里被设定为flag的md5值中截取8位数,作为种子数

确定了种子后,mt_rand()的每一次值都是确定的

2.r,r是我们传递的数,对破解种子和后面if(!$rand)起作用

3.rand,rand是 r与第一次mt_rand之差

接下来我们确定做题步骤

1.得到第一次mt_rand

我们可以通过设置r=0,得到-mt_rand

2.反向破解mt_rand,得到种子,有了种子,我们就能得到每一次mt_rand的值,最后得到flag

这里需要借助到反向破解mt_rand的工具:php_mt_seed

我们将mt_sand的值传入后,得到了很多值,这些种子运算一次得到的都是同一个值,

我们通过php的版本,得到可能是我们的种子,不多,多试几次就出来了

,有了种子,事情就好解决了

3.if(!$rand),rand的值必须为0,这样!0才会为真,让r=第一次mt_rand(),这样rand为0,进入下一步

4.传入token,用burpsuite也行,hackbar也行,传入token,得到flag

ctfshow{069a6013-d7e1-42a7-a6e5-0ca9e710f2fa}

web26

就是爆破一个密码值,爆出来就有flag了

ctfshow{68667d15-bbbf-43e2-9184-b74dbfbfb408}

web27

在录取名单中,我们能看到一些学生的姓名和部分身份证号,

我们选择迫害郎康焕同学()

郎康焕
522601********8092

很巧,522601********8092米被码住的地方是生日,我们选择使用bp,在查询系统中用日期爆破

最终得到身份证号:522601199210248092

接下来就用它拿到学号

恭喜您,您已被我校录取,你的学号为10248092 初始密码为身份证号码

至此

郎康焕
522601199210248092
10248092

登录后得到flag

恭喜您,登陆成功!ctfshow{f706753e-aa01-4cd7-8af8-7f1825c4f70b}

web28

拿到题目,看到url中有0/1/2.txt

在0和1两处添加payload位置,爆破后在72/20/处找到flag

ctfshow{205b50db-6eb2-4035-933c-3f3d1f3cb2e1}