yzmcms代码审计感想

版本:yzmcms v5.5
环境:php7

写这篇文章的时候,我还专门去GitHub给该cms点了个star,实在是写得太好了,什么漏洞都挖不出来。(也是因为自己太菜了)

从结构上看,采用了mvc结构,加载模块时的代码有点眼熟,与dedecms的比较相似。老套路,先查看SQL执行与文件上传功能模块,查找敏感函数,然后前往后台与会员中心逐个功能点查看。

默认值

数据库:yzmcms
表前缀:yzm_
管理员:yzmcms
密码:yzmcms
后台:/admin
配置文件:/common/config/config.php
密码加密:$password = md5(substr(md5(trim($password)), 3, 26));

SQL执行

安装时默认选择使用PDO。
查看SQL执行函数文件:/yzmphp/core/class/db_pdo.class.php|db_mysql.class.php|db_mysqli.class.php
共性:只看安全处理的话,每一条语句执行前都会遍历参数并执行safe_data()

private function safe_data($value, $chars = false){
if(!MAGIC_QUOTES_GPC) $value = addslashes($value);  # 给单引号等特殊符号添加反斜杠  
if($chars) $value = htmlspecialchars($value);   # 选择性进行实体编码处理,防止xss  

return $value;
}

但我注意到,在执行insert()、update()的操作时,接收的参数可为数组,然后直接在函数内解析成键值对拼接(当然也会经过过滤)。

$data = $this->filter_field($data, $primary);  # 过滤非表字段
$fields = $values = array();  # 定义数组
foreach ($data AS $key => $val){
$fields[] = '`'. $key .'`';  # 字段
$values[] = "'" . $this->safe_data($val, $filter) . "'";  # 经安全处理,代码在上
}       

发现在部分调用的地方会接收多个表单,然后直接传入$_POST,但程序又会对重要的字段参数进行unset()操作,如此一来防护又十分到位。

文件上传

重点查看对于上传文件的后缀处理,与dedecms类似的同样采用fileext()自定义函数获取附件的后缀。允许上传的附件类型定义在数据库里(可由管理员在后台修改),上传的图片规则则写在配置文件中。

数据库备份泄露

默认备份路径在:/cache/databack
但备份文件命名规则为{6位随机数}-{时间}-{时间戳}.sql
无法使用类似长文件名匹配的特性进行爆破文件。

反序列化

整个cms中,unserialize()只出现了一次,且回溯该函数,并没有被调用。

目录泄露

每个子文件夹下都有空白的index.html

后台敏感功能点

无安全漏洞,只能给某个用户刷刷VIP等级,刷刷积分罢了。(所以管理员别用弱密码啊)

感想

功能简洁不拖泥带水,代码初看以为会有漏洞,但不断跟进发现又处理的很恰当,很佩服。

发表评论

电子邮件地址不会被公开。 必填项已用*标注