web21
抓包,
说实话,第一次见的时候,觉得有误,因为没有username和password这两个熟悉的,但发现了一串base编码的,解码后发现,这就是刚刚输入的admin
抓包爆破操作:
最后取消url-encode;
解码得到账号密码:
登陆后得到flag:
ctfshow{84d978aa-b67f-451a-9177-a967b4ce2dcd}
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__);
}
?>
第1/14/17位需要相等,此外,整数相加后除以第一位的值与第31位相等:
php脚本如下:
<?php
for ($i = 0; $i < 10000; $i++) {
$token = md5($i);
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 $token . ":" . $i;
}
}
}
结果:
pytho脚本如下:
import hashlib
for i in range(10000):
token = hashlib.md5(str(i).encode('utf-8')).hexdigest()
if token[1] == token[14] == token[17]:
if token[1] != '0' and (int(token[1], 16) + int(token[14], 16) + int(token[17], 16)) / int(token[1], 16) == int(token[31], 16):
print(f"{token}:{i}")
没想到python跑出了2各结果;传值得到flag
ctfshow{acdcdabc-6e06-4780-8fd3-5b2ed11701d7}
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
当r等于随机值时,输出flag,但是此处的种子固定,值不变,运行出值
<?php
mt_srand(372619038);
echo mt_rand();
1155388967
传参得到flag:
ctfshow{f0393421-d40e-4033-95ed-5e107a82bb3e}
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
分析
mt_srand(hexdec(substr(md5($flag), 0,8)));
将flag进行md5加密,返回从第一个到第八个数,再将数字加密
!$rand
需要满足这个条件,即rand=0,也即r=mt_rand()
接着满足token
等于mt_rand()+mt_rand()
,这里写+
的意思是第一次加密的值加上第二次加密的值
我们首先需要获取第一个加密的值
因此如果给r传0的话,就会生成随机数,这个时候就可以逆序推出种子!利用脚本
https://www.openwall.com/php_mt_seed/
解压后文件夹中有三个文件,Makefile文件是用来告诉make需要做什么
在Linux中执行 make 之前,需要一个命名为 Makefile 的特殊文件(本文的后续将使用Makefile 作为这个特殊文件的文件名)来告诉 make 需要做什么(完成什么任务),该怎么做。
在kali中逆推
┌──(root㉿kali)-[~/Desktop/php_mt_seed-4.0]
└─# ./php_mt_seed 1958754220
Pattern: EXACT
Version: 3.0.7 to 5.2.0
Found 0, trying 0x18000000 - 0x1bffffff, speed 8053.1 Mseeds/s
seed = 0x1b1315de = 454235614 (PHP 3.0.7 to 5.2.0)
seed = 0x1b1315df = 454235615 (PHP 3.0.7 to 5.2.0)
Found 2, trying 0xfc000000 - 0xffffffff, speed 10840.7 Mseeds/s
Version: 5.2.1+
Found 2, trying 0x3c000000 - 0x3dffffff, speed 151.4 Mseeds/s
seed = 0x3d5fd16a = 1029689706 (PHP 7.1.0+)
Found 3, trying 0xfe000000 - 0xffffffff, speed 126.3 Mseeds/s
Found 3
得到种子: 1029689706(选择php版本对应的种子
利用脚本寻找token的值
<?php
mt_srand(1029689706);
echo mt_rand()."\n";
$result = mt_rand()+mt_rand();
echo $result;
// 输出
1958754220
1985633197
bp抓包操作,输入r值和token值
web26
这题在抓包之后,我在Repeater模块内,点击send后,直接出现了flag:
至于为啥不知道.
上面是未填写的情况,下面演示正常抓包
web27
在网页中将学生的个人信息下载下来:
发现,身份信息中的出生日期被覆盖了,我们直接上bp:
要注意这个格式,因为要注意配合身份证的格式
得到了身份证号;
得到学号:
得到flag
web28
这题界面属实简洁
发现url上有疑似目录爆破的地方;
在根据提示,进行爆破: