SSRF服务器请求伪造

news2024/11/15 1:32:54

目录

SSRF服务器请求伪造

一、SSRF漏洞概述

二、SSRF常见的函数

1、file_get_contents()

2、fsockopen()

3、exec()发送GET请求

4、exec()发送POST请求

三、SSRF主要危害

1、先准备以下脚本

2、读取文件和信息

3、内网扫描

4、获取指纹信息

四、SSRF漏洞挖掘技巧

1、从URL中寻找特殊字段

2、从Web页面功能上寻找

五、SSRF的判断方法

六、SSRF利用方式

七、SSRF绕过技巧

1、将IP地址转换为十进制

2、重新构造URL地址

3、使用短网址,这个只需要付费就可以使用,转换后直接拿来用就好了

八、SSRF防御


一、SSRF漏洞概述

SSRF(Server-Side Request Forgery:服务器端请求伪造)其形成的原因大都是由于服务器端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格的过滤与限制。导致攻击者可以传入任意地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。

 数据流:攻击者 ---> 服务器 ---> 目标地址

通俗的来说就是我们可以“伪造”服务器端发起的请求,从而获取客户端所不能得到的数据。

二、SSRF常见的函数

 file_get_contents();
 fsockopen();
 curl_exec();

这些函数的共同特点就是通过一些网络协议去远程访问目标服务器上的资源,然后对资源进行处理。

1、file_get_contents()

 //直接访问一个URL地址,并输出结果
 $resp = file_get_contens("http://192.168.230.147/security/login.html");
 echo $resp;
  • 比如我写一个页面,命名为 ssrf.php ,内容如下

    image-20240816175858332

    image-20240816175929519

2、fsockopen()

 <?php
 //实例化一个到 www.woniuxy.com:80 的链接,超时时间30秒
 $fp = fsockopen("192.168.230.150",80,$errno,$errstr,30);
 // $fp = fsockopen("www.woniuxy.com",80,$errno,$errstr,30);
 //拼接HTTP请求头
 $out = "GET /login.html HTTP/1.1\r\n";
 //$out .= "GET book/reading/221 HTTP/1.1\r\n";
 $out .= "HOST: 192.168.230.150\r\n";
 $out .= "Connection: Close\r\n\r\n";
 //将请求头写入$fp实例并发送
 fwrite($fp,$out);
 //按行读取响应并输出
 while (!feof($fp)) {
     echo fgets($fp,1024);
 }
 fclose($fp);
 ?>

访问 http://192.168.230.147/security/ssrf.php,得到:

image-20240816182252089

这是什么玩意,以前怎么没有,Fiddler抓包查看内容

image-20240816182608858

image-20240816182800707

我们可以看到,访问一个ssrf.php 的响应中,有两个响应头,通过对比,下面第二个响应头就是输出在页面的响应头,这是为什么呢?

实际上第一个响应头是访问 ssrf.php 的响应头,第二个是代码GET请求访问 192.168.230.150/login.html 的响应头

3、exec()发送GET请求

 <?php
 //创建一个CURL资源
 $ch = curl_init();
 //设置URL和相应的选项
 curl_setopt($ch,CURLOPT_URL,"http://192.168.230.150/login.html");
 curl_setopt($ch,CURLOPT_HEADER,0); 
 //1 表示获取访问http://192.168.230.150/login.html的响应头;0 表示不获取(获取页面上可以看到,不获取页面上看不到)
 //抓取URL并把它传递给浏览器
 curl_exec($ch);
 //关闭CURL资源,并且释放系统资源
 curl_close();
 ?>

image-20240816184219512

但事实上,我在192.168.230.150/login.html 中更换了背景图片为

那为什么访问这个依旧是原来的背景图片呢,是因为程序依旧是将请求回来的响应作为自己的代码运行,而刚好我本地对应的目录下由原来的这张图片

