# 易优CMS RCE

**URL:** <https://forum.90sec.com/t/topic/1224>\
**Category:** 代码审计\
**Created:** [2020 年7 月 21 日 03:11 UTC](https://forum.90sec.com/t/topic/1224 "2020-07-21T03:11:56Z")\
**Posts on this page:** 15\
**Page:** 1

<div class="post-metadata">

作者： ![Joseph](https://forum.90sec.com/letter_avatar_proxy/v4/letter/j/dc4da7/32.png) [@Joseph](https://forum.90sec.com/u/Joseph)\
发布日期： [2020 年7 月 21 日 03:11 UTC](https://forum.90sec.com/t/topic/1224/1 "2020-07-21T03:11:56Z")

</div>

## 易优CMS RCE

### 漏洞分析

Eyou是由TP衍生出来的一款cms,一般审这种我喜欢先看看TP版本

/core/base.php

```php
<?php

define('THINK_VERSION', '5.0.24');
define('THINK_START_TIME', microtime(true));
define('THINK_START_MEM', memory_get_usage());
define('EXT', '.php');

```

5.0.24最恶心的版本,先试着找一些可getshell的点,比如文件写入或上传之类的

/application/user/controller/Uploadify.php

```php
 public function delupload()
    {
        if (IS_POST) {
            $action = input('post.action/s','del');                
            $filename= input('post.filename/s');
            $filename= empty($filename) ? input('url') : $filename;
           
            $filename= str_replace('../','',$filename);
            $filename= trim($filename,'.');
            $filename= trim($filename,'/');
            if(eyPreventShell($filename) && $action=='del' && !empty($filename) && file_exists($filename)){
              var_dump($filename);
                $fileArr = explode('/', $filename);
                if ($fileArr[2] != $this->users_id) {
                    return false;
                }
                $filetype = preg_replace('/^(.*)\.(\w+)$/i', '$2', $filename);
                $phpfile = strtolower(strstr($filename,'.php')); //排除PHP文件
                $size = getimagesize($filename);
                $fileInfo = explode('/',$size['mime']);
                if($fileInfo[0] != 'image' || $phpfile || !in_array($filetype, explode(',', config('global.image_ext')))){
                    exit;
                }
                if(@unlink($filename)){
                    echo 1;
                }else{
                    echo 0;
                }  
                exit;
            }
        }
    }

```

在找的过程中发现了这么一处有意思的点unlink以及file\_exists操作了filename,如filename可控的情况下,我们就可以通过phar来导致rce

```php
            $filename= input('post.filename/s');
            $filename= empty($filename) ? input('url') : $filename;
           
            $filename= str_replace('../','',$filename);
            $filename= trim($filename,'.');
            $filename= trim($filename,'/');

```

但是这里有一些过滤,简单看看,首先str\_replace不用看。这个过滤很简单,直接/....//这样就可以过了,trim用了两次，主要针对.和/。但是这个函数主要是针对两侧，所以也根本影响我们的利用。但是测试的时候发现

![image-20200605135214931]()

直接把phar:给尼玛替换了,我想了一下问题也只能出在input获取层了,因为是tp的框架加上一般都不会去改它的获取函数就忽略了

```php
    'extra_file_list' => array(APP_PATH . 'helper' . EXT, THINK_PATH . 'helper' . EXT, APP_PATH . 'function' . EXT),
    // 默认输出类型
    'default_return_type' => 'html',
    // 默认AJAX 数据返回格式,可选json xml ...
    'default_ajax_return' => 'json',
    // 默认JSONP格式返回的处理方法
    'default_jsonp_handler' => 'jsonpReturn',
    // 默认JSONP处理方法
    'var_jsonp_handler' => 'callback',
    // 默认时区
    'default_timezone' => 'PRC',
    // 是否开启多语言
    'lang_switch_on' => $lang_switch_on,
    // 默认全局过滤方法 用逗号分隔多个
    'default_filter' => 'strip_sql,htmlspecialchars', // htmlspecialchars

```

在获取的时候通过了strip\_sql,htmlspecialchars两个函数

```php
function strip_sql($string)
    {
        $pattern_arr = array(
            "/\bunion\b/i",
            "/\bselect\b/i",
            "/\bupdate\b/i",
            "/\bdelete\b/i",
            "/\boutfile\b/i",
            // "/\bor\b/i",
            "/\bchar\b/i",
            "/\bconcat\b/i",
            "/\btruncate\b/i",
            "/\bdrop\b/i",
            "/\binsert\b/i",
            "/\brevoke\b/i",
            "/\bgrant\b/i",
            "/\breplace\b/i",
            // "/\balert\b/i",
            "/\brename\b/i",
            // "/\bmaster\b/i",
            "/\bdeclare\b/i",
            // "/\bsource\b/i",
            // "/\bload\b/i",
            // "/\bcall\b/i",
            "/\bexec\b/i",
            "/\bdelimiter\b/i",
            "/\bphar\b\:/i",
            "/\bphar\b/i",
            "/\@(\s*)\beval\b/i",
            "/\beval\b/i",
        );
        $replace_arr = array(
            'ｕｎｉｏｎ',
            'ｓｅｌｅｃｔ',
            'ｕｐｄａｔｅ',
            'ｄｅｌｅｔｅ',
            'ｏｕｔｆｉｌｅ',
            // 'ｏｒ',
            'ｃｈａｒ',
            'ｃｏｎｃａｔ',
            'ｔｒｕｎｃａｔｅ',
            'ｄｒｏｐ',
            'ｉｎｓｅｒｔ',
            'ｒｅｖｏｋｅ',
            'ｇｒａｎｔ',
            'ｒｅｐｌａｃｅ',
            // 'ａｌｅｒｔ',
            'ｒｅｎａｍｅ',
            // 'ｍａｓｔｅｒ',
            'ｄｅｃｌａｒｅ',
            // 'ｓｏｕｒｃｅ',
            // 'ｌｏａｄ',
            // 'ｃａｌｌ',
            'ｅｘｅｃ',
            'ｄｅｌｉｍｉｔｅｒ',
            'ｐｈａｒ',
            'ｐｈａｒ',
            '＠ｅｖａｌ',
            'ｅｖａｌ',
        );

        return is_array($string) ? array_map('strip_sql', $string) : preg_replace($pattern_arr, $replace_arr, $string);
    }

```

好了！破案了,这种替换我是没招的但是他写的很死！比如遇到phar:这样的时候才去替换,不会说因为出现了phar就去进行替换操作！那我们文章的str\_replace这不就用上了?

payload:p../h../a../r://./p../har.p../har

 ![image](https://forum.90sec.com/uploads/default/original/2X/4/4d932f7206a64d8301168c66826f25abb5623fb5.png)

可以看见完美了但是在进入到file\_exists之前还有一个eyPreventShell函数

```php
 function eyPreventShell($data = '')
    {
        $data = true;
        if (is_string($data) && (preg_match('/^phar:\/\//i', $data) || stristr($data, 'phar://'))) {
            $data = false;
        } else if (is_numeric($data)) {
            $data = intval($data);
        }

        return $data;
    }

```

他自己给传入的data复了一次值(不知道程序员怎么想)导致可以直接忽视这个函数

 ![image](https://forum.90sec.com/uploads/default/original/2X/b/b77dd13373c9fbd0114aed91e7b22a782004b87d.png)

用一个echo来证明一下

 ![image](https://forum.90sec.com/uploads/default/original/2X/d/dc88469f826dcf924d30ff2e0ce1fa9d93c48278.png)

完美

---

<div class="post-metadata">

作者： ![fengye](https://forum.90sec.com/letter_avatar_proxy/v4/letter/f/b2d939/32.png) [@fengye](https://forum.90sec.com/u/fengye)\
发布日期： [2020 年7 月 21 日 03:22 UTC](https://forum.90sec.com/t/topic/1224/2 "2020-07-21T03:22:06Z")

</div>

Joseph大佬，新人对于代码审计应该怎么进一步的学习呢，那本法师的书看完了，想进一步学习，有什么推荐的媒介或者方法吗

---

<div class="post-metadata">

作者： ![wayne](https://forum.90sec.com/user_avatar/forum.90sec.com/wayne/32/4294_2.png) [@wayne](https://forum.90sec.com/u/wayne)\
发布日期： [2020 年7 月 21 日 05:28 UTC](https://forum.90sec.com/t/topic/1224/3 "2020-07-21T05:28:37Z")

</div>

talk is cheap 干就完事了

---

<div class="post-metadata">

作者： ![maplgebra](https://forum.90sec.com/user_avatar/forum.90sec.com/maplgebra/32/1628_2.png) [@maplgebra](https://forum.90sec.com/u/maplgebra)\
发布日期： [2020 年7 月 21 日 12:15 UTC](https://forum.90sec.com/t/topic/1224/4 "2020-07-21T12:15:15Z")

</div>

求附赠源码一份。

---

<div class="post-metadata">

作者： ![Joseph](https://forum.90sec.com/letter_avatar_proxy/v4/letter/j/dc4da7/32.png) [@Joseph](https://forum.90sec.com/u/Joseph)\
发布日期： [2020 年7 月 21 日 14:43 UTC](https://forum.90sec.com/t/topic/1224/5 "2020-07-21T14:43:15Z")

</div>

这个应该官网能下的吧

---

<div class="post-metadata">

作者： ![Joseph](https://forum.90sec.com/letter_avatar_proxy/v4/letter/j/dc4da7/32.png) [@Joseph](https://forum.90sec.com/u/Joseph)\
发布日期： [2020 年7 月 22 日 01:00 UTC](https://forum.90sec.com/t/topic/1224/6 "2020-07-22T01:00:04Z")

</div>

刚开始至少掌握最基本的语言功底，多练，多看。

---

<div class="post-metadata">

作者： ![Love](https://forum.90sec.com/letter_avatar_proxy/v4/letter/l/dec6dc/32.png) [@Love](https://forum.90sec.com/u/Love)\
发布日期： [2020 年7 月 22 日 01:29 UTC](https://forum.90sec.com/t/topic/1224/7 "2020-07-22T01:29:20Z")

</div>

链接: [https://pan.baidu.com/s/1IZT6i6Bzh68oKY-r-zF1HA](https://pan.baidu.com/s/1IZT6i6Bzh68oKY-r-zF1HA) 提取码: p3m3  
版本是1.4.6 我原来也想发这个漏洞，但是内部说内容太少，让我增加内容不知道啥时候才发的出来。

---

<div class="post-metadata">

作者： ![Love](https://forum.90sec.com/letter_avatar_proxy/v4/letter/l/dec6dc/32.png) [@Love](https://forum.90sec.com/u/Love)\
发布日期： [2020 年7 月 22 日 03:31 UTC](https://forum.90sec.com/t/topic/1224/9 "2020-07-22T03:31:28Z")

</div>

还是想成为像大佬一样的开发牛，但是这辈子应该是学不会了。

---

<div class="post-metadata">

作者： ![Love](https://forum.90sec.com/letter_avatar_proxy/v4/letter/l/dec6dc/32.png) [@Love](https://forum.90sec.com/u/Love)\
发布日期： [2020 年7 月 23 日 01:43 UTC](https://forum.90sec.com/t/topic/1224/11 "2020-07-23T01:43:27Z")

</div>

嗯，thinkphp直接就存在利用的pop链，找个能触发反序列化的地方就行了。

---

<div class="post-metadata">

作者： ![243536998](https://forum.90sec.com/user_avatar/forum.90sec.com/243536998/32/3674_2.png) [@243536998](https://forum.90sec.com/u/243536998)\
发布日期： [2020 年7 月 25 日 11:45 UTC](https://forum.90sec.com/t/topic/1224/14 "2020-07-25T11:45:20Z")

</div>

俺写了个POC，apache环境测试成功写getshell。但是在nginx环境下测试失败，发现根本没有进到Windows.php的\_\_destruct()，不明白是什么原因，请大佬们指教orz

---

<div class="post-metadata">

作者： ![flystart](https://forum.90sec.com/user_avatar/forum.90sec.com/flystart/32/5193_2.png) [@flystart](https://forum.90sec.com/u/flystart)\
发布日期： [2020 年7 月 28 日 06:54 UTC](https://forum.90sec.com/t/topic/1224/15 "2020-07-28T06:54:58Z")

</div>

这个系统用户量比较少，爆过非常多的洞，去年11月份就审计过这个cms,当时前台有几处可以直接 post unserialize，eyPreventShell 这个函数应该是新版本出问题了，老版本当时看了半天绕不过去就放弃了，前面绕过过滤替换有点意思

---

<div class="post-metadata">

作者： ![dongting](https://forum.90sec.com/letter_avatar_proxy/v4/letter/d/e8c25b/32.png) [@dongting](https://forum.90sec.com/u/dongting)\
发布日期： [2020 年9 月 17 日 14:51 UTC](https://forum.90sec.com/t/topic/1224/17 "2020-09-17T14:51:36Z")

</div>

学习了，伪协议

---

<div class="post-metadata">

作者： ![dongting](https://forum.90sec.com/letter_avatar_proxy/v4/letter/d/e8c25b/32.png) [@dongting](https://forum.90sec.com/u/dongting)\
发布日期： [2020 年9 月 17 日 14:55 UTC](https://forum.90sec.com/t/topic/1224/18 "2020-09-17T14:55:37Z")

</div>

是不是所有文件操作的函数都可以呀

---

<div class="post-metadata">

作者： ![chrales](https://forum.90sec.com/user_avatar/forum.90sec.com/chrales/32/3657_2.png) [@chrales](https://forum.90sec.com/u/chrales)\
发布日期： [2020 年9 月 18 日 09:40 UTC](https://forum.90sec.com/t/topic/1224/19 "2020-09-18T09:40:37Z")

</div>

铁子 你图裂了

---

<div class="post-metadata">

作者： ![1574991635](https://forum.90sec.com/user_avatar/forum.90sec.com/1574991635/32/6686_2.png) [@1574991635](https://forum.90sec.com/u/1574991635)\
发布日期： [2020 年9 月 21 日 08:23 UTC](https://forum.90sec.com/t/topic/1224/20 "2020-09-21T08:23:32Z")

</div>

你好，链接失效了，能再发一个吗，qq1156865535
