CTF SHOW

Web 21~28

Web21

使用bp进行抓包,在Authorization里发现奇怪的东西

image-20250310223044875

base64解密后获得以下东西

image-20250310223132131

发现是我们输入的账号和密码。题目已经说了账号是admin,所以我们需要爆破得出密码即可。密码本题目已经给了。

使用自定义迭代器

image-20250310223253005

格式是:用户名:密码,分为三部分

第一部分是:admin

第二部分是:“ : ”

第三部分就是密码了。这里密码一个个替换成字典中的密码(记得用题目给的附件,不然时间太久了),然后看是否返回一个有效页面(200OK)

image-20250310223520745image-20250310223536652image-20250310223920172

接着,需要对发送的内容进行base64加密

image-20250310224026389image-20250310224033662

最后记得把payload encoding关掉,避免影响base64密文

开始攻击

得到一个成功的

image-20250310224226022

我们查看返回的页面即可获得flag

Web22

域名爆破

Web23

题目

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
<?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__);
}
?>

前置基础知识

substr函数
1
substr(string, start, length)
  • string:必需。规定要返回其中一部分的字符串

  • start:必需。规定在字符串的何处开始

    • 正数:在字符串的指定位置开始
    • 负数:在从字符串结尾的指定位置开始
    • 0:在字符串的第一个字符处开始
  • length:可选。规定要返回的字符串长度。默认是直到字符串的结尾

    • 正数:从start参数所在的位置返回
    • 负数:从字符串末端返回
isset函数

用于检测变量是否已设置并且非 NULL

1
bool isset(mixed $var [, mixed $...] )
  • $var:要检测的变量

如果一次传入多个参数,那么 isset() 只有在全部参数都被设置时返回 TRUE,计算过程从左至右,中途遇到没有设置的变量时就会立即停止。

intval函数

用于获取变量的整数值

1
int intval( mixed $var [, int $base = 10] )
  • $var:要转换成integer的数量值
  • $base:转化所使用的进制

如果base是0,则通过检测var的格式来决定使用的进制:

  • 如果字符串包含了“0x”,使用16进制
  • 如果字符串以“0”开头,使用八进制
  • 否则使用十进制
md5加密

信息摘要算法,用于认证。将任意长信息生成128比特的(0,1)串。

题目分析

抓包得到以下内容

image-20250311132227471

根据题目分析,需要手动设置token。其中:

  1. token通过md5加密

  2. token[1]=[14]=[17]

  3. (token[1]+[14]+[17]) / token[1] = token[31]

脚本

1
2
3
4
5
6
7
8
9
10
11
import hashlib

for i in range (100000):
token = str(i)
token_md5 = hashlib.md5(token.encode()).hexdigest()

if token_md5[1].isdigit() and token_md5[14] and token_md5[17].isdigit() and token_md5[31].isdigit():
if token_md5[1] == token_md5[14] == token_md5[17] and int(token_md5[1]) !=0:
if (int(token_md5[1]) + int(token_md5[14]) + int(token_md5[17])) / int(token_md5[1]) == int(token_md5[31]):
print(token)
print(token_md5)

将得到的符合要求的token加到url后即可,如:

1
https://f3489a03-f66f-418a-996e-8ad7d1ec9ac6.challenge.ctf.show/?token=422

其他思路

使用burp爆破得到token

Web24

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?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
*/
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

前置基础知识

mt_srand函数

函数播种MErsenne Twister随机数生成器

1
mt_srand(seed);

seed: 可选。规定播种值

种子确定的随机数生成器生成序列相同

题目分析

题目给了种子:372619038

同时发现了下方有时间戳等等信息

是以哦那个随机数生成器,要求r和指定种子生成的随机数相同才能给flag

脚本

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

结果得到:

标准输出:1155388967

故只需要在url后加上r=1155388967即可

Web25

题目

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

前置基础知识

hexdec函数

把十六进制转化为十进制

1
hexdec(hex_string)

hex_string: 必需。规定要转换的十六进制字符串

php_mt_seed工具

随机数的产生基于种子。但是可以通过产生的随机数来猜测种子,进而猜测后续的随机数

需要指明的是,不同版本的php,同一个种子产生的随机数有可能不同

1
./php_mt_seed [number]

后续会得到不同版本php下对应可能的种子

题目分析

需要GET请求发送r的值

  1. 设置种子。种子为hexdec(substr(md5($flag), 0,8))
  • 将flag进行md5加密(得到长度为32的16进制串)
  • 截取flag_md5的0~8子串
  • 将子串转化为十进制数
  1. 得到rand。rand为:

    输入的r转化为int - 生成的第一个随机数

    要求结果为0,即输入数等于生成的随机数

  2. 需要设置cookie,cookie为生成的第二个随机数 + 第三个随机数

脚本

首先通过分析,得出输入0可以得到生成的第一个随机数的相反数

image-20250311154351542

也就是说,生成的第一个随机数是1059248734

这个时候需要使用到php_mt_seed工具进行爆破

image-20250311201058074

最后通过尝试,得出php的版本是7.1.0+

后续省略了(因为赶时间懒不做了)

Web26

我就抓了个点击同意安装后的包后,重发,就找到flag了???

还真是这样做的,不知道和爆破有什么关系

Web27

这个题我感觉是很有感觉的

打开是一个教务管理系统的登录页面

image-20250311202238331

注意到下方还有两个链接

一个打开后下载了名单

image-20250311202420630

另一个打开后是录取查询

image-20250311202449498

由于名单中给出了姓名和部分身份证号码,所以我们可以进行爆破

我选择爆一下这个党员,因为主播觉得要严查一下这个党员

首先抓包

image-20250311202851294

密码并没有进行加密,所以直接对生日这一块进行爆破就可以

如何缩短爆破的条数是我们需要考虑的

这里需要设置payload格式为date,且date自定义格式为yyyyMMdd

image-20250311204825109

得到有一个回复特别长的

image-20250311210447707

一般这种就是成功的了

得到以下内容

1
{"0":"success","msg":"\u606d\u559c\u60a8\uff0c\u60a8\u5df2\u88ab\u6211\u6821\u5f55\u53d6\uff0c\u4f60\u7684\u5b66\u53f7\u4e3a10167653 \u521d\u59cb\u5bc6\u7801\u4e3a\u8eab\u4efd\u8bc1\u53f7\u7801"}

这中文使用给的Unicode编码,解密一下就好了

得到以下内容

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

大功告成了

身份证号码即为:360730199110167653

Web28

乍看有点像信息搜索

所以我就使用信息搜索三件套试试看

都没有成果

接着看这个网址有点蹊跷

1
https://26e2702c-3e14-4f64-a9f7-631273587e0b.challenge.ctf.show/0/1/2.txt

试试直接访问flag.txt没有成功

访问1/被拦在外面了

乍一看能入手的地方只有这个url了,完全没有思路啊

前置基础知识

302跳转

待编写

题目分析

用bp抓包后,发现原url是进行了302跳转才进入了原url /0/1/2.txt

如果直接访问 /0/1,会进行302跳转,然后跳转就会进入死循环,最后打不开

根据题目提示需要爆破,那么爆破点只能是原url后面这两个目录了

如何设置payload这里就不详细解释了

image-20250311213016197