PHPCMS V9 一些漏洞修复方案

某处逻辑问题导致GetShell

文件位置:/phpcms/libs/classes/attachment.class.php
解决办法(Line 144):

//在144行后添加一行
if($ext !== 'gif|jpg|jpeg|bmp|png'){
            if(!in_array(strtoupper($ext),array('JPG','GIF','BMP','PNG','JPEG'))) exit('附加扩展名必须为gif、jpg、jpeg、bmp、png');
        }
phpsso.php注入漏洞修复

文件位置:/phpcms/libs/classes/attachment.class.php
解决办法(Line 129):

$arr['uid'] = intval($arr['uid']);
$phpssouid = $arr['uid'];

替换为,二合一代码:

$phpssouid = intval($arr['uid']);
authkey生成算法问题导致authkey泄露

文件位置:caches/configs/system.php
解决办法:
1.在/caches/configs/system.php,增加第一个参数:

'alivulfix' => 'yes',

修改后,代码截图如下:

2.找到并修改auth_key,20位字符串;具体写什么,自定义即可。

'auth_key' => '2qKYgs0PgHWWtaFVb3KP', //密钥

3.找到并修改auth_key,32位字符串;具体写什么,自定义即可。

'phpsso_auth_key' => 'hjor66pewop_3qooeamtbiprooteqein', //加密密钥

注意:到了这一步,网站用户暂时都登录不了,接下来还有最重要的一步。

4、后台登录phpsso管理中心,在导航菜单phpsso ——> 应用管理 ——> 编辑中,编辑“通信密钥”为第3步设置的’phpsso_auth_key’ 的值,然后点击提交。

关键步骤截图如下:

提交之后,页面显示通信成功,如下图。

5.最后,额外去测试一下登录。

前台注入导致任意文件读取漏洞

文件位置:/phpcms/modules/content/down.php
解决方法:
1.找到对应文件down.php 的对应位置(第18、89行 附近),添加或替换相应的代码。
补丁代码片段如下:

$a_k = safe_replace($a_k);
parse_str($a_k);

修改后的补丁代码片段截图如下:
第一处修改,第18行附近:

第二处修改,第89行附近:

注意:第一处和第二处的补丁代码内容一样。
第三处修改,第120行附近:
补丁代码片段如下:

$fileurl = str_replace(array('<','>'), '',$fileurl); 

file_down($fileurl, $filename);

修改后的补丁代码片段截图如下:

PHPCMS V9宽字节注入问题

文件位置:/phpcms/modules/pay/respond.php
解决方法(Line 14):
找到 respond_get()替换成下面的代码,代码如下:

  public function respond_get() { 
     if ($_GET['code']){ 
          $code = mysql_real_escape_string($_GET['code']);//注意修改
          $payment = $this->get_by_code($code);//注意修改
          if(!$payment) showmessage(L('payment_failed')); 
          $cfg = unserialize_config($payment['config']); 
          $pay_name = ucwords($payment['pay_code']); 
          pc_base::load_app_class('pay_factory','',0); 
          $payment_handler = new pay_factory($pay_name, $cfg); 
          $return_data = $payment_handler->receive(); 
          if($return_data) { 
              if($return_data['order_status'] == 0) {              
                  $this->update_member_amount_by_sn($return_data['order_id']); 
              } 
              $this->update_recode_status_by_sn($return_data['order_id'],$return_data['order_status']); 
              showmessage(L('pay_success'),APP_PATH.'index.php?m=pay&c=deposit'); 
          } else { 
              showmessage(L('pay_failed'),APP_PATH.'index.php?m=pay&c=deposit'); 
          } 
      } else { 
          showmessage(L('pay_success')); 
      } 
  } 

添加后的代码,截图示例如下:

poster.php注入漏洞

文件位置:/phpcms/modules/poster/poster.php
解决方法(Line 221):

// 修改之前
...
if ($_GET['group']) {
    $group = " `".$_GET['group']."`";
    $fields = "*, COUNT(".$_GET['group'].") AS num";
    $order = " `num` DESC";
}
...

在代码if ($_GET['group']) {的后面,添加代码:

$ _GET['group'] = preg_replace('#`#', '', $_GET['group']);
// 修改之后  
...
if ($_GET['group']) {
    $_GET['group'] = preg_replace('#`#', '', $_GET['group']);
    $group = " `".$_GET['group']."`";
    $fields = "*, COUNT(".$_GET['group'].") AS num";
    $order = " `num` DESC";
}
...
index.php注入漏洞

文件位置:/phpcms/modules/member/index.php
解决方法(Line 615):
原来代码:

$password = isset($_POST['password']) && trim($_POST['password']) ?
 trim($_POST['password']) :
 showmessage(L('password_empty'),HTTP_REFERER);

修改为:

$password = isset($_POST['password']) && trim($_POST['password']) ?
 addslashes(urldecode(trim($_POST['password']))) :
 showmessage(L('password_empty'), HTTP_REFERER);
其他漏洞提示

请参考云栖社区文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。