espcms代码审计——文件包含漏洞

乐伟超   ·   发表于 2020-09-07 20:14:12   ·   代码审计

espcms是帮助企业快速建立网站的一个系统,该系统存在文件包含漏洞,攻击者可利用该漏洞包含执行任意文件,如果配和文件上传将会直接获取服务器权限,此次我审计处问题的版本是 ESPCMS V6.7.17.08.07 版本
下面是漏洞审计过程
过程和大家一样,先用法师的Seay源代码审计系统去审计,然后一步一步去跟进


审计到这里就发现了问题,如果对于$plugcode这个变量直接拼接了.php的后缀,如果没有一个给定的数组去限制,或者没有进行过滤的话,这里是可以实现任意文件包含的
跟进去Upload/adminsoft/control/tempaltemain.php文件中
出现漏洞的方法onattriindex()

问题就出现在这里,$plugcode变量由accept函数获取,这个函数里面就是传进来参数名,还有传参的方式,传参过后都会经过addlashes()
对于要包含的文件名字,代码也是用的addlashes这个函数来进行处理的,但是我们要实现任意文件包含,并不需要使用(“)和(‘)和(\),
任意文件包含要实现的话只需要../就可以进行跳转,所以此处就可以实现任意文件的包含。
下面先分析一下要如何进入这个文件和这个方法,先来到后台的index.php文件


上面一共接收了两个参数$archive和$action,$archive控制进入哪个php文件,而$action决定进入这个php文件中的具体哪一个函数中,所以此处要传进来的$archive=templatemain同时$action=attrindex,这样就会进入到出现问题的函数中
进入到这个函数里面后,我们接着分析这个函数


首先以GET方式获取$plugcode和$lng这两个参数,第三行代码判断$lng是否为空值,如果不为空值,那么就直接取$lng传进来的值
第四行的那个函数里面有一个数组,只要$lng传进来的值在其中,就会得到一系列的城市列表,文章列表的值,这里对我们文件包含影响不是很大,但是不能让他报错。
接着往下面看,$mid参数可以不用管,接下来就到了包含漏洞出现的地方

Public是所包含文件的上一级目录,我是本地搭建环境进行测试
我先在Public目录下建立了一个phpinfo的文件,在上一级目录下建立php文件的目的是为了验证可以用../进行跳转

读取phpinfo的POC如下:
http://192.168.15.140/www.a.com/upload/adminsoft/index.php?archive=templatemain&action=attrindex&lng=city&code=../phpinfo


成功读取到php文件,如果上传写一句话木马的图片,再进行文件包含的话,会直接获取服务器权限。
espcms这个版本存在好多地方的文件包含,都只用addlashes()函数进行了处理,所以出现问题的地方很多,不过有的地方需要配合截断来进行
此处进行说明:在php小于5.4之前的版本可以用多个点来截断
window下是259个’.’就可以进行截断
Linux下要4096个’.’此外还有常见的“?”截断,或者是%00截断
不过截断要根据php的版本来看,后面的高版本都进行了修复,所以有一些局限性

感受:代码审计最重要的就是耐心,只要能耐心的去跟进,回溯每一个容易出现问题的地方,那么一定会发现漏洞

用户名金币积分时间理由
veek 50.00 0 2020-10-12 10:10:04 一个受益终生的帖子~~

打赏我,让我更有动力~

0 条回复   |  直到 2020-9-7 | 1521 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.