4、exec()发送POST请求

 <?php
 $url = "http://192.168.230.147/security/login_2.php";
 $data = "username=ymqyyds&password=p-0p-0p-0&vericode=0000";
 ​
 $ch = curl_init();
 $params[CURLOPT_URL] = $url;     //请求URL地址
 $params[CURLOPT_HEADER] = true;  //是否返回响应头信息
 $params[CURLOPT_RETURNTRANSFER] = true;  //是否将结果返回
 $params[CURLOPT_FOLLOWLOCATION] = false; //是否重定向
 $params[CURLOPT_TIMEOUT] = 30;   //超时时间
 $params[CURLOPT_POST] = true;    //是否为POST请求
 $params[CURLOPT_POSTFIELDS] = $data;     //给POST请求正文赋值
 $params[CURLOPT_SSL_VERIFYPEER] = false; //请求https时,不验证证书
 $params[CURLOPT_SSL_VERIFYHOST] = false; //请求https时,不验证主机
 ​
 curl_setopt_array($ch,$params);  //传入CURL参数
 $content = curl_exec($ch);
 curl_close($ch);                 //关闭连接
 ?>

image-20240816185926235

如果设置 $params[CURLOPT_HEADER] = false; ,则

image-20240816190324193

三、SSRF主要危害

SSRF利用条件:URL地址可控,后台页面没有对URL进行正确的校验,在页面中最好有输出

(1)可以对外网,服务器所在的内网,本地进行端口扫描,获取一些服务器信息

(2)攻击运行在内网或本地的应用程序(比如溢出)

(3)对内网Web应用进行指纹识别,通过访问默认文件实现;

(4)攻击内外网的Web应用,主要是使用Get参数就可以实现的攻击(比如Struts

2漏洞利用,SQL注入等);

(5)利用file,dict,gopher,http,https等协议读取本地文件,访问敏感目标,反弹shell等高位操作

1、先准备以下脚本

 <?php
 $url = $_GET['url'];
 $resp = file_get_contents($url);
 echo $resp;
 // //或使用以下方式
 // $ch = curl_init();
 // curl_setopt($ch,CURLOPT_URL,$_GET['url']);
 // curl_setopt($ch,CURLOPT_HEADER,0);
 // $content = curl_exec($ch);
 // echo $content;
 // curl_close($ch);
 ?>

2、读取文件和信息

  • file://

file://用于访问本地文件系统,并且不受allow_url_fopen,allow_url_include影响file://协议主要用于访问文件(绝对路径、相对路径以及网络路径)比如:http://www.xx.com?file=file:///etc/passsword

image-20240816195441036

注意,这里访问时,使用file://../../../../etc/passwd 是错误的,但是使用 file:///../../../etc/passwd 就是正确的,也就是说不管如何,在 file:// 后再加一个 / 才是正确的用法。使用 file:///etc/passwd 也是正确的

image-20240816195838668

  • 远程读取访问

image-20240816200154302

http://192.168.230.150

image-20240816200223135

http://192.168.230.150:88

image-20240816200239522

http://192.168.230.150:81

image-20240816200258587

  • php://filter/read=convert.base64-encode/resource

image-20240816225950462

3、内网扫描

(1)使用burp遍历IP地址或端口完成扫描

举个例子:通过端口扫描内网存活主机

image-20240816231718902

image-20240816231739052

image-20240816231755643

(2)使用Python代码进行类似的扫描

 import time,requests
 ​
 def port_scan():
     for i in range(1,256):
         url = f"http://192.168.230.147/security/ssrf.php?url=http://192.168.230.150:{i}"
         # url = f"http://192.168.230.147/security/ssrf.php?url=http://192.168.230.15"
         resp = requests.get(url)
         # print(resp.text)
         time.sleep(0.8)
         print(f"192.168.230.150:{i} 正在扫描")
         if ("file_get_contents" not in resp.text) or ("Warning" not in resp.text):
             print(f"192.168.230.150:{i}在线")
 ​
 def url_scan():
     for i in range(1,255):
         for j in range(1,255):
             url = f"http://192.168.230.147/security/ssrf.php?url=http://192.168.{i}.{j}:80"
             try:
                 resp = requests.get(url=url,timeout=1)
                 print(f"192.168.{i}.{j}:80 正在扫描")
                 time.sleep(0.8)
                 if ("file_get_contents" not in resp.text) or ("Warning" not in resp.text):
                     print(f"192.168.{i}.{j}:80   在线")
             except:
                 pass
 ​
 if __name__ == '__main__':
     # port_scan()
     url_scan()
 ​

由于并不知道正确访问到的响应是怎样的,不同服务,响应不同,所以无法通过响应来判断是,只能够通过响应判断不是

真实情况我们需要扫描A B C类,三类IP地址,甚至包括端口号也要带上,所以总的下来我们所需发送的请求还挺多的

