CTFHub技能树通关教程——SSRF漏洞原理攻击与防御(一)(超详细总结)

CTFHub技能树通关教程——SSRF漏洞原理攻击与防御(一)(超详细总结)

什么是SSRF?

即服务器端请求伪造(Server-Side Request Forgery),是一种网络攻击技术,攻击者利用服务器上的应用程序向任意服务器发起请求或者操作,这些请求可能包括但不限于文件读取、命令执行、端口扫描等。由于这些请求是从服务器内部发起的,因此他们可以绕过服务器的外部访问控制,访问内部网络资源或者执行恶意操作。

image-20240616004227655

它的危害

SSRF攻击通常发生再服务器应用程序允许用户输入被用于构建请求 URL的情况下。如果输入没有得到适当的验证和过滤,攻击者就可以利用这一点来发起恶意请求。例如,如果一个应用程序允许用户输入一个URL来下载文件,攻击者可能会输入指向内部服务器的URL,从而访问或者下载内部文件。

如何防御?

  1. 验证所有用户输入,确保它们是合法的和预期的。
  2. 限制可访问的URL或资源,避免访问内部网络或敏感资源。
  3. 使用白名单机制,只允许访问预定义的、安全的URL。
  4. 对于敏感操作,实施额外的安全措施,如身份验证和授权检查。

SSRF漏洞复现

靶场:CTFHub,Pikachu

内网访问

image-20240616124025150

开启环境后,查看题目条件,找出位于127.0.0.1的flag.php

image-20240616124135937

 

页面什么也没有

image-20240616124047575

根据题目要求尝试使用这个url参数,进行内网访问,但是页面什么也没有

image-20240616124335669

仔细观察url参数前面有一个_,将它删掉试试,测试成功

image-20240616124502963

 

伪协议读取文件

image-20240616124713300

常见的伪协议类型有

  • file:///
  • dict://
  • sftp://
  • ldap://
  • tftp://
  • gopher://

这里我们用到的是file:/// --本地文件传输协议,主要用来访问本地计算机中的文件,构造payload如下。

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

image-20240616130017045

鬼的,他就三个?对于刚入门的小白,我懵逼了。。。。直到几分钟后我查看了他的源码。

image-20240616130146090

emmmm,这不就是我们的结果嘛,这关过了

端口扫描

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

 

截取到请求包之后发送到攻击器(Intruder)

image-20240616132020109

添加payload,这里只有一个需要爆破,所以攻击方式选狙击手

image-20240616132053488

设置payload为数值型,因为需要扫描的端口是8000-9000,所以payload配置如下

image-20240616132118565

验证匹配结果,并开始攻击

image-20240616132134851

端口爆破成功,成功找到flag,端口为8248

image-20240616132210455

尝试使用浏览器访问内网的8248端口,成功!

image-20240616132310478

Gopher协议的利用

定义:Gopher是早期的Internet信息检索系统,通过索引将用户引导至不同资源,主要使用TCP 70端口。在WWW普及前,它是主要的检索工具,但现已基本过时,使用较少。

 

POST

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

 

这个题目中呢有这么一个文件,在127.0.0.1中的flag.php

image-20240616180800398

当我尝试输入了各种值,抓包分析,直到我查看了源码。。

image-20240616181036012

这里有一个key,还是被注释了的,不知道是干嘛的先复制下来2161b9fb20ae6d96b0604425b1de64be,尝试使用file协议查看php源码,访问默认web目录var/www/html/flag.php,即

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

这时候即可查看源码,尝试进行分析


   
   
 
           
<?php
//关闭所有的错误报告
error_reporting(0);
//判断请求的ip地址是否是127.0.0.1
if ($_SERVER["REMOTE_ADDR"] != "127.0.0.1") {
    //如果不是127.0.0.1,就返回这段字符串
    echo "Just View From 127.0.0.1";
    return;
}
//falg的获取
$flag=getenv("CTFHUB");
$key = md5($flag);
//判断post请求中是否存在key这个参数,key就是刚刚页面上看到的注释的值
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>

每个项目中默认主页都是index,这是一个php靶场,那么这首页就是index.php


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

访问之后是个空页面,但是查看网页源码会发现,尝试分析一下源码


   
   
<?php
//关闭错误报告
error_reporting(0);
//判断url参数是否存在
if (!isset($_REQUEST['url'])){
    //不存在就跳转到当前根目录
    header("Location: /?url=_");
    exit;
}
//初始化curl
$ch = curl_init();
//指定请求的url
curl_setopt($ch, CURLOPT_URL, $_REQUEST['url']);
//告诉curl不返回http头,只返回http正文
curl_setopt($ch, CURLOPT_HEADER, 0);
//允许cURL跟随重定向。如果服务器响应包含重定向,cURL将自动处理。
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_exec($ch);
curl_close($ch);

这段代码没有包含错误处理,也没有设置CURLOPT_RETURNTRANSFER选项,这可能导致cURL的输出直接被输出到浏览器,所以可以利用此curl漏洞进行攻击

构造POST请求包

访问flag.php查看源码找到key,并输入到输入框,使用bp拦截

image-20240616183852162

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

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

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

所以我们需要对构造的请求包进行两次编码:

第一次解码

image-20240616183250952

将解码的结果复制下来,保存在txt文档中,其中需要将%0A替换成 %0D%0A

因为%0A是ASCII 码中的换行符,在URL的二次编码中不需要,否则会导致curl执行错误,导致我们拿不到正确的结果

image-20240616183328279

替换完成之后,再次进行url编码,这里的url就是源码中的curl要执行的

image-20240616183349871

   
   
//使用gopher协议,构造payload
?url=gopher://127.0.0.1:80/_二次编码的url(注意别少了前面那个下划线)

得到结果!

image-20240616183811471

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

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关于CTFSSRF的正则匹配,SSRF(Server-Side Request Forgery,服务器端请求伪造)是指攻击者通过构造恶意请求,使端发起对内部资源的请求。在CTF中,判断是否存在SSRF的点可以通过正则匹配来实现。 一般来说,判断是否存在SSRF的点可以通过检查代码中是否使用了可能触发SSRF的函数,如file_get_contents()、curl()、fsockopen()、fopen()等。通过正则表达式匹配代码中的这些函数调用,可以初步判断是否存在SSRF。 例如,可以使用正则表达式来匹配以下代码: file_get_contents\(|curl\(|fsockopen\(|fopen\( 这个正则表达式可以匹配代码中是否存在file_get_contents()、curl()、fsockopen()、fopen()等函数的调用。 另外,也可以通过正则表达式来匹配URL参数或输入框中的内容,判断是否使用了可能触发SSRF的协议,如http://、file://、dict://等。例如,可以使用以下正则表达式来匹配可能存在SSRF的URL: (http|https|ftp|file|dict):// 需要注意的是,正则表达式只能作为初步判断的手段之一,对于复杂的情况,还需要综合考虑代码逻辑和具体的应用场景来判断是否存在SSRF漏洞。同时,在进行正则匹配时,也要注意避免误判和漏判的情况。 综上所述,通过正则表达式匹配代码中的函数调用和URL参数,可以初步判断CTF题目是否涉及SSRF漏洞。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [浅谈ssrf与ctf那些事](https://blog.csdn.net/qq_38154820/article/details/109252839)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值