首页 文章 精选 留言 我的

精选列表

搜索[c 17],共10000篇文章
优秀的个人博客,低调大师

Windows DNS服务器曝"蠕虫级"漏洞,已存在长达17年

漏洞介绍 SigRed漏洞的高危害性在于其是可蠕虫的,也就是可以自传播的,无需用户交互就能传播到易受攻击的设备上,允许未经身份验证的远程攻击者获得针对目标服务器的域管理员特权,并完全控制组织的IT基础架构。 漏洞运行机制 攻击者可以通过将恶意DNS查询发送到Windows DNS服务器并实现任意代码执行来利用SigRed漏洞,从而使黑客能够拦截和操纵用户的电子邮件和网络流量,使服务不可用,收获用户的电子邮件。 当DNS服务器无法解析给定域名(例如www.google.com)的IP地址时,查询会被转发到权威DNS服务器(NS),也就是转发查询。 为了利用这个查询逻辑,SigRed首先需要配置一个域的(“ deadbeef.fun”)NS资源记录,用来指向恶意名称服务器(“ns1.41414141.club”),然后查询目标DNS服务器的域,以便从名称服务器获得与域或其子域相关的所有后续查询的解析响应。 这些设置完成后,攻击者只要发送一个大小超过64KB的SIG记录,就能导致在分配的小缓冲区上引发大约64KB的受控堆缓冲区溢出,触发恶意 DNS 查询,然后在分析转发查询的传入响应的函数中触发整数溢出漏洞(“dns.exe!sigwirelead“)。 换句话说,该漏洞针对的是负责为资源记录分配内存的函数,一旦生成大于65535的字节数,就会导致整数溢出,分配变小。不过,一条DNS消息的UDP限制为512字节(如果服务器支持扩展机制,则限制为4096字节),而TCP 限制为65535字节,因此,仅带有长签名的SIG响应不足以触发此漏洞。但攻击者可以巧妙地利用DNS响应中的DNS名称压缩功能,从而利用上述操作将缓冲区大小增加,进而依旧达到缓冲区溢出的目的。 此外,SigRed还能在特定的一些情况下通过浏览器远程触发,例如基于Internet Explorer和非Chromium的Microsoft Edge浏览器,攻击者可以利用Windows DNS服务器对连接重用和查询管道功能的支持,在访问其控制下的网站时,将HTTP请求负载内的DNS查询“偷偷转发”到目标DNS服务器。甚至,还可以实现write What where功能,进一步利用漏洞泄漏内存地址,从而让对手劫持执行流并使其执行意外的指令。 令人惊讶的是,DNS客户端(“dnsapi.dll)不易受同一个bug的影响,这使得研究人员怀疑“微软为DNS服务器和DNS客户端设置了两个完全不同的代码基,并且没有在它们之间同步漏洞补丁。” 缓解措施 Windows DNS服务器作为核心网络组件,一旦DNS服务器泄露是非常严重的安全问题,而在大多数情况下,它使攻击者离破坏整个组织仅一寸之遥,企业势必要引起重视。虽然微软表示目前还没有证据表明该漏洞已经被利用,但建议用户立即安装安全补丁:https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-1350 此外,用户也可以DNS消息的最大长度(通过TCP)设置为“ 0xFF00”,以消除缓冲区溢出的可能。

优秀的个人博客,低调大师

SpringBoot图文教程17—上手就会 RestTemplate 使用指南「Get Post」「设置请求头」