并且,这段代码只是基于后台使用的是file_get_contents函数才可以使用,如果后台使用curl_exec的方式,我们就需要先区分curl_exec模式下,正常访问和访问不到时二者的区别,基于此再做判断条件

甚至有些端口即使开放,但访问时依旧没有任何回显,比如 php-fpm 的默认9000端口,用于与nginx通信的服务,此时我们可以通过响应的状态码来作为判断条件

4、获取指纹信息

根据扫描结果,进一步实现内网访问,进而获取服务器指纹信息,规划下一步攻击方案

url=gopher://192.168.230.15:22
url=dict://192.168.230.15:3306
url=http://192.168.230.15:22

通过使用三种协议,去访问服务器的不同服务,根据响应情况来判断服务器是否开启对应的服务,有时候会暴露服务器的指纹信息

image-20240817154552010

image-20240817154605900

image-20240817154615005

image-20240817154636630

而且进一步可以利用Gopher协议,可以生成基于MySQL和Redis等的RCE的Payload,过程可以去网上搜搜

四、SSRF漏洞挖掘技巧

1、从URL中寻找特殊字段

url地址参数一般程序员命名都是符合单词含义的,所以通过在URL中寻找特殊关键词,可以判断是否存在SSR(Server-Side Request)

又因为正常情况下,服务器的请求都是普普通通的,而一些包含了特殊关键字的请求URL就显得很另类了,也许程序员一不小心就留下了F(Forgery)

share
wap
url
link
src
source
target
u
3g
display
sourceURI
imageURL
domain
location
remote
...

2、从Web页面功能上寻找

image-20240817155822286

五、SSRF的判断方法

SSRF根据业务功能不同,返回的内容也会有区别,大致分为三类:

完全回显:可以通过会先信息来判断是否存在漏洞
半回显:虽然不能完全回显出信息,但是也能显示出title,图片等有价值的信息
无回显:需要向忙著那样用其他方法尝试确认漏洞的存在

遇到无回显的时候,怎么去判定是否存在SSRF呢

  • DNSlog

  • 租用公网服务器,查看访问日志

  • 时间型盲注

SSRF在有无回显方面的利用及其思考与总结 - 先知社区 (aliyun.com)

六、SSRF利用方式

gopher://

dict://

file://

http://

image-20240817160958648

七、SSRF绕过技巧

1、将IP地址转换为十进制

在网上找这样的在线工具IP地址转换器_IP地址转二进制、十进制、十六进制工具 - 站长工具网 (zhanid.com)

进行IP地址转换,比如:http://192.168.230.150 -》 http://3232294550

image-20240817161535611

当然,这种情况有时候没法,因为后台使用的用于接收url参数的函数可能不接受这样的地址,然后访问会失败,但是这样的十进制IP地址在浏览器中直接访问就可以,会自动跳转为点分十进制,但是SSRF中就可能不支持了

image-20240817162023180

2、重新构造URL地址

后台代码如果对URL地址进行处理,比如

用户访问 ?url=http://192.168.230.150 后台会以 // 作为分隔符,然后取出 192.168.230.150,并判断该ip地址所在的网段 192.168 是否属于白名单网段,此时我们可以通过构造IP地址来绕过

比如 ?url=http://www.woniuxy.com@192.168.230.150/login.html 最终访问到的页面还是 login.html

image-20240817162637723

3、使用短网址,这个只需要付费就可以使用,转换后直接拿来用就好了

八、SSRF防御

(1)限制协议为 HTTP:// HTTPS:// ,不允许其他协议

if(stripos($url,"http") === false || stripos($url,"http") > 0){
    die("URL_ERROR");
}
// stripos($source,$sub) 
// 如果在$source中找到了$sub,那么就返回$sub所在下标的开始位置
// 如果此时$sub刚好在$source的开头,那么将会返回 0 ,但是 PHP中 0==false 是成立的,所以需要用 === 强制等,确保类型也要相等
// 如果没找到,那么就返回false

(2)设置URL或IP地址白名单,非白名单不允许访问

(3)限制内网IP访问,比如URL地址不能以10.0 172.16 192.168 开头等

不过这样的方式可以通过构造URL地址来绕过,比如:

?url=http://www.woniuxy.com@192.168.230.150/login.html

