ucms系统存在代码注入漏洞的分析
原文在这里:天融信关于ucms系统存在代码注入漏洞的分析
其实这个漏洞就是后台文件管理的地方可以随意新建文件,而且没有任何的后缀名拦截、白名单验证、权限限制。
漏洞复现
后台–>文件管理–>随便找一个文件夹或者文件–>编辑–>保存
没啥好说的就不截图了,发送的包如下:
1 | POST /ucms/ucms/index.php?do=sadmin_fileedit&dir=/ucms/ucms/&file=123.php HTTP/1.1 |
dir是目录,file是文件名,co是文件的内容。
然后访问 http://127.0.0.1/ucms/ucms/123.php
漏洞分析
其实这里也没啥好写的,写一下漏洞跟踪的流程吧~小伙伴们最好自己跟踪下代码哦~
首先这个漏洞是后台的一个漏洞,我们这里要看下后台的index.php文件,ucms/ucms/index.php
然后看下代码,首先是要看代码对 do 这个参数是如何进行处理的:
line41-541
2
3
4
5
6
7
8
9
10
11
12
13
14<?php
if(isset($_GET['do'])) {
$thisdo=explode('_',$_GET['do']);
}
?>
<?php require('top.php');?>
<?php
if(isset($_GET['do'])) {
if(!isset($thisdo[1])) {
$thisdo[1]='index';
}
check_admin_file($thisdo[0],$thisdo[1]);
require($thisdo[0].'/'.$thisdo[1].'.php');
}
看下流程,要是 do 这个参数是有值的话,就会将do参数的值用 下划线 进行分割,返回给 $thisdo 这个变量,返回类型是 数组。
我们写个简单的脚本测试一下。
然后在代码的后面,会用 require 请求一个脚本1
require($thisdo[0].'/'.$thisdo[1].'.php')
这里我们的 do=sadmin_fileedit,也就是请求 sadmin/fileedit.php 脚本
sadmin/fileedit.php1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48<?php
if (!defined('admin')) {exit();}
if(power('alevel')!=3) {die('error');}
if(!AdminFileedit) {
adminmsg('','文件管理功能已关闭',0);
}
if(isset($_GET['dir'])) {
if(empty($_GET['dir'])) {
$_GET['dir']='/';
}
$getdir=$_GET['dir'];
if($_GET['dir']=='/') {
$dir=$_GET['dir'];
}else {
$dir=$_GET['dir'];
}
$alldir=$_SERVER['DOCUMENT_ROOT'].$_GET['dir'].'/';
if(stripos($_GET['dir'],'..')===false) {}else {die('error dir');}
}else {
die('no dir');
}
if(isset($_GET['file'])) {
$filename=$_GET['file'];
if(stripos($_GET['file'],'..')===false) {}else {die('error filename');}
if(!isedit($_GET['file'])) {
die('error');
}
}else {
die('no file');
}
if(isset($_POST['co'])) {
checktoken();
$content=$_POST['co'];
$fp = @fopen($alldir.$filename,"w");
if(!@fwrite($fp,$content) && strlen($content)<>0){
adminmsg('','写入失败,请修改文件权限',1);
exit;
}
fclose($fp);
$refererurl='?do=sadmin_fileedit&dir='.$_GET['dir'].'&file='.$_GET['file'].'&pos='.$_POST['pos'];
adminmsg($refererurl,'保存成功',1,'编辑页');
exit();
}
if(!is_file($alldir.$filename)) {
$content='';
}else {
$content=htmlspecialchars(file_get_contents($alldir.$filename));
}
这里会判断是否请求了 dir、file参数,并没有对参数进行过滤限制,最终传递给 $alldir $filename。1
2
3
4
5
6if(isset($_GET['dir'])) {
......
}
if(isset($_GET['file'])) {
......
}
如果存在请求 co 参数,那么久会利用 @fopen这个参数打开 ,然后写入 co 中的参数1
2
3
4
5
6
7
8
9
10
11
12
13if(isset($_POST['co'])) {
checktoken();
$content=$_POST['co'];
$fp = @fopen($alldir.$filename,"w");
if(!@fwrite($fp,$content) && strlen($content)<>0){
adminmsg('','写入失败,请修改文件权限',1);
exit;
}
fclose($fp);
$refererurl='?do=sadmin_fileedit&dir='.$_GET['dir'].'&file='.$_GET['file'].'&pos='.$_POST['pos'];
adminmsg($refererurl,'保存成功',1,'编辑页');
exit();
}
你会发现整个过程没有对我们输入的变量进行任何的操作限制(白名单验证、权限限制、重命名啥的)
这个漏洞好像官方还没有给补丁 ==,并且这个cms版本在17年就没有更新了,可以继续看下审计一波~
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 sher10cksec@foxmail.com
文章标题:ucms系统存在代码注入漏洞的分析
本文作者:sher10ck
发布时间:2019-08-01, 18:06:16
最后更新:2020-01-13, 13:05:11
原始链接:http://sherlocz.github.io/2019/08/01/ucms系统存在代码注入漏洞的分析/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。