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.php
对GET
传来的数据进行了清洗。而这里偏偏却用了POST方式来接收数据,继续跟踪改变量后,发现到拼接进sql语句再到进入文件删除函数过程中未进行其他任何过滤。
SEMCMS_Function.php 919行
后台Include/function.php
如上图显示,网站根目录下boogle.php
已被成功删除。
0x02 poc
1 | import requests |
0x03 修复方法
在contorl.php
中增加对POST的过滤。1
2
3
4
5
6
7if (isset($_POST)){$PostArray=$_POST;}else{$PostArray='';} //post
foreach ($PostArray as $value){ //post
verify_str($value);
}