Java代码审计安全篇-SSRF(服务端请求伪造)漏洞
前言:
堕落了三个月,现在因为被找实习而困扰,着实自己能力不足,从今天开始 每天沉淀一点点 ,准备秋招 加油
注意:
本文章参考qax的网络安全java代码审计,记录自己的学习过程,还希望各位博主 师傅 大佬 勿喷,还希望大家指出错误
SSRF漏洞
SSRF(Server-side Request Forge, 服务端请求伪造)。
由攻击者构造的攻击链接传给服务端执行造成的漏洞,一般用来在外网探测或攻击内网服务。
危害:
1.获取内网主机、端口、banner信息
2.对内网的应用程序 进行攻击,例如Redis、jboos
3.file等伪协议读取文件
4.造成内网程序的溢出
SSRF审计函数
SSRF漏洞一般位于远程图片加载与下载、图片或文章收藏功能、URL分享、通过URL在线翻译、转码等功能点处。当然,SSRF是由发起网络请求的方法造成。代码审计时需要关注的发起HTTP请求的类及函数,部分如下:
| HttpURLConnection. getInputStream |
Java里面SSRF支持的协议:
https,https,file,ftp等
所以使得JAVA并不能像PHP中一样使用gopher 协议来拓展攻击面,gopher 协议在jdk8 中就被移除了
gopher协议在SSRF中使用可以看下面这篇文章
gopher 协议在SSRF 中的一些利用
我们直接进入Webgoat的靶场进行测试
点击第二关得到

根据提示我们输入 jerry

