即服务器端请求伪造(Server-Side Request Forgery),是一种网络攻击技术,攻击者利用服务器上的应用程序向任意服务器发起请求或者操作,这些请求可能包括但不限于文件读取、命令执行、端口扫描等。由于这些请求是从服务器内部发起的,因此他们可以绕过服务器的外部访问控制,访问内部网络资源或者执行恶意操作。
SSRF攻击通常发生再服务器应用程序允许用户输入被用于构建请求 URL的情况下。如果输入没有得到适当的验证和过滤,攻击者就可以利用这一点来发起恶意请求。例如,如果一个应用程序允许用户输入一个URL来下载文件,攻击者可能会输入指向内部服务器的URL,从而访问或者下载内部文件。
1. 验证所有用户输入,确保它们是合法的和预期的。
2. 限制可访问的URL或资源,避免访问内部网络或敏感资源。
3. 使用白名单机制,只允许访问预定义的、安全的URL。
4. 对于敏感操作,实施额外的安全措施,如身份验证和授权检查。
靶场:CTFHub,Pikachu
开启环境后,查看题目条件,找出位于127.0.0.1的flag.php
页面什么也没有
根据题目要求尝试使用这个url参数,进行内网访问,但是页面什么也没有
仔细观察url参数前面有一个_
,将它删掉试试,测试成功
常见的伪协议类型有
• file:///
• dict://
• sftp://
• ldap://
• tftp://
• gopher://
这里我们用到的是file:/// --本地文件传输协议,主要用来访问本地计算机中的文件,构造payload如下。
/?url=file:///var/www/html/flag.php
鬼的,他就三个?对于刚入门的小白,我懵逼了。。。。直到几分钟后我查看了他的源码。
emmmm,这不就是我们的结果嘛,这关过了
题目:来来来性感CTFHub在线扫端口,据说端口范围是8000-9000哦
截取到请求包之后发送到攻击器(Intruder)
添加payload,这里只有一个需要爆破,所以攻击方式选狙击手
设置payload为数值型,因为需要扫描的端口是8000-9000,所以payload配置如下
验证匹配结果,并开始攻击
端口爆破成功,成功找到flag,端口为8248
尝试使用浏览器访问内网的8248端口,成功!
定义:Gopher是早期的Internet信息检索系统,通过索引将用户引导至不同资源,主要使用TCP 70端口
。在WWW普及前,它是主要的检索工具,但现已基本过时,使用较少。
题目:这次是发一个HTTP POST请求.对了.ssrf是用php的curl实现的.并且会跟踪302跳转.加油吧骚年
这个题目中呢有这么一个文件,在127.0.0.1中的flag.php
当我尝试输入了各种值,抓包分析,直到我查看了源码。。
这里有一个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漏洞进行攻击
访问flag.php查看源码找到key,并输入到输入框,使用bp拦截
尝试使用 Gopher 协议
向服务器发送 POST 包
在使用Gopher协议发送POST请求包时,HOST、Content-Type和Content-Length请求头是必不可少的,但是在GET请求中可以没有。key值为自己所获得的。
在向服务器发送请求时,首先浏览器会进行一次URL解码,其次服务器收到请求后,在执行curl功能时,进行第二次解码。
所以我们需要对构造的请求包进行两次编码:
第一次解码
将解码的结果复制下来,保存在txt文档中,其中需要将%0A
替换成 %0D%0A
因为%0A是ASCII 码中的换行符,在URL的二次编码中不需要,否则会导致curl执行错误,导致我们拿不到正确的结果
替换完成之后,再次进行url编码,这里的url就是源码中的curl要执行的
//使用gopher协议,构造payload
?url=gopher://127.0.0.1:80/_二次编码的url(注意别少了前面那个下划线)
得到结果!