web21

hint:爆破什么的,都是基操

随便输入一下,直接抓包

解码后看到是 账户:密码 的形式

使用给的字典进行爆破

得到结果

web22

hint:域名也可以爆破的,试试爆破这个ctf.show的子域名

对域名进行爆破,先访问一下看看

访问到vip.ctf.show时,发现flag

web23

hint:还爆破?这么多代码,告辞!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?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
* 上述部分是代码的头部信息,包含了编码格式声明、作者、日期、修改信息以及联系方式等相关说明,但通常和具体代码逻辑执行关联不大。
*/

// 关闭 PHP 的错误报告,这样在代码执行过程中如果出现错误,不会显示错误信息到页面等输出位置
error_reporting(0);

// 引入名为 'flag.php' 的文件,通常这里面可能包含了要输出的关键信息(比如题目中的 'flag'),但代码中未展示其具体内容
include('flag.php');

// 判断是否通过 GET 方式传递了名为 'token' 的参数
if (isset($_GET['token'])) {
// 如果传递了 'token' 参数,对其进行 MD5 加密处理,将加密后的结果赋值给 $token 变量
$token = md5($_GET['token']);
// 以下是一系列的条件判断,用于验证 $token 加密后字符串的特定位置字符是否满足一定关系
if (substr($token, 1, 1) === substr($token, 14, 1) && substr($token, 14, 1) === substr($token, 17, 1)) {
// 这里进一步验证通过截取 $token 字符串特定位置字符转换为整数后进行数学运算的结果是否满足特定条件
// 先将截取到的字符转换为整数,进行加法运算后除以第一个截取的字符,判断结果是否等于另一个截取位置字符转换后的整数
if ((intval(substr($token, 1, 1)) + intval(substr($token, 14, 1)) + substr($token, 17, 1)) / substr($token, 1, 1) === intval(substr($token, 31, 1))) {
// 如果上述所有条件都满足,就输出 $flag 变量的值,这里的 $flag 应该是从之前引入的 'flag.php' 文件中获取到的关键信息
echo $flag;
}
}
} else {
// 如果没有通过 GET 方式传递 'token' 参数,就使用 highlight_file 函数输出当前 PHP 文件的源代码内容,方便查看代码逻辑等情况
highlight_file(__FILE__);
}

?>

写脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import hashlib

# 定义要验证的条件函数
def check_token(token_md5):
if len(token_md5) < 32:
return False
first_char = token_md5[1:2]
fourteenth_char = token_md5[14:15]
seventeenth_char = token_md5[17:18]
thirty_first_char = token_md5[31:32]
if first_char == fourteenth_char and fourteenth_char == seventeenth_char:
try:
first_int = int(first_char, 16)
# 添加判断,如果first_int为0,直接返回False,避免出现除数为0的错误
if first_int == 0:
return False
sum_value = first_int + int(fourteenth_char, 16) + int(seventeenth_char, 16)
result = sum_value / first_int
thirty_first_int = int(thirty_first_char, 16)
return result == thirty_first_int
except ValueError:
return False
return False

# 简单的循环尝试不同的token值(这里示例只是简单从数字开始尝试,可以根据实际情况扩展范围等)
for i in range(100000):
token = str(i)
token_md5 = hashlib.md5(token.encode()).hexdigest()
if check_token(token_md5):
print(f"可能的token值: {token}")

结果如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
可能的token值: 422
可能的token值: 1202
可能的token值: 13702
可能的token值: 15456
可能的token值: 20770
可能的token值: 22877
可能的token值: 46617
可能的token值: 48969
可能的token值: 49255
可能的token值: 54388
可能的token值: 54674
可能的token值: 59384
可能的token值: 63281
可能的token值: 64413
可能的token值: 66039
可能的token值: 66478
可能的token值: 82614
可能的token值: 88310
可能的token值: 93326

输入得 flag

web24

hint:爆个🔨

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-03 13:26:39
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-03 13:53:31
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

* 上述部分是代码开头的注释信息,包含了编码格式声明、作者、日期、修改时间以及作者的邮箱和相关链接等内容,属于代码的元信息描述,和核心逻辑执行关联性不大。
*/

// 关闭PHP的错误报告功能,意味着代码执行过程中即使出现错误,也不会主动向页面等输出位置显示错误提示信息。
error_reporting(0);

// 引入名为 "flag.php" 的文件,通常推测这个文件里可能定义了关键的变量(比如可能存储着要输出的类似 "flag" 这样的关键信息),不过这里没有展示 "flag.php" 的具体内容。
include("flag.php");

