[SWPUCTF 2022 新生赛]1z_unserialize
打开题目
分析源码
首先定义了一个名为lyh的类和三个全局变量,其中$url被初始化为字符串‘NSSCTF.com’,$lt和$ily未初始化
然后魔术方法_destruct()在对象被销毁是自动调用,在代码中,试图执行$lt作为函数,传入$ily作为参数
下面unserialize($_POST['nss'])
为反序列化
将 $a 赋值为 system ,也就是将 $this->lt 赋值为 system 即可(system
函数是一个执行外部程序并显示其输出的函数)
传入nss=O:3:"lyh":3:{s:3:"url";s:10:"NSSCTF.com";s:2:"lt";s:6:"system";s:3:"lly";s:9:"cat /flag";}
解释:nss=O:3:"lyh":3:{s:3:"url";s:10:"NSSCTF.com";s:2:"lt";s:6:"system";s:3:"lly";s:9:"cat /flag";}
O:表示class 3:表示类名lyh长度为3 :3表示有三个属性 {...}括号内包含了属性的序列化表示 s:3:"url";s:10:"NSSCTF.com";表示第一个属性为url,长度为3,他的值为字符串NSSCTF.com长度为10
s:2:"lt";s:6:"system"表示第二个属性it,长度为2,他的值为字符串system,长度为6
s:3:"lly";s:9:"cat/flag"表示第三个属性lly,长度为3,值为字符串cat/flag,长度为9,这将会是传递给system函数的命令,用于读取/flag文件的内容
[SWPUCTF 2022 新生赛]ez_ez_unserialize
打开题目
分析源码
首先定义了一个名为x的类,然后定义了一个公共属性$x并初始化为当前文件的路径(_FILE_为一个魔术常量,表示当前文件的完整路径和文件名)
function_construct()为类的构造函数,当创建新实例时自动调用,他接受一个参数并将其赋值给属性$x
function_wakeup()为当对象被反序列化时,_wakeup会自动调用,实现检查$x属性值是否不等于当前文件的路径,若不等于,会将$x重新设置为当前文件的路径
function_destruct为当对象被销毁时自动调用,此处为高亮显示$x指定内容
由注释可得到信息为flag在名为fllllllag.php
的文件中
if (isset($_REQUEST['x'])) 用于检查是否有一个名为x的请求参数
@unserialize($_REQUEST['x']); 若x参数存在,进行反序列,@用于抑制由@unserialize产生的错误或警告
若没有x请求参数,代码将会高亮显示当前文件内容
这个题目关键在于绕过_wakeup(绕过方式:序列化字符串中表示对象属性个数的值大于真实属性个数时可以跳过_wakeup)
输入?x=O:1:"x":2:{s:1:"x";s:13:"fllllllag.php";}
得到flag
[SWPUCTF 2021 新生赛]ez_unserialize
打开靶机发现
查看源码
发现有robots.txt
在这一部分中User-agent:*是一个适用于所有网络爬虫的通用规则
Disallow:什么东西呢?是一个无用的robotx.txt规则。因为通常Disallow:后应该是一个路径或路径模式
先上传一个robots.txt看一下,发现给出了一个路径
将路径上传,发现php代码
分析源码
首先关闭了所有错误报告然后定义了一个名为wlim的类,其中有两个全局变量$admin和$passwd,两个魔术方法_construct() , _destruct()
_construct()为构造函数,自动调用,使admin的值为user,passwd的值为123456
_destruct()在对象被销毁时调用,若admin的值为admin且passwd的值为ctf,则执行flag.php文件输出flag,否则输出admin和passwd的值和字符串just a bit more
$p=$_GET['p']从URl的p参数中获取值,储存在变量p中
unserialize($p)对p中的值进行反序列化
通过分析源码发现传入?p=O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}即可