由于工作原因,分析了很多的cms也都写过文章,不过觉得好像没什么骚操作都是网上的基本操作,所以也就没发表在网站上,都保存在本地。最近突然发现自己博客中实战的东西太少了,决定将以前写的一些文章搬过来,由于当时写的初4是给自己留个记录,以后方便查看,所以写的都很简单,只有代码审计和复现,没有详细写挖掘中遇到的一些坑。以后写的文章中会尽量写详细的
-----------------------------------------------------------------------------------
CVE-2019-5886
在shopxoapplicationinstallcontrollerIndex.php文件中,Add方法中没有校验锁文件,导致攻击者可以重装数据库(我是后来才知道的,可以利用MySQL LOAD DATA LOCAL INFILE读取任意客户端文件)
![](https://img2018.cnblogs.com/blog/1442660/201906/1442660-20190612125317350-2070924915.png)
Index.php文件是处理系统安装的CreateConfig文件,但是唯独它的Add方法中没有校验锁文件,且方法内第174行处调用CreateConfig()生成数据库配置文件,而$params是从post参数中取的,进入CreateConfig方法中
![](https://img2018.cnblogs.com/blog/1442660/201906/1442660-20190612125338912-1793250865.png)
![](https://img2018.cnblogs.com/blog/1442660/201906/1442660-20190612125353639-893146799.png)
可以看到该方法中是将$params中的值写入database.php中,包括数据库地址,数据库名以及账号密码等。这样我们重装系统将数据库绑定到攻击者自己的数据库上。
---------------------------------------------------------------------------
这个地方是写入php文件中,理论上我们可以插入php代码后getshell的,当时我当时技术很菜,因为各种原因没成功(具体什么我也不记得了),不过我现在知道了一个新的方法:
闭合array后 Array.eval($_GET['evil']),类似这样。
漏洞复现:
访问install模块下的index控制器下的add方法,并构造如下请求
![](https://img2018.cnblogs.com/blog/1442660/201906/1442660-20190612125901978-107449090.png)
可以发现本地数据库中新建了一个shopxo2的数据库,实际场景中攻击者可以在自己额公网服务器中的数据库开启远程连接,连上自己的数据库。
![](https://img2018.cnblogs.com/blog/1442660/201906/1442660-20190612125839706-1523977142.png)
最关键的地方是数据库配置文件也修改了
![](https://img2018.cnblogs.com/blog/1442660/201906/1442660-20190612125921452-2126214743.png)
CVE-2019-5887漏洞分析
在shopxo/extend/base/FileUtil.php文件的201行处发现调用了rmdir函数:
![](https://img2018.cnblogs.com/blog/1442660/201906/1442660-20190612130309218-245726616.png)
追踪$aim_dir发现是可控的,发现shopxo/service/AppMiniService.php文件中的Delete方法中调用了UnlinkDir方法:
![](https://img2018.cnblogs.com/blog/1442660/201906/1442660-20190612130035496-593467328.png)
当$path不以".zip"结尾时,会调用UnlinkDir方法,而$path来源于params['id']。继续回溯:
![](https://img2018.cnblogs.com/blog/1442660/201906/1442660-20190612130256556-1304340645.png)
shopxo/application/admin/controller/Appminialipaylist.php这个Controller文件的Delete方法调用了AppMiniService::Delete,改项目中所有的Controller的构造函数中都会调用父类的input(),也就是将请求参数中的值为$params赋值。
![](https://img2018.cnblogs.com/blog/1442660/201906/1442660-20190612130339810-504182919.png)
![](https://img2018.cnblogs.com/blog/1442660/201906/1442660-20190612130354600-2095804419.png)
漏洞复现
在后台小程序操作处,点击删除
![](https://img2018.cnblogs.com/blog/1442660/201906/1442660-20190612130416259-97225055.png)
使用burp抓包,构造请求
![](https://img2018.cnblogs.com/blog/1442660/201906/1442660-20190612130430000-2089318270.png)
可以看到返回包中已经成功删除
![](https://img2018.cnblogs.com/blog/1442660/201906/1442660-20190612130443865-73507573.png)