# 某cms代码审计之命令执行

**URL:** <https://forum.90sec.com/t/topic/1762>\
**Category:** 代码审计\
**Created:** [2021 年7 月 9 日 02:24 UTC](https://forum.90sec.com/t/topic/1762 "2021-07-09T02:24:18Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

作者： ![huayu](https://forum.90sec.com/letter_avatar_proxy/v4/letter/h/5f8ce5/32.png) [@huayu](https://forum.90sec.com/u/huayu)\
发布日期： [2021 年7 月 9 日 02:24 UTC](https://forum.90sec.com/t/topic/1762/1 "2021-07-09T02:24:18Z")

</div>

## 0x01 序言

在社区看到一个大佬的分析，过程很详细。自己跟着走了一遍，收货颇多。记录一下。

## 0x02 话不多说就是干

漏洞出现在`App\Weibo\Controller\ShareController.calss.php`中的

![在这里插入图片描述](https://forum.90sec.com/discuz-migration/attachments/5ed25c744e53548cc67bb4819ded1abacc74aed4b16e526e00bf1b9f4dffa8df)

使用了 `I()`函数获取了`query`的值，并进行了解码。然后display模板，看下模板那里  
 ![在这里插入图片描述](https://forum.90sec.com/discuz-migration/attachments/7854892c452c9e8b89a670f11fb1cf7091933677a422ebe39647809adc0e3b42)

Common/functions.php看下`W()`  
 ![在这里插入图片描述](https://forum.90sec.com/discuz-migration/attachments/16db980c3ac9576a4b307d1a303dcd60dfab3129c7951b4cd0f6a44d08f2753d)

`W()`是渲染的功能，  
`{:W('Weibo/Share/fetchShare',array('param'=>$parse_array))} Weibo/Share/fetchShare `  
是调用的方法  
再看下`/Weibo/Widget/ShareWidget.class.php/fetchShare()`  
 ![在这里插入图片描述](https://forum.90sec.com/discuz-migration/attachments/0476b927ac325ada674f3efa61f6e9e9bd00e0b1ef6fe65970f0ad70165a3e34)  
调用了`assginFetch()`，`assginFetch（）`调用了`D()`方法，应该是实例化了某个类，调用了`getInfo()`  
 ![在这里插入图片描述](https://forum.90sec.com/discuz-migration/attachments/7afd484ddfcadcac6c31450dc2873fc85805dae70d99620d26ac3954bd09ec54)

在`Weibo/Model/ShareMode.class.php`中调用了`getInfo()`  
 ![在这里插入图片描述](https://forum.90sec.com/discuz-migration/attachments/9ede096b0c4af4dac01368ec99d43d5b18967a53a14a5048351b227a224f0635)

`getInfo()`又调用了`D()`，可以实例化Model类，其中的所有变量都可控，那么满足  
1.为Model类  
2.方法只能有一个传入的参数  
看下tp框架本身自带的Model类。`/ThinkPHP/Library/Think/Model.class.php`  
 ![在这里插入图片描述](https://forum.90sec.com/discuz-migration/attachments/6b75fcda7cb0729d8b402bbd7a851eac4800b287a9917f6017d771c38532ca15)

这里是可以代码执行的，但是得调用他，并且参数可控  
可以找到一个可利用的类，参数可控，然后调用这个类  
`/Application/Common/Model/ScheduleModel.class.php`  
 ![在这里插入图片描述](https://forum.90sec.com/discuz-migration/attachments/e52790b6811cf4d802327c5f9e106a429c68dba024f5f79883fe938c3a809cc2)

看下`_validationFieldItem()`  
 ![在这里插入图片描述](https://forum.90sec.com/discuz-migration/attachments/9302ca86fb5e7cbbb595e7b4068f314c200d50565abfb93ed87bb0c78ce12fd2)

这里不论`$val[0]`是不是数组，都会在`$args`数组中插入元素，并且是在数组的开头  
很明显`$val[0]`不是数组，那么`$data[$val[0]]`的就显得很重要了。  
逆着分析一下。  
`$args=$val[6]`，然后`$args`的开头插入了`$data[$val[0]]`，简直是开局两把枪了。  
然后`$val[4]==functions`的话，就会执行一个回调函数，但是是数组作为参数。`$val[1]`的值为执行函数。  
如果`$val[1]=assert`,就会执行`$args`  
而`$data`和`$val`是`runSchedule()`方法传进的  
回到`runSchedule（）`  
 ![在这里插入图片描述](https://forum.90sec.com/discuz-migration/attachments/2c12d0374a6962c4879265b83f3963fb5375823884d5e848997bb725c8ab4ab2)

`$method[0]`是`D()`调用的类，`$method[1]`是方法，`$args`, `$schedule`是传参。  
而`$method`是`$schedule['method']`分割而成，那么`$schedule['method']`需要为：`Model->_validationFieldItem`  
而`$args=$data`，`$schedule`是`$val`  
上面说过`$data[$val[0]]`的值很重要。  
看下`getInfo()`  
 ![在这里插入图片描述](https://forum.90sec.com/discuz-migration/attachments/4d3d0c48e889dd9e83f52cd0208822ee1f52f477802f75c2fd120fb3a0ea73ba)

触发类在`/Application/Common/Model/ScheduleModel.class.php`  
那么`$param['app']=Common`  
`$param['model'] = Schedule`  
`$param['method']=runSchedule`  
然后将`$param['id']传入runSchedule()`  
上面说的`$schedule['method']=Model->_validationFieldItem id['method']=Model->_validationFieldItem`  
那么就进入了`_validationFieldItem()`

大体思路：

1.ShareController.shareBox-\>  
2.ShareWidget. fetchShare-\>  
3.ShareWidget.assginFetch-\>  
4.ShareModel.getInfo(这里控制D方法生成ScheduleModel类，并调用传入一个参数的方法)-\>  
5.ScheduleModel.runSchedule(这里控制D方法生成Model类，并调用传入两个参数的方法)-\>  
6.Model.\_validationFieldItem

poc  
要注意的是，query传值后，会进行urldecode()  
/index.php?s=/weibo/share/sharebox&query=app=Common%26model=Schedule%26method=runSchedule%26id[method]=Model-%3E\_validationFieldItem%26id[args]=1=phpinfo()%26id[4]=function%26id[1]=assert%26id[6]=phpinfo()%26id[0]=1%26id[status]=1  
 ![在这里插入图片描述](https://forum.90sec.com/discuz-migration/attachments/200b1e6a153a201705d187caeed9dd3ecf6b01b91d5c9ad21d497e6e5b462fcf)

_**参考链接：[https://forum.butian.net/share/187](https://forum.butian.net/share/187)**_