其中 http://www.woniuxy.com 可以访问,但 192.168.230.150 不允许访问,通过这样构造就使得访问到了 192.168.230.150

(4)统一错误信息,避免用户可以根据错误信息来判断远程服务器的端口状态,或直接禁用错误消息

error_reporting(0)
或在所调用函数前加 @

(5)禁止重定向操作(服务器端 客户端 均需要过滤)

使用重定向可以直接跳转到目标URL地址页面,可用于构造钓鱼网站等操作,需要避免

image-20240817164827887

(6)限制请求的端口,比如80,443,8080,8090

(7)后台服务器最好禁止远程用户指定请求参数,让参数不可控

(8)如果一定要通过后台服务器去对用户指定(“或者预埋在前端的请求”)的地址进行资源请求,那么一定要做好目标地址的过滤。

(9)服务器需要认证交互,禁止非正常用户访问服务,杜绝伪造请求,例如Token技术

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2057926.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx---Web服务器

简介 介绍nginx中Web服务器的相关配置 环境配置 mkdir /data/web/html -p mkdir /data/web/html/test{1..5} echo test1 > /data/web/html/test1/index.html echo test2 > /data/web/html/test2/index.html echo test3 > /data/web/html/test3/index.html echo tes…

FPGA时序约束

目录 一、概述二、时序分析基本概念时钟抖动时钟偏差时钟不确定性Clock Uncertainty同步电路和异步电路建立时间和保持时间发起沿和采样沿关键路径 三、时序分析的基本公式时序分析的基本路径数据到达时间和时钟到达时间建立时间的裕量&#xff08;Setup slack&#xff09;保持…

STM32CubeMX 配置串口通信 HAL库

一、STM32CubeMX 配置串口 每个外设生成独立的 ’.c/.h’ 文件 不勾&#xff1a;所有初始化代码都生成在 main.c 勾选&#xff1a;初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。 二、重写fputc函数 ​ #include <stdio.h>#ifdef __GNUC__#def…

“LOCAL_LISTENER”参数导致业务无法连接数据库,文末附Oracle连接故障检查监听的排查流程

1. 背景及问题 今天在Oracle BCV技术[1]做数据同步&#xff0c;建立生产库的测试库&#xff0c;需要DBA配合同步前后的停库和起库。在同步完起库后&#xff0c;有部门反应同步好的测试库连接不上去。 2. 问题排查 以我当前的知识储备&#xff0c;能想到的可能就是以下几点进…

【NLP】注意力机制:规则、作用、原理、实现方式

文章目录 1、本章目标2、注意力机制介绍2.1、注意力概念2.2、注意力机制2.3、翻译举例 3、注意力计算规则3.1、打个比喻3.2、公式3.2.1、线性变换 点积注意力3.2.2、加性注意力3.2.3、点积注意力3.2.4、对比与总结3.2.5、bmm运算 4、注意力机制的作用5、注意力机制原理⭐5.1、…

基于java的美食信息推荐系统的设计与实现论文

摘 要 使用旧方法对美食信息推荐系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在美食信息推荐系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开发的美…

Linux系统-vi/vim编辑器权限管理文档处理三剑客

1.vi/vim文本编辑器 vim是vi的增强版&#xff0c;vi是系统自带的。以下命令在vi/vim中通用&#xff1a; 刚打开的默认模式 快捷键&#xff1a;gg 跳到文件开头&#xff0c;G 跳到文件最后一行。 快捷键&#xff1a;0 跳到行首&#xff0c;$ 跳到行尾。 快捷键&#xff1a;…

C++ | Leetcode C++题解之第355题设计推特

题目&#xff1a; 题解&#xff1a; class Twitter {struct Node {// 哈希表存储关注人的 Idunordered_set<int> followee;// 用链表存储 tweetIdlist<int> tweet;};// getNewsFeed 检索的推文的上限以及 tweetId 的时间戳int recentMax, time;// tweetId 对应发送…

vue3--定时任务cron表达式组件比较

## 背景&#xff1a; 之前使用vue2开发项目时&#xff0c;使用了cron组件&#xff0c;比较了两种组件的使用效果。现在需要把原有的vue2项目升级为vue3&#xff0c;需要对应的cron组件。 方案一&#xff0c;vue3-cron-plus 具体实现&#xff1a; 安装插件 npm install vue3-…

