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

时间:2020-12-08 16:48:36

 

0x00 环境准备

QYKCMS官网:http://www.qykcms.com/

网站源码版本:QYKCMS_v4.3.2(企业站主题)

程序源码下载:http://bbs.qingyunke.com/thread-13.htm

测试网站首页:

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

0x01 代码分析

1、漏洞文件位置:/admin_system/update.php   第30-49行:

  1. switch($tcz['log']){  
  2.     case 'start':  
  3.         $path=arg('path','post','url');  
  4.         $file=arg('file','post','url');  
  5.         $md5=arg('md5','post','url');  
  6.         $check=arg('check','post','int');  
  7.         if($check<1||$check>2)$check=1;  
  8.         $zipfull='../'.$path.$file;  
  9.         if(!file_exists($zipfull)){  
  10. 10.             ajaxreturn(1,'没有找到升级文件,请确定PHP环境是否支持远程 file_get_contents 函数(错误代码:101)');  
  11. 11.             }  
  12. 12.         if(!function_exists('zip_open')){  
  13. 13.             ajaxreturn(1,'不支持zip_open函数,请检查PHP环境是否支持ZZIPlib库(错误代码:102)');  
  14. 14.             exit;  
  15. 15.             }  
  16. 16.         $zipmd5=strtolower(md5_file($zipfull));  
  17. 17.         if($md5!=$zipmd5){  
  18. 18.             @unlink($zipfull);  
  19. 19.             ajaxreturn(1,'升级文件md5较验失败,请稍候再次尝试升级(错误代码:103)');  
  20. 20.             }  

在这段代码中,path,file,md5,check是可控的变量,其中

$zipmd5=strtolower(md5_file($zipfull));也就是我们外部传入的md5的值。

当$md5!=$zipmd5就会删除文件,我们可以轻易的构造参数去删除任意文件。程序在代码逻辑上存在严重的问题,导致程序存在任意文件删除漏洞,攻击者可通过该漏洞删除任意文件,如删除install.lck进行CMS重装,劫持网站数据库。

0x02 漏洞利用

1、在网站根目录新建一个text.txt,作为任意文件删除漏洞测试文件:

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

2、构造URL参数链接,成功删除test.txt文件

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

3、可进一步删除\install\install_lock.php文件,使程序进入系统重装状态,劫持网站数据库。

0x03 修复建议

1、指定文件读取目录,过滤.(点)等可能的恶意字符,防止目录跳转,最为推荐的方法;

2、对于要删除的文件,通过正则判断用户输入的参数的格式,看输入的格式是否合法。

 

最后

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

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