[HITCON 2017]SSRFme

46 篇文章 0 订阅

考点:

  • 代码审计
  • SSRF

知识点

perl脚本GET open命令漏洞

GET是Lib for WWW in Perl中的命令 目的是模拟http的GET请求,GET函数底层就是调用了open处理

open存在命令执行,并且还支持file函数

pathinfo() 函数在这里插入图片描述
进入环境审一下代码:

<?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是我们可以知道的,file_put_contents的路径也是我们可控的,我唯一不太确定的就是那个$data,看到GET,可能是一个GET请求?。。然后我先尝试file:///etc/passwd,发现没回显,然后又试了www.baidu.com,发现我写入的那个文件还是空的,又试了几个发现还是不行,就卡住了,去看了一下大师傅们的WP的前面部分。

也是可以学到一些东西的,首先就是这些:

$info = pathinfo($_GET["filename"]);
$dir = str_replace(".", "", basename($info["dirname"]));
@mkdir($dir);
@chdir($dir);
@file_put_contents(basename($info["basename"]), $data);

如果你只输入比如feng.txt这样的filename,得到的$info['dirname']就只是一个点:.
然后再进行str_replace就没了,也就是其实可以直接写一个文件名,就是我们要写入的文件,而不用前面再附带一个$dir

然后就是那个$data = shell_exec("GET " . escapeshellarg(\$_GET["url"]));和@file_put_contents(basename($info["basename"]), $data);
看了一下,原来用file那样读是错误的姿势,可以直接?url=/etc/passwd就可以读文件了。?url=www.baidu.com也是可以访问的,也就是GET访问。但是这里有一个坑我踩了。就是我一开始用了错误的file姿势来读文件,虽然没读到,但是已经file_put_contents一次了。经过测试,发现这个题目只能在创建文件的时候往文件里写内容,当你想重写来覆盖原有的内容的时候,是不行了,相当于你没有修改文件内容的权限。而我也正是因为第一次创建了个空文件,第二次访问www.baidu.com虽然可以访问,但是因为无更改文件的权限,也就没法把内容覆盖掉,使得我以为?url=www.baidu.com这样的姿势也是错误的,然后就迷了。

根据WP:
前面的代码返回了我的ip,和orange一起进行md5加密。通过url参数输入的内容会以GET命令执行,
命令执行的结果会被存入我们以filename参数的值命名的文件里

首先创建一个沙盒文件夹,路径为sandbox/加上MD5加密过后的orange加页面输出的ip,
在我这里即orange222.92.251.179
通过url参数输入的内容会以GET命令执行,
GET是Lib for WWW in Perl中的命令 目的是模拟http的GET请求

命令执行的结果会被存入我们以filename参数的值命名的文件里
尝试读取根目录,并创建文件名为abc的文件
在这里插入图片描述
md5出来的文件名16f57b890ff7bf36356ebd4718b79bc4

在这里插入图片描述
在这里插入图片描述

然后readflag,如果直接/readflag的话,那么会在服务器的根目录创建这个文件,而不是在网站的那个目录,所以是无法命令执行的,所以可以用bash -c 相当于./readflag,而根据php字符解析特性,如果直接将./readflag传入,那么.就会变成下划线,从而不能命令执行。直接bash的话好像是只能bash 有sh后缀的文件,所以不能用
综上所述,bash -c 是最好的选择

运行两遍

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

进到路径
sandbox/d8e89061a29f8a91a52da35482c8256b/bash%20-c%20/readflag%7C

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值