这时候就说明 传入的参数可控,产生了SSRF漏洞
我们看一下源代码
@RestController
@AssignmentHints({"ssrf.hint1", "ssrf.hint2"})
public class SSRFTask1 extends AssignmentEndpoint {@PostMapping("/SSRF/task1")@ResponseBodypublic AttackResult completed(@RequestParam String url) {return stealTheCheese(url);}protected AttackResult stealTheCheese(String url) {try {StringBuilder html = new StringBuilder();if (url.matches("images/tom\\.png")) {html.append("<img class=\"image\" alt=\"Tom\" src=\"images/tom.png\" width=\"25%\""+ " height=\"25%\">");return failed(this).feedback("ssrf.tom").output(html.toString()).build();} else if (url.matches("images/jerry\\.png")) {html.append("<img class=\"image\" alt=\"Jerry\" src=\"images/jerry.png\" width=\"25%\""+ " height=\"25%\">");return success(this).feedback("ssrf.success").output(html.toString()).build();} else {html.append("<img class=\"image\" alt=\"Silly Cat\" src=\"images/cat.jpg\">");return failed(this).feedback("ssrf.failure").output(html.toString()).build();}} catch (Exception e) {e.printStackTrace();return failed(this).output(e.getMessage()).build();}}
}
主要看下面几行代码
public AttackResult completed(@RequestParam String url) {return stealTheCheese(url);}
// completed() 方法使用 @PostMapping 注解标记,表示它处理HTTP POST请求,并且映射到路径 "/SSRF/task1"。该方法接受一个名为 "url" 的请求参数,类型为字符串。
意思就是接受url的参数 并映射到到路径 "/SSRF/task1
然后看下一句
protected AttackResult stealTheCheese(String url) {try {StringBuilder html = new StringBuilder();
//stealTheCheese() 方法是一个受保护的方法,用于处理传入的URL并返回相应的结果。它接受一个名为 "url" 的字符串参数。方法逻辑:stealTheCheese() 方法首先创建了一个 StringBuilder 对象 html,用于构建HTML响应。
就是很明显没有对这个url进行过滤处理等,然后 就直接进入下面的url匹配,
这段代码是一个简单的SSRF攻击任务处理器。它接受一个URL作为输入,并根据URL的不同返回不同的HTML响应。然而,代码中存在一些潜在的安全风险,因为它没有对传入的URL进行充分的验证和过滤,可能导致安全漏洞,如SSRF攻击。
我们接着看下一关

我们先点击看看会是啥样
我们还是根据提示进行输入
url=http://ifconfig.pro
验证成功
说明url参数可控,可以通过恶意语句进行对内网主机信息的获取
我们分析源代码
@RestController
@AssignmentHints({"ssrf.hint3"})
public class SSRFTask2 extends AssignmentEndpoint {@PostMapping("/SSRF/task2")@ResponseBodypublic AttackResult completed(@RequestParam String url) {return furBall(url);}protected AttackResult furBall(String url) {if (url.matches("http://ifconfig\\.pro")) {String html;try (InputStream in = new URL(url).openStream()) {html =new String(in.readAllBytes(), StandardCharsets.UTF_8).replaceAll("\n", "<br>"); // Otherwise the \n gets escaped in the response} catch (MalformedURLException e) {return getFailedResult(e.getMessage());} catch (IOException e) {// in case the external site is down, the test and lesson should still be okhtml ="<html><body>Although the http://ifconfig.pro site is down, you still managed to solve"+ " this exercise the right way!</body></html>";}return success(this).feedback("ssrf.success").output(html).build();}var html = "<img class=\"image\" alt=\"image post\" src=\"images/cat.jpg\">";return getFailedResult(html);}private AttackResult getFailedResult(String errorMsg) {return failed(this).feedback("ssrf.failure").output(errorMsg).build();}
}
咱们主要关注下面两行代码
public AttackResult completed(@RequestParam String url) {return furBall(url);}completed() 方法使用 @PostMapping 注解标记,表示它处理HTTP POST请求,并且映射到路径 "/SSRF/task2"。该方法接受一个名为 "url" 的请求参数,类型为字符串。protected AttackResult furBall(String url) {//furBall() 方法是一个受保护的方法,用于处理传入的URL并返回相应的结果。它接受一个名为 "url" 的字符串参数。
下面就是常规的正则匹配,总体而言,这段代码是另一个简单的SSRF攻击任务处理器。它接受一个URL作为输入,并尝试访问该URL获取HTML内容,并根据结果返回相应的响应。如果访问成功,则返回包含HTML内容的成功响应;如果访问失败,则返回一个包含特定错误消息的失败响应。
具体的JAVA中 SSRF漏洞可以访问
https://www.freebuf.com/vuls/293473.html
SSRF修复
1,过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
2, 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
3,限制请求的端口为http常用的端口,比如,80,443,8080,8090。
4,黑名单内网ip,(正确判断内网IP,正确获取host)
5,禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。
6.正确处理302跳转
相关文章:
Java代码审计安全篇-SSRF(服务端请求伪造)漏洞
前言: 堕落了三个月,现在因为被找实习而困扰,着实自己能力不足,从今天开始 每天沉淀一点点 ,准备秋招 加油 注意: 本文章参考qax的网络安全java代码审计,记录自己的学习过程,还希望各…...
入门可解释机器学习和可解释性【内容分享和实战分析】
本篇文章为天池三月场读书会《可解释机器学习》的内容概述和项目实战分享,旨在为推广机器学习可解释性的应用提供一定帮助。 本次直播分享视频和实践代码以及PP获取地址:https://tianchi.aliyun.com/specials/promotion/activity/bookclub 目录 内容分…...
Promise其实也不难
难点图解:then()方法 ES6学习网站:ES6 入门教程 解决:回调地狱(回调函数中嵌套回调) 两个特点: (1)对象的状态不受外界影响。Promise对象代表一个异步操作&…...
吴恩达 x Open AI ChatGPT ——如何写出好的提示词视频核心笔记
核心知识点脑图如下: 1、第一讲:课程介绍 要点1: 上图展示了两种大型语言模型(LLMs)的对比:基础语言模型(Base LLM)和指令调整语言模型(Instruction Tuned LLM࿰…...
JVM从1%到99%【精选】-【初步认识】
目录 1.java虚拟机 2.JVM的位置 3.代码的执行流程 4.JVM的架构模型 5.JVM的生命周期 6.JVM的整体结构 1.java虚拟机 Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成。JVM平台的各种语言可以共享Java…...
pdf转图片(利用pdf2image包)
参考: pdf2image pip install pdf2image代码: from pdf2image import convert_from_path, convert_from_bytes import osoutput_folder ./xx/ dpi_value 600 pdf_start_page 1 # pdf显示的第一页 start_page 1 # 真实页码 prex # 图像前缀def to_…...
SwiftUI的转场动画
SwiftUI的转场动画 记录一下SwiftUI中的一些弹窗动画 import SwiftUIstruct TransitionBootCamp: View {State var showView falselet screenWidth UIScreen.main.bounds.widthlet screenHeight UIScreen.main.bounds.heightvar body: some View {ZStack(alignment: .botto…...
Trust Region Policy Optimization (TRPO)
Trust Region Policy Optimization (TRPO) 是一种强化学习算法,专门设计来改善策略梯度方法在稳定性和效率方面的表现。由 John Schulman 等人在 2015 年提出,TRPO 的核心思想是在策略优化过程中引入一个信任区域(trust region)&a…...
消息服务--Kafka的简介和使用
消息服务--Kafka的简介和使用 前言异步解耦削峰缓存1、消息队列2、kafka工作原理3、springBoot KafKa整合3.1 添加插件3.2 kafKa的自动配置类3.21 配置kafka地址3.22 如果需要发送对象配置kafka值的序列化器3.3 测试发送消息3.31 在发送测试消息的时候由于是开发环境中会遇到的…...
【c++11线程库的使用】
#include<iostream> #include<thread> #include<string> using namespace std; void hello(string msg) { for (int i 0; i < 1000; i) { cout << i; cout << endl; } } int main() { //1.创建线程 thread …...
无限debugger的几种处理方式
不少网站会在代码中加入‘debugger’,使你F12时一直卡在debugger,这种措施会让新手朋友束手无策。 js中创建debugger的方式有很多,基础的形式有: ①直接创建debugger debugger; ②通过eval创建debugger(在虚拟机中…...
数据库基础理论知识
1.基本概念 数据(Data):数据库存储的基本对象。数字、字符串、图形、图像、音频、视频等数据库(DB):在计算机内,永久存储、有组织、可共享的数据集合数据库管理系统(DBMS):管理数据库的系统软件数据库系统(DBS):DBDBMSDBADBAP 数…...
华为OD机试真题-模拟目录管理-2024年OD统一考试(C卷)
题目描述: 实现一个模拟目录管理功能的软件,输入一个命令序列,输出最后一条命令运行结果。 支持命令: 1)创建目录命令:mkdir 目录名称,如mkdir abc为在当前目录创建abc目录,如果已存在同名目录则不执行任何操作。此命令无输出。 2)进入目录命令:cd 目录名称, 如cd …...
yield代码解释
目录 我们的post请求爬取百度翻译的代码 详细解释 解释一 解释二 再说一下callback 总结 发现了很多人对存在有yield的代码都不理解,那就来详细的解释一下 我们的post请求爬取百度翻译的代码 import scrapy import jsonclass TestpostSpider(scrapy.Spider):…...
C#四部曲(知识补充)
Unity跨平台原理 .Net相关 只要编写的时候遵循.NET的这些规则,就能在.NET平台下通用 各种源码→根据.NET规范编写→(虚拟机)生成CIL中间码(保存在程序集中)→转成操作系统原代码 跨语言← 跨平台↓ Unity跨平台原理(Mono) c#脚本→MonoC#编…...
Vue中的数据交互有几种方式
1. 单向数据流: Vue中的数据流是单向的,从父组件传递到子组件。父组件可以通过props将数据传递给子组件,子组件通过props接收并使用这些数据。这种方式适用于父子组件之间的简单通信。 2. 事件: 子组件可以通过触发自定义事件来…...
2.MySQL中的数据类型
整数类型: tinyint(m): 1个字节 范围(-128~127) 常用:性别 0和1表示性别;状态 0和1表示 int(m): 4个字节 范围(-2147483648~2147483647) 常用:数值 数值类型中的长度m是值显示长度,只有字段指定zerofill时有用 例如…...
身份证查询真伪-三要素查验-ios身份证实名认证接口调用
身份证实名认证接口联网核验是实名认证的关键一步,通过翔云OCR识别出的身份证信息,联网上传全国人口数据库,通过比对查找,确认人口数据库是否有身份证号和姓名匹配的信息,如果有那就确认身份证是真的,如果没…...
@EnableWebMvc介绍和使用详细demo
EnableWebMvc是什么 EnableWebMvc 是 Spring MVC 中的一个注解,它用于启用 Spring MVC 框架的基本功能,以便你可以使用 Spring MVC 提供的特性来处理 Web 请求。 通常情况下,在基于 Spring Boot 的应用中,并不需要显式地使用 Ena…...
VC-旅游系统-213-(代码+说明)
转载地址: http://www.3q2008.com/soft/search.asp?keyword旅游系统 旅游信息管理系统开题报告 一、研究目的 旅游信息管理系统能帮助旅行社在游客的市场开拓、游客的信息管理、客户服务等方面进行综合处理。使旅行社能够准确的掌握客户的市场动态,充分了解对客户…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...
