趁着平台还开放,赶紧复现一下:
- Ezunserialize(Joomla 的逃逸)
参考链接:
https://xz.aliyun.com/t/6718#toc-2 - babytricks
参考链接:
https://www.cnblogs.com/test404/p/7821884.html
https://blog.csdn.net/weixin_41185953/article/details/80485075
https://www.leavesongs.com/PENETRATION/thinking-about-config-file-arbitrary-write.html
https://www.anquanke.com/post/id/197745
一、Ezunserialize
这题是Joomla 的逃逸,直接搜就能搜到几乎差不多的题目分析
题目给了源码:
<?php
show_source("index.php");
function write($data) {
return str_replace(chr(0) . '*' . chr(0), '\0\0\0', $data);
}
function read($data) {
return str_replace('\0\0\0', chr(0) . '*' . chr(0), $data);
}
class A{
public $username;
public $password;
function __construct($a, $b){
$this->username = $a;
$this->password = $b;
}
}
class B{
public $b = 'gqy';
function __destruct(){
$c = 'a'.$this->b;
echo $c;
}
}
class C{
public $c;
function __toString(){
//flag.php
echo file_get_contents($this->c);
return 'nice';
}
}
$a = new A($_GET['a'],$_GET['b']);
//省略了存储序列化数据的过程,下面是取出来并反序列化的操作
$b = unserialize(read(write(serialize($a))));
咋一看是反序列化,找pop链:
C类存在__toString
魔术方法,并通过file_get_contents
输出$c
的信息,所以可以使$c
为flag.php
。
B类存在__destruct
魔术方法,析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行,并且有输出。
A类存在__construct
魔术方法,当使用 new 操作符创建一个类的实例时,构造函数将会自动调用。
所以,只要在类B中输出类C,就能调用__toString方法,输出flag.php内容
exp:
<?php
// class A{
// public $username;
// public $password;
// function __construct($a, $b){