// 判断是否通过GET方式传递了名为 "r" 的参数。
if (isset($_GET['r'])) {
// 如果传递了名为 "r" 的参数,就将其值赋给变量 $r。
$r = $_GET['r'];
// 使用固定的种子值 372619038 来初始化随机数生成器(mt_srand),这意味着后续每次调用 mt_rand() 生成的随机数序列将是固定的。
mt_srand(372619038);
// 将用户传入的参数 $r 转换为整数(intval),并与通过 mt_rand() 函数生成的随机数(同样转换为整数后)进行严格相等(===)比较。
// 如果两者相等,就输出 $flag 变量的值,这里的 $flag 应该就是从前面引入的 "flag.php" 文件中获取到的关键信息。
if (intval($r) === intval(mt_rand())) {
echo $flag;
}
} else {
// 如果没有通过GET方式传递 "r" 参数,就先使用 highlight_file 函数输出当前这个PHP文件自身的源代码内容,方便查看代码逻辑等情况。
highlight_file(__FILE__);
// 接着执行系统命令 "cat /proc/version",并输出该命令执行后的结果,这个命令通常用于查看当前系统的内核版本等相关信息。
echo system('cat /proc/version');
}

?>

✨伪随机数

mt_srand(372619038) 已经用固定的种子初始化了

mt_rand() 在相同次数生成的随机数都是固定的

比如两台设备,使用同一个随机数种子初始化之后。他们相同次数产生的随机数是一致的,但是不同次数之间产生的随机数是不一致的。

1
2
3
<?php
mt_srand(372619038);
echo intval(mt_rand());

web25

hint:爆个🔨,不爆了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?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

* 上述部分是代码头部的注释信息,包含了诸如编码格式声明、作者信息、创建及修改日期、作者邮箱以及相关链接等内容,主要是对代码的一些基础描述,与具体的代码执行逻辑关联性不大。
*/

// 关闭PHP的错误报告功能,这样在代码执行过程中如果出现错误,不会将错误信息显示在页面等输出位置。
error_reporting(0);

// 引入名为"flag.php"的文件,通常这个文件里可能定义了关键的变量(例如可能包含了要输出的类似"flag"这样的重要信息),不过代码中并未展示"flag.php"的具体内容。
include("flag.php");

// 判断是否通过GET方式接收到名为"r"的参数。
if (isset($_GET['r'])) {
// 如果接收到了名为"r"的参数,将其值赋给变量$r。
$r = $_GET['r'];
// 以下这行代码逻辑较为关键且复杂:
// 首先对$flag变量(从前面引入的"flag.php"中获取,推测其存储重要信息)进行MD5加密,然后截取加密结果的前8个字符,再通过hexdec函数将这8个十六进制字符转换为十进制数,最后用这个十进制数作为种子来初始化随机数生成器(mt_srand)。
// 这样做意味着随机数生成的序列是基于$flag的部分MD5值来确定的,增加了一定的关联性和复杂性。
mt_srand(hexdec(substr(md5($flag), 0, 8)));
// 计算一个差值,用通过GET方式获取的参数$r转换为整数后,减去由初始化后的随机数生成器(基于前面的规则)生成的随机数(同样转换为整数),并将这个差值赋值给变量$rand。
$rand = intval($r) - intval(mt_rand());
// 判断$rand的值是否为0(通过将$rand作为布尔值判断,值为0时在PHP中会被视为false,非0值视为true),如果为0,进入下面的嵌套判断。
if ((!$rand)) {
// 进一步判断,检查名为"token"的COOKIE值是否等于两次调用mt_rand函数生成的随机数相加的结果(这里每次生成的随机数基于前面设定的种子,有一定关联性)。
// 如果这个条件也满足,就输出$flag变量的值,也就是期望的关键信息。
if ($_COOKIE['token'] == (mt_rand() + mt_rand())) {
echo $flag;
}
} else {
// 如果$rand的值不为0,直接输出这个差值$rand的值,可能用于调试或者反馈给用户一些信息。
echo $rand;
}
} else {
// 如果没有通过GET方式接收到名为"r"的参数,先使用highlight_file函数输出当前这个PHP文件自身的源代码内容,方便查看代码逻辑等情况。
highlight_file(__FILE__);
// 接着执行系统命令"cat /proc/version",并输出该命令执行后的结果,这个命令通常用于查看当前系统的内核版本等相关信息。
echo system('cat /proc/version');
}

?>

✨我们可以看到这次生成的随机数也是固定的,先传入 r=0,得到 mt_rand() 的值

✨看出 mt_rand()值为 47716040 , 传入 r= 47716040

使用 php_mt_seed 脚本爆破种子

可见,我们爆出了一堆种子,并且知道了版本,那么之后一个一个试

1
2
3
4
5
<?php
mt_srand(2795750851);
echo mt_rand().PHP_EOL;
echo mt_rand()+mt_rand();
// token的值第二和第三次随机数的和

web26

hint:这个可以爆

抓包爆破

web27

hint:CTFshow菜鸡学院招生啦!

抓包爆破

使用集束爆破

爆破出是 19900201

解码一下

解码一下

结束

web28

hint:大海捞针

看 url 有 3 个位置可以爆破

✨通过多次测试,只要位置 3 存在,无论修改哪个位置,都会导致页面重定向,因此要删去位置 3,对 1 和 2 位置进行爆破

使用集束爆破

设定从 0 到 100

出结果了

查看响应