web21
前置知识:tomcat 认证爆破之custom iterator使用:https://www.cnblogs.com/007NBqaq/p/13220297.html
这里爆破的内容是账号密码,但是是被base64加密过的并且格式是xx:xx

这里需要用到bp的Sniper
模式,payload选择custom iterator
(自定义迭代器)模式
迭代器模式:大白话来讲就是把一个payload位置分成多个部分
这里把payload分成三个部分,下图为三部分在payload中的对应

在位置3放入ctfshow给的字典,并选择base64编码处理


开爆就能出flag
web22
用fofa可以查子域名,这里网站关了查不到
flag.ctfshow.com
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__);
}
?>
这里要满足两个条件:
- MD5加密后的要使第二位,第十五位和第十八位相同(下标从0开始)
- 第二位+第十五位+第十八位/第二位=第三十二位
exp:
import hashlib
import itertools
def check_token(token):
"""
检查给定的 token 是否符合特定的条件。
1. token 的 MD5 哈希值的第 2、15 和 18 个字符相同。
2. 这些字符的整数值与第 32 个字符满足特定的算术关系。
"""
hashed_token = hashlib.md5(token.encode()).hexdigest()
# 条件1:检查第 2、15 和 18 个字符是否相同
if not (hashed_token[1] == hashed_token[14] == hashed_token[17]):
return False
# 条件2:检查特定的算术关系
try:
char1 = int(hashed_token[1])
char31 = int(hashed_token[31])
# 避免除零错误
if char1 == 0:
return False
if (3 * char1) / char1 == char31:
# 第 2、15 和 18 个字符是相同的,因此它们转成整数值也是相同的,所以直接用 3 倍关系
return True
except ValueError:
return False
return False
# 定义包含所有字母和数字的字符集
characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
# 遍历所有可能的组合(这里以长度为1到5为例,可以根据需要调整)
for length in range(1, 6): # 尝试长度从 1 到 5 的组合
for candidate in (''.join(c) for c in itertools.product(characters, repeat=length)):
if check_token(candidate):
print(f"符合条件的 token 是: {candidate}")
break # 找到符合条件的 token 后停止
else:
continue # 如果内循环没有中断,则继续外循环
break # 找到符合条件的 token 后,退出外循环
else:
print("没有找到符合条件的 token") # 如果所有组合都不符合条件,输出消息
得到答案:ZE(官方是3j,其实就是字库多了大写字母导致的)
官方exp:
#coding: utf-8
#啊韬
import hashlib
dic = '0123456789qazwsxedcrfvtgbyhnujmikolp'
md5 = hashlib.md5(dic).hexdigest()
for a in dic:
for b in dic:
t = str(a)+str(b)
md5 = hashlib.md5(t).hexdigest()
#print md5
#print md5[1:2]
#print md5[14:15]
#print md5[17:18]
if md5[1:2] == md5[14:15] and md5[14:15]== md5[17:18]:
print t
print md5
print md5[1:2]
print md5[14:15]
print md5[17:18]
web24
这题不用爆破
<?phperror_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
有用的是mt_srand(372619038);
给了一个种子,这里涉及到mt_srand伪随机数的性质,只要有种子和相应的php版本,就能跑出固定的“随机数”
插件返回了php版本-7.3
<?php
mt_srand(372619038);
echo intval(mt_rand());
?>
#返回:1155388967
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');}
解出flag需要两个点:
- 拿到seed
- cookie传入token=两个
mt_seed
随机出来的数之和
先?r=0
拿到一个随机数:-1026503030
php_mt_seed:
time ./php_mt_seed 1026503030
#不要带负号
跑出来对应的结果
Found 2, trying 0x20000000 - 0x2fffffff, speed 383.5 Mseeds/s
seed = 0x2cbc0015 = 750518293 (PHP 7.1.0+)
Found 3, trying 0x30000000 - 0x3fffffff, speed 378.1 Mseeds/s
seed = 0x301dd5f1 = 807261681 (PHP 7.1.0+)
Found 4, trying 0x50000000 - 0x5fffffff, speed 380.2 Mseeds/s time ./php_mt_seed 102Found 4, trying 0x80000000 - 0x8fffffff, speed 370.9 Mseeds/s
seed = 0x8c570c23 = 2354514979 (PHP 7.1.0+)
exp:
<?php
$seedValue = 750518293.0;
$seedValue = (int)$seedValue;
mt_srand($seedValue);
$rand = mt_rand();
$rand1 = mt_rand();
$rand2 = mt_rand();
echo $rand,"\n",$rand1,"\n",$rand2,"\n",$rand1+$rand2,"\n\n";
?>
#第四项即为token值,若无回显,更换种子尝试
web26
抓包看到通过POST
传输的密码pass
,直接置空就能拿到flag0.o,
预期解是爆破(用web21给的字典即可)得出pass
->7758521

web27
很眼熟啊🤓

把录取名单搞下来看看,隐藏了出生年月日信息

这刚好有接口可以查,爆破一手高先伊

主要用到intruder
的日期爆破,参数设置如下

跑了几次跑出来了(这里容易跑不出来0.o)
号码:621022199002015237,学号:02015237
web28
需要逮着目录爆破

bp用Clusterbome(集束炸弹)
模式,两个payload集

最后在一条状态码为200的响应中拿到flag
Comments NOTHING