浅谈shell中的while true

目录 shell实现死循环你了解while true中的true吗重新认识true和falsewhile true存在的问题实现shell死循环的另一种方法 在shell中实现死循环&#xff0c;一般都会用 while true&#xff0c;那你知道执行while true时&#xff0c;进程都在做些什么吗&#xff1f; shell实现死…

云计算实训32——安装nginx(修改端口为8080)、roles基本用法、使用剧本安装nginx、使用roles实现lnmp

一、安装nginx并更改其端口 编辑hosts配置文件 [rootmo ~]# vim /etc/ansible/hosts 创建目录 [rootmo ~]# mkdir /etc/ansible/playbook 编辑配置文件 [rootmo ~]# vim /etc/ansible/playbook/nginx.yml 执行测试 [rootmo ~]# ansible-playbook /etc/ansible/playbook/n…

【案例49】ORA-01000:超出打开游标的最大数

问题现象 在登录系统时提示报错&#xff1a;ORA-01000 超出打开游标的最大数。 问题分析 游标就是看成是指向结果集的指针。可以把它看成一种资源&#xff0c;或者一种数据结构。 ORA-01000是开发中常见的异常。这个异常表示程序中打开的游标数目> 数据库中设定的可以打开…

OpenCV几何图像变换(2)计算仿射变换矩阵的函数getAffineTransform()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算三对对应点之间的仿射变换。 该函数计算 23 的仿射变换矩阵&#xff0c;使得&#xff1a; [ x i ′ y i ′ ] map_matrix ⋅ [ x i y i 1 …

Datawhale AI 平台 证书 存个档

&#xff01;证书不怕多 &#x1f508; 大模型开发 工程师 欢迎参与 Datawhale 大模型开发 工程师 计划 联合浪潮信息 面向在校学生、社会在职人士 可获官方颁发的 大模型开发工程师 证书 认证地址&#xff1a;大模型开发工程师考试入口&#xff08;电脑端打开&#xff09;评…

C++笔记---类和对象(下)

1. 初始化列表 1.1 初始化列表的使用 在构造函数中&#xff0c;对成员变量进行初始化可以说是公式化的步骤&#xff0c;而初始化列表就将这一步骤进行了标准化。 初始化列表紧跟在构造函数的参数列表后面&#xff0c;使用方式是以一个冒号开始&#xff0c;接着是一个以逗号分…

今日总结:解决了三个小问题

问题01 1.在Bootstrap5中&#xff0c;offcanvas失去焦点后会自动回到顶端&#xff0c;用了一个非常简单的方法&#xff0c;将触发侧边栏的按钮代码由 <button type"button">换成 <a type"button">更多解决方法详见&#xff1a;更多方法 注…

杰发科技AC7801——GPIO通过寄存器地址控制高低电平

通过这个寄存器来查看控制的是哪个ODR值&#xff0c;使用sample&#xff0c;发现是0x20080068的第7和第9位 使用51控制寄存器的代码来置高置低代码&#xff0c;注意变量需要用unsigned int来声明 unsigned int ledBit 0;mdelay(100);ledBit | (1 << 9); ledBit & ~…

【第五节】Win32汇编程序设计

目录 一、汇编的第一个“helloworld” 二、汇编中的标号 三、的使用 四、数据定义 五、全局变量 六、局部变量 七、结构体 八、结构体的访问 九、获取变量地址 十、函数 十一、分支与循环 十二、内联汇编 十三、裸函数的使用 一、汇编的第一个“helloworld” .38…

从桌面到云端,2024年智能录屏解决方案全攻略

从教学演示到游戏直播&#xff0c;从软件教程到会议记录&#xff0c;录屏软件已经逐渐成为不可或缺的工具。那么面对这众多录屏软件我们要怎么选择呢&#xff1f;有没有和win10录屏快捷键一样可以快捷操控的工具呢&#xff1f;这次我们一起来探讨吧。 1.福昕录屏大师 链接&am…

Windows下线程的创建与使用(win32-API)

一、前言 线程是比进程更轻量级的执行单元&#xff0c;允许在一个进程中并发执行多个控制流。每一个线程都有自己的程序计数器、寄存器集和栈空间&#xff0c;但它们共享所属进程的全局数据和资源。这种共享内存模型使线程间的通信比进程间通信更为高效&#xff0c;同时也带来…