有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1—SpringBoot+Mybatis 环境搭建 SpringBoot图文教程2—日志的使用「logback」「log4j」 SpringBoot图文教程3—「‘初恋’情结」集成Jsp SpringBoot图文教程4—SpringBoot 实现文件上传下载 SpringBoot图文教程5—SpringBoot 中使用Aop SpringBoot图文教程6—SpringBoot中过滤器的使用 SpringBoot图文教程7—SpringBoot拦截器的使用姿势这都有 SpringBoot图文教程8—SpringBoot集成MBG「代码生成器」 SpringBoot图文教程9—SpringBoot 导入导出 Excel 「Apache Poi」 SpringBoot图文教程10—模板导出|百万数据Excel导出|图片导出「easypoi」 SpringBoot图文教程11—从此不写mapper文件「SpringBoot集成MybatisPlus」 SpringBoot图文教程12—SpringData Jpa的基本使用 SpringBoot图文教程13—SpringBoot+IDEA实现代码热部署 SpringBoot图文教程14—阿里开源EasyExcel「为百万数据读写设计」 SpringBoot图文教程15—项目异常怎么办?「跳转404错误页面」「全局异常捕获」 SpringBoot图文教程16—SpringBoot 多模块开发「web」「打包」 前言 问个问题:通过Java代码怎么发送Http请求,请求另一个Java程序的Controller方法呢? 好像真的有点触及到知识盲区了呦 在以前的代码中,Java程序都是被请求的一方,发送请求的要么是Ajax,要么是浏览器,要么是postman等,今天就来一起学习一下如何通过Java代码发送Http请求。 RestTemplate 的使用 准备工作「可以跳过,不影响教程学习」 因为我们要通过RestTemplate发送请求,请求另外一个项目的Controller层方法(接口),所以我们首先需要一个被请求的项目。关于这个项目,我已经搭建好了,码云地址为:https://gitee.com/bingqilinpeishenme/boot-demo/tree/master/boot-base-rest 在项目中有三个方法,分别是测试Get请求和Post请求如下 package com.lby.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; /** * @author luxiaoyang * @create 2020-03-18-20:02 */ @Controller public class TestController { /** * @GetMapping("testRestGet") 当前方法只接受Get请求 * 等价于 * @RequestMapping(path = "testRestGet",method = RequestMethod.GET) */ @GetMapping("testRestGet") @ResponseBody public String testRestGet(String username){ return "这是一个Get请求,接受参数:"+username; } /** * @PostMapping("") 当前方法只接受Post请求 * 等价于 * @RequestMapping(path = "testRestPost",method = RequestMethod.POST) */ @PostMapping("testRestPost") @ResponseBody public String testRestPost(String username){ return "这是一个Post请求,接受参数:"+username; } /** * 测试 postForLocation 给RestTemplate响应url地址 */ @PostMapping("testRestPostLocation") public String testRestPostLocation(String username){ System.out.println(username); return "redirect:/success.html"; } } 什么是RestTemplate Spring中封装的通过Java代码发送RestFul请求的模板类,内置发送get post delete等请求的方法,在SpringBoot中只要导入spring-boot-starter-web的依赖可以直接使用。 快速开始 确定项目中导入spring-boot-starter-web的依赖。 第一步:配置RestTemplate /** * RestTemplate配置 */ @Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate(ClientHttpRequestFactory factory) { return new RestTemplate(factory); } @Bean public ClientHttpRequestFactory simpleClientHttpRequestFactory() { SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); // 超时设置 factory.setReadTimeout(5000);//ms factory.setConnectTimeout(15000);//ms return factory; } } 第二步:直接使用RestTemplate的Api发送请求 这一步,我们直接在测试类中发送Get方式的请求,进行简单的测试,感受到效果之后,再进行更多API深入的学习。 package com.lby; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.web.client.RestTemplate; @RunWith(SpringRunner.class) @SpringBootTest(classes = {BootResttemplateApplication.class}) public class BootResttemplateApplicationTests { @Autowired private RestTemplate restTemplate; /** * 测试get请求 */ @Test public void test1(){ /** * getForObject * * 参数1 要请求的地址的url 必填项 * 参数2 响应数据的类型 是String 还是 Map等 必填项 * 参数3 请求携带参数 选填 * * getForObject 方法的返回值就是 被调用接口响应的数据 */ String result = restTemplate.getForObject("http://localhost:8802/product/showProductById?id=1", String.class); System.out.println(result); } } RestTemplate的主要API HTTP Method RestTemplate Methods Get getForObject, getForEntity Post postForEntity, postForObject, postForLocation PUT put any exchange, execute DELETE delete HEAD headForHeaders OPTIONS optionsForAllow 以上是RestTemplate的主要API,其中大部分的API会在后续的代码中详细讲解。 Get请求的所有使用方式 Get请求方式: url拼接参数 url拼接参数「占位符的方式」 获取响应实体对象「响应状态码」 /** * 测试get请求 */ @Test public void test1(){ /** * getForObject * * 参数1 要请求的地址的url 必填项 * 参数2 响应数据的类型 是String 还是 Map等 必填项 * 参数3 请求携带参数 选填 * * getForObject 方法的返回值就是 被调用接口响应的数据 */ String result = restTemplate.getForObject("http://localhost:8802/testRestGet?username=zhangsan", String.class); System.out.println(result); /** * getForEntity 方法 * 参数1 要请求的地址的url 必填项 * 参数2 响应数据的类型 是String 还是 Map等 必填项 * 参数3 请求携带参数 选填 * * 返回值类型为 ResponseEntity * * 可以通过ResponseEntity 获取响应的数据,响应的状态码等信息 */ ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://localhost:8802/testRestGet?username=zhangsan", String.class); System.out.println("获取响应的状态:"+responseEntity.getStatusCode()); System.out.println("获取响应的数据:"+responseEntity.getBody()); /** * 通过Map传参 */ Map map= new HashMap(); map.put("name","zhangsan"); String resultId = restTemplate.getForObject("http://localhost:8802/testRestGet?username={name}", String.class,map); System.out.println(resultId); } 需要注意的是通过Map方式传参 执行测试类代码,可以看到如下效果: Post请求的所有使用方式 post请求三种情况 模拟携带表单参数 url拼接参数 请求成功之后,获取跳转地址 /** * 测试Post请求 */ @Test public void test2(){ /** * postForObject 返回值为响应的数据 * 参数1 要请求地址的url * 参数2 通过LinkedMultiValueMap对象封装请求参数 模拟表单参数,封装在请求体中 * 参数3 响应数据的类型 */ LinkedMultiValueMap<String, String> request = new LinkedMultiValueMap<>(); request.set("username","zhangsan"); String result = restTemplate.postForObject("http://localhost:8802/testRestPost",request,String.class); System.out.println(result); /** * Post请求的时候同样也可以进行参数拼接,使用方式和Get一样 * 示例如下,通过map封装数据,利用占位符的方式可以将参数拼接到url上 * 和Get请求url拼接一样 */ Map map = new HashMap(); map.put("password","123456"); String result2 = restTemplate.postForObject("http://localhost:8802/testRestPost?password={password}",request, String.class,map); /** * postForLocation 这个API和前两个都不一样 * * 登录or注册都是post请求,而这些操作完成之后呢?大部分都是跳转到别的页面去了,这种场景下,就可以使用 postForLocation 了,提交数据,并获取返回的URI * 响应参数要跳转的地址 */ URI uri = restTemplate.postForLocation("http://localhost:8802/testRestPostLocation", request); System.out.println("postForLocation请求到的地址为:"+uri); } 执行测试方法,效果如下: Tips:delete,put等请求方式的使用类似Get和Post,模仿Get和Post 即可搞定。 Get和Post如何设置请求头 通用方式设置请求头「适合Get,Post等请求」 1.创建ClientHttpRequestInterceptor类,添加请求头 package com.lby; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpRequest; import org.springframework.http.client.ClientHttpRequestExecution; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.ClientHttpResponse; import java.io.IOException; /** * @author luxiaoyang * @create 2020-03-20-20:37 */ public class UserAgentInterceptor implements ClientHttpRequestInterceptor { @Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { HttpHeaders headers = request.getHeaders(); // 设置请求头参数 headers.add(HttpHeaders.USER_AGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"); return execution.execute(request, body); } } 2.在Get请求的时候,使用请求头 /** * 通用方式设置请求头 */ @Test public void test3(){ /** * RestTemplate设置使用请求头的拦截器 */ restTemplate.setInterceptors(Collections.singletonList(new UserAgentInterceptor())); /** * 正常的发送请求 */ String result = restTemplate.getForObject("http://localhost:8802/testRestGet?username=zhangsan", String.class); System.out.println(result); } Post请求设置请求头的第二种方式 Post请求的第二个参数是Request,可以根据请求头 + 请求参数,构建 HttpEntity 对象,将这个作为post的请求request参数传入。具体的代码如下: /** * Post方式设置请求头 */ @Test public void test4(){ //1. 设置请求头参数 HttpHeaders requestHeaders = new HttpHeaders(); requestHeaders.add(HttpHeaders.USER_AGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " + "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"); //2. 模拟表单参数 请求体携带参数 MultiValueMap<String, String> requestBody = new LinkedMultiValueMap<>(); requestBody.add("username", "zhangsan"); //3. 封装HttpEntity对象 HttpEntity<MultiValueMap> requestEntity = new HttpEntity<MultiValueMap>(requestBody, requestHeaders); RestTemplate restTemplate = new RestTemplate(); //4. 发送Post请求 ResponseEntity<String> responseEntity = restTemplate.postForEntity("http://localhost:8802/testRestPost", requestEntity, String.class); System.out.println(responseEntity.getBody()); } 总结 所有示例代码下载地址:https://gitee.com/bingqilinpeishenme/boot-demo/tree/master 恭喜你完成了本章的学习,为你鼓掌!如果本文对你有帮助,请帮忙点赞,评论,转发,这对作者很重要,谢谢。 让我们再次回顾本文的学习目标 掌握SpringBoot中RestTemplate的使用 要掌握SpringBoot更多的用法,请持续关注本系列教程。 求关注,求点赞,求转发

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册