当前位置: 首页 > news >正文

JavaSec-其他漏洞

XPATH注入

简介

XPath是一种用于查询和操作XML文档的语言,类似于SQL在数据库中的作用,广泛应用于XML解析和数据提取 XPath注入类似于SQL注入,攻击者通过构造特殊的输入操控未过滤的XPath查询,从而访问或篡改XML数据,甚至绕过验证获取敏感信息

1.漏洞场景:XPATH注入

缺陷代码

public R vul(String username,String password) {try {// 构造XML数据String xmlData = "<users><user><username>admin</username><password>password</password></user></users>";// 解析XML文档DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();Document doc = builder.parse(new InputSource(new StringReader(xmlData)));// 构造XPath表达式(存在注入漏洞)XPath xpath = XPathFactory.newInstance().newXPath();String expression = "/users/user[username='" + username + "' and password='" + password + "']";NodeList nodes = (NodeList) xpath.evaluate(expression, doc, XPathConstants.NODESET);if (nodes.getLength() > 0) {return R.ok("用户名和密码验证通过!");} else {return R.ok("用户名或密码错误!");}...
}

2.安全场景:StringEscapeUtils实体转义

public R safe(String username,String password) {try {DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();String xml = "<users><user><username>admin</username><password>password</password></user></users>";Document doc = builder.parse(new InputSource(new StringReader(xml)));// 使用StringEscapeUtils.escapeXml10()方法对用户输入进行XML实体转义String escapedUsername = StringEscapeUtils.escapeXml10(username);String escapedPassword = StringEscapeUtils.escapeXml10(password);XPath xpath = XPathFactory.newInstance().newXPath();String expression = "/users/user[username='" + escapedUsername + "' and password='" + escapedPassword + "']";NodeList nodes = (NodeList) xpath.evaluate(expression, doc, XPathConstants.NODESET);if (nodes.getLength() > 0) {return R.ok("用户名和密码验证通过!欢迎:" + escapedUsername);} else {return R.error("认证失败:用户名或密码错误");}...
}

Dos攻击

简介

DoS攻击:由单一来源发起,旨在使目标服务不可用,通常规模较小,易于防御 DDoS攻击:由多个来源协同发起,产生巨量流量,导致大规模服务中断,防御难度较大

1.漏洞场景:验证码参数可控

图片功能点(二维码/验证码)参数长、宽可控时,可能导致拒绝服务

public void vul(Integer width,Integer height,HttpServletResponse response) throws IOException {response.setContentType("image/jpeg");response.setHeader("Pragma", "no-cache");response.setHeader("Cache-Control", "no-cache");// 验证码参数可控 造成拒绝服务攻击ShearCaptcha shearCaptcha = CaptchaUtil.createShearCaptcha(width, height,4,3);try {shearCaptcha.write(response.getOutputStream());} catch (IOException e) {throw new RuntimeException(e);}
}

2.漏洞场景:ZIP解压炸弹

某些功能点后端会对上传的文件进行解压并且可以递归解压
测试zip:https://www.bamsoftware.com/hacks/zipbomb/zbsm.zip
漏洞原理:解压zbxl.zip炸弹以后会出现16个压缩包,每个压缩包又包含16个,循环5次,最后得到16的5次方个文件,也就是1048576个文件,一百多万个最终文件,每个大小为4.3GB

// 如果解压出的文件是ZIP文件,则递归解压
if (entry.getName().endsWith(".zip")) {// 创建临时文件来存储这个ZIPFile tempFile = File.createTempFile("unzip", ".zip");try (FileOutputStream fos = new FileOutputStream(tempFile)) {byte[] buffer = new byte[1024];int length;while ((length = zipInputStream.read(buffer)) != -1) {fos.write(buffer, 0, length);}}// 递归解压这个新的ZIP文件unzip(tempFile, currentDepth + 1, maxDepth);// 解压完成后删除临时文件tempFile.delete();
} 

XFF伪造

简介

XFF伪造:通过篡改HTTP头字段(X-Forwarded-For)隐瞒真实IP地址,危害包括隐藏身份、绕过访问控制和污染日志

1.漏洞场景:原生漏洞场景

前后端不分离:服务端可以通过获取request.getRemoteAddr()获取客户端IP前后端分离:如果请求经过了代理服务器(Nginx、Apache)或者负载均衡,客户端和服务端之间增加了中间层,那么服务端无法直接拿到客户端的IP,request.getRemoteAddr()可能返回的是代理服务器的IP,此时,可以通过HTTP请求头X-Forwarded-For(或其他自定义请求头)来获取客户端IP格式为: X-Forwarded-For:client1,proxy1,proxy2(第一个ip为客户端真实ip,后面的为经过的代理服务器ip。现在大部分的代理都会加上这个请求头)

public String vul1(HttpServletRequest request, Model model) {// 前后端不分离 使用request.getRemoteHost()获取客户端IPfinal String remoteHost = request.getRemoteHost();boolean isClientIP8888 = "8.8.8.8".equals(remoteHost);model.addAttribute("clientIP", remoteHost);// 添加敏感信息if (isClientIP8888) {model.addAttribute("sensitiveInfo", "username:admin,password:Admin123");}return "vul/other/onlyForGoogle";
}public String vul2(HttpServletRequest request, HttpServletResponse response, Model model, String xff) {// 前后端分离 模拟通过X-Forwarded-For头获取客户端IPString remoteHost = "";if (xff.equals("true")) {remoteHost = request.getHeader("X-Forwarded-For");}if (remoteHost.isEmpty()) {remoteHost = request.getRemoteHost();}boolean isClientIP8888 = "8.8.8.8".equals(remoteHost);// 添加敏感信息model.addAttribute("clientIP", remoteHost);if (isClientIP8888) {model.addAttribute("sensitiveInfo", "username:admin,password:Admin123");}return "vul/other/onlyForGoogle";
}

2.安全场景:可信源IP过滤

安全编码规范:1. 配置可信IP白名单,仅允许可信代理设置或修改该头信息。2. 限制XFF头格式(合法IPv4/IPv6地址、设定最大长度),防范恶意格式注入与缓冲区溢出攻击。3. 在身份校验和授权中,结合会话标识符、用户令牌等多因素验证,防止伪造导致的认证绕过。

public String safe(HttpServletRequest request, HttpServletResponse response, Model model, String xff){...if (!isTrustedProxy(remoteHost)){model.addAttribute("clientIP", request.getRemoteAddr());model.addAttribute("sensitiveInfo", "源ip不在白名单范围内!");return "vul/other/onlyForGoogle";}...
}
// 判断是否来自可信代理
private boolean isTrustedProxy(String ip) {return Arrays.asList("127.0.0.1", "192.168.1.1", "10.0.0.1").contains(ip);
}

URL重定向

简介

URL重定向:由于服务端未对传入的跳转地址进行检查和控制,从而导致攻击者可以构造任意一个恶意地址诱导用户跳转至恶意站点。因为是从用户可信站点跳转出去的,用户会比较信任该站点,所以URL跳转漏洞常用于钓鱼攻击、通过转到攻击者精心构造的恶意网站来欺骗用户输入信息,从而盗取用户的账号和密码等敏感信息 漏洞场景:登录/登出/注销/错误页面跳转、OAuth第三方登录回调、文件下载,从黑盒的角度上来讲,遇到http(s)://的链接都可以进行Fuzz测试

1.漏洞场景:基于Spring MVC的重定向方式

状态码:301:请求的资源已永久移动到新位置使用场景:页面永久性迁移SEO影响:将旧URL的权重传递给新URL302:请求的资源临时位于不同位置使用场景:资源临时迁移或负载均衡SEO影响:不传递权重,适用于临时重定向

缺陷代码

// 基于Spring MVC的重定向方式
// 通过返回带有 redirect: 前缀的字符串来实现重定向。
public String vul1(@RequestParam("url") String url) {return "redirect:" + url;   // Spring MVC写法 302临时重定向
}// 通过返回 ModelAndView 对象并指定 redirect: 前缀来实现重定向。
public ModelAndView vul2(@RequestParam("url") String url) {return new ModelAndView("redirect:" + url); // Spring MVC写法 使用ModelAndView 302临时重定向
}

2.漏洞场景:基于Servlet标准的重定向方式

代码审计SINK点:redirect、url、redirectUrl、callback、return_url、toUrl、ReturnUrl
fromUrl、redUrl、request、redirect_to、redirect_url、jump、jump_to
target、to、goto、link、linkto、domain、oauth_callback

缺陷代码

// 基于Servlet标准的重定向方式
// 通过设置响应状态码和头部信息实现重定向。
public static void vul2(HttpServletRequest request, HttpServletResponse response) {String url = request.getParameter("url");response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); // 301永久重定向response.setHeader("Location", url);
}// 通过调用 HttpServletResponse.sendRedirect() 实现重定向。
public static void vul3(HttpServletRequest request, HttpServletResponse response) throws IOException {String url = request.getParameter("url");response.sendRedirect(url); // 302临时重定向
}

3.漏洞场景:基于Spring注解和状态码的重定向方式

URL跳转的本质是在服务器端将用户请求的数据进行一次转发,请求可以被重新定向到另一个 URL。这种操作可以分为两种主要类型:服务器端转发和客户端重定向

// 基于Spring注解和状态码的重定向方式
// 使用ResponseEntity设置状态码实现重定向
public ResponseEntity<Void> vul5(@RequestParam("url") String url) {HttpHeaders headers = new HttpHeaders();headers.setLocation(URI.create(url));return new ResponseEntity<>(headers, HttpStatus.FOUND); // 302临时重定向
}// 通过注解设置状态码实现重定向
@ResponseStatus(HttpStatus.FOUND) // 302临时重定向
public void vul6(HttpServletRequest request, HttpServletResponse response) throws IOException {String url = request.getParameter("url");response.setHeader("Location", url);
}

4.安全场景:服务器端转发

服务器内部的重定向,在Servlet中通过RequestDispatcher转发给另一个程序处理请求,请求的数据依然在。所以forward相当于客户端向服务器发送一次请求,服务器处理两次,请求数据不会消失且URL地址只变化一次。

// 内部跳转
public static void safe1(HttpServletRequest request, HttpServletResponse response) {String url = request.getParameter("url");RequestDispatcher rd = request.getRequestDispatcher(url);try {// 做了内部转发rd.forward(request, response);} catch (Exception e) {e.printStackTrace();}
}

5.安全场景:URL白名单校验

安全编码规范:1、避免直接使用用户输入的URL2、设置可信域名列表,并对传入的域名进行校验3、对传入的URL的的数据进行验证

// 定义 URL 白名单
private static final List<String> WhiteUrlList = new ArrayList<>();static {
//        WhiteUrlList.add("baidu.com");
//        WhiteUrlList.add("bilibili.com");WhiteUrlList.add("csdn.net");
}
/*** URL跳转过滤*/
public boolean checkURL(String url) {for (String blackUrl : WhiteUrlList) {if (url.toLowerCase().contains(blackUrl.toLowerCase())) {return false;}}return true;
}

相关文章:

  • SpringBoot 框架第 1 次接口调用慢
  • 使用homeassistant 插件将tasmota 接入到米家
  • Spring Boot 3+:现代Java应用开发的新标杆
  • 【C++特殊工具与技术】优化内存分配(四):定位new表达式、类特定的new、delete表达式
  • 可视化预警系统:如何实现生产风险的实时监控?
  • AlgorithmVisualizer项目改进与部署-网页算法可视化
  • ChatGPT 辅助 PyTorch 开发:从数据预处理到 CNN 图像识别的全流程优化
  • 对比一下blender快捷键:p和alt+p
  • k8s从入门到放弃之Service负载均衡
  • 【C/C++】玩转正则表达式
  • 对象回调初步研究
  • MySQL中【正则表达式】用法
  • Web中间件--tomcat学习
  • Python如何给视频添加音频和字幕
  • ui框架-文件上传组件
  • 在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
  • 门静脉高压——治疗
  • 智能体革命:企业如何构建自主决策的AI代理?
  • 魔兽世界正式服插件与宏-敏锐盗贼实用宏探索(1)-宏命令制作入门与基本知识
  • C++--stack和queue的使用及其模拟实现
  • 路桥贝斯特做网站好吗/西安百度seo
  • 京华建设科技有限公司网站/百度极速版app下载
  • dede网站/网站友情链接查询
  • 深圳做微信网站制作/营销型外贸网站建设
  • 响应式外贸网站建设/seo资源网站 排名
  • 富阳网站开发/产品推广语