IT评测·应用市场-qidao123.com技术社区

标题: 【Java 代码审计入门-03】XSS 毛病原理与实际案例介绍 [打印本页]

作者: 干翻全岛蛙蛙    时间: 2024-12-30 19:15
标题: 【Java 代码审计入门-03】XSS 毛病原理与实际案例介绍
【Java 代码审计入门-03】XSS 毛病原理与实际案例介绍

写在前面

为什么会有这一系列的文章呢?因为我发现网上缺乏成系统的Java代码审计教程,大多是分散的点。对于新人来说,如许的资源大概不敷友好。加上本人也在学习Java审计,希望通过记载和总结本身的学习历程,帮助到更多的人。因此有了本系列的文章。
本系列面向拥有Java基本语法基础的朋友,内容涵盖审计环境介绍、SQL毛病、XSS毛病、SSRF毛病、RCE毛病等原理与实际案例分析。希望这些文章能给你带来劳绩。
目前已完成的内容包括:

XSS 毛病原理简介

XSS(跨站脚本攻击)是通过向网页注入可执行代码并成功使欣赏器执行,以达到攻击目的的一种安全毛病。虽然XSS的危害通常不及SQL注入严重,但一次成功的XSS攻击可以实现多种恶意行为,如盗取Cookies、获取用户接洽人列表、截屏、挟制会话等。根据后端代码的不同,XSS分为反射型、存储型以及DOM型。
反射型 XSS

反射型XSS发生在服务器直接将未经适当处理惩罚的用户输入反射回客户端,如果输入中包罗可执行的JavaScript代码,欣赏器就会执行这段代码。例如,在InfoServlet.java文件中,有如下关键代码:
  1. public void Message(HttpServletRequest req, HttpServletResponse resp) {
  2.     String message = req.getParameter("msg");
  3.     try {
  4.         resp.getWriter().print(message);
  5.     } catch (IOException e) {
  6.         e.printStackTrace();
  7.     }
  8. }
复制代码
当用户输入特殊字符或脚本时,服务器将该输入原样返回给欣赏器,导致XSS攻击发生。
存储型 XSS

存储型XSS则是指恶意脚本被永世地保存在目的服务器上,比如数据库、消息论坛、访客簿等地方。每当后续用户欣赏了含有恶意脚本的数据时,欣赏器就会执行它。如StoreServlet.java中的代码所示,用户提交的数据未经充分验证就存入了数据库,并在表现时被执行。
  1. public void StoreXss(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  2.     String name = req.getParameter("name");
  3.     String mail = req.getParameter("mail");
  4.     String message = req.getParameter("message");
  5.     if(!name.equals(null) && !mail.equals(null) && !message.equals(null)){
  6.         // ... 省略部分代码 ...
  7.         msginfo.MessageInfoStoreService(name, mail, message);
  8.         resp.getWriter().print("<script>alert("添加成功")</script>");
  9.     }
  10. }
复制代码
修复方案

针对XSS毛病,重要的防护步调集中在对输入和输出数据的过滤上。以下是几种常见的防御方法:

下面是一个简朴的XssHttpServletRequestWrapper类实现,用于全局过滤器中对用户输入进行清理:
  1. public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
  2.     public XssHttpServletRequestWrapper(HttpServletRequest request) {
  3.         super(request);
  4.     }
  5.     @Override
  6.     public String[] getParameterValues(String parameter) {
  7.         String[] values = super.getParameterValues(parameter);
  8.         if (values == null) {
  9.             return null;
  10.         }
  11.         int count = values.length;
  12.         String[] encodedValues = new String[count];
  13.         for (int i = 0; i < count; i++) {
  14.             encodedValues[i] = stripXSS(values[i]);
  15.         }
  16.         return encodedValues;
  17.     }
  18.     @Override
  19.     public String getParameter(String parameter) {
  20.         String value = super.getParameter(parameter);
  21.         return stripXSS(value);
  22.     }
  23.     @Override
  24.     public Map<String, String[]> getParameterMap() {
  25.         Map<String, String[]> map = new HashMap<>(super.getParameterMap());
  26.         Iterator<Entry<String, String[]>> it = map.entrySet().iterator();
  27.         while (it.hasNext()) {
  28.             Entry<String, String[]> entry = it.next();
  29.             String[] values = entry.getValue();
  30.             for (int i = 0; i < values.length; i++) {
  31.                 values[i] = stripXSS(values[i]);
  32.             }
  33.         }
  34.         return map;
  35.     }
  36.     private String stripXSS(String value) {
  37.         if (value != null) {
  38.             value = value.replaceAll("<script>(.*?)</script>", "");
  39.             value = value.replaceAll("</script>", "");
  40.             value = value.replaceAll("<script(.*?)>", "");
  41.             value = value.replaceAll("eval\\((.*?)\\)", "");
  42.             value = value.replaceAll("expression\\((.*?)\\)", "");
  43.             value = value.replaceAll("javascript:", "");
  44.             value = value.replaceAll("vbscript:", "");
  45.             value = value.replaceAll("onload(.*?)=", "");
  46.             value = StringEscapeUtils.escapeHtml4(value); // 需要引入Apache Commons Lang库
  47.         }
  48.         return value;
  49.     }
  50. }
复制代码
为了使上述代码生效,你需要配置web.xml文件,添加一个全局过滤器:
  1. <filter>  
  2.     <filter-name>XssSafe</filter-name>  
  3.     <filter-class>XssFilter</filter-class>  
  4. </filter>  
  5. <filter-mapping>  
  6.     <filter-name>XssSafe</filter-name>  
  7.     <url-pattern>/*</url-pattern>  
  8. </filter-mapping>
复制代码



0x04 实际案例分析

为了更好地明白XSS毛病的实际影响,我们将通过一个具体的案例来深入探讨。这个案例基于ofcms-admin项目中的一个SQL注入毛病,但在这里我们会将其扩展为XSS毛病的实例,并展示怎样利用以及修复它。
案例背景

考虑一个典型的Java Web应用步调,其中包罗一个留言板功能。用户可以在前端提交留言,这些留言会被存储到数据库中,并在后续访问时表现给其他用户。然而,由于开发者未能精确处理惩罚用户输入的数据,导致了埋伏的XSS攻击风险。
毛病发现

我们注意到,在StoreServlet.java文件中,存在如下代码:
  1. public void StoreXss(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  2.     String name = req.getParameter("name");
  3.     String mail = req.getParameter("mail");
  4.     String message = req.getParameter("message");
  5.     if(!name.equals(null) && !mail.equals(null) && !message.equals(null)){
  6.         MessageInfoService msginfo = new MessageInfoServiceImpl();
  7.         msginfo.MessageInfoStoreService(name, mail, message);
  8.         resp.getWriter().print("<script>alert("添加成功")</script>");
  9.     }
  10. }
复制代码
这里的问题在于,从哀求参数获取的name、mail和message字段没有颠末任何过滤或转义就直接插入到了数据库中。当这些数据被取出并在页面上表现时,如果包罗了恶意脚本,则会导致XSS攻击。
毛病利用

假设攻击者构造了一个特殊的留言内容,例如:
  1. <script>alert('你已经被XSS');</script>
复制代码
然后将此内容作为message参数提交给服务器。之后,每当有效户检察这条留言时,欣赏器都会执行这段JavaScript代码,弹出告诫框。更糟糕的是,攻击者可以利用这种毛病盗取用户的敏感信息,如Cookies,甚至挟制用户的会话。
修复方案

针对上述问题,我们可以接纳以下几种方法进行修复:
具体来说,对于本案例中的StoreServlet.java,我们需要修改代码以确保所有效户输入的数据都被妥善处理惩罚。以下是改进后的版本:
  1. public void StoreXss(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  2.     String name = stripXSS(req.getParameter("name"));
  3.     String mail = stripXSS(req.getParameter("mail"));
  4.     String message = stripXSS(req.getParameter("message"));
  5.     if (!isEmpty(name) && !isEmpty(mail) && !isEmpty(message)) {
  6.         MessageInfoService msginfo = new MessageInfoServiceImpl();
  7.         msginfo.MessageInfoStoreService(name, mail, message);
  8.         resp.getWriter().print("<script>alert("添加成功")</script>");
  9.     }
  10. }
  11. private boolean isEmpty(String value) {
  12.     return value == null || value.trim().isEmpty();
  13. }
  14. private String stripXSS(String value) {
  15.     if (value != null) {
  16.         // 避免 <script> 标签
  17.         value = value.replaceAll("<script>(.*?)</script>", "");
  18.         // 移除孤立的 </script> 标签
  19.         value = value.replaceAll("</script>", "");
  20.         // 移除孤立的 <script ...> 标签
  21.         value = value.replaceAll("<script(.*?)>", "");
  22.         // 避免 eval(...) 表达式
  23.         value = value.replaceAll("eval\\((.*?)\\)", "");
  24.         // 避免 expression(...) 表达式
  25.         value = value.replaceAll("expression\\((.*?)\\)", "");
  26.         // 避免 javascript:... 表达式
  27.         value = value.replaceAll("javascript:", "");
  28.         // 避免 vbscript:... 表达式
  29.         value = value.replaceAll("vbscript:", "");
  30.         // 避免 onload= 表达式
  31.         value = value.replaceAll("onload(.*?)=", "");
  32.         // HTML实体编码
  33.         value = StringEscapeUtils.escapeHtml4(value); // 需要引入Apache Commons Lang库
  34.     }
  35.     return value;
  36. }
复制代码
此外,还应该确保在表现用户提交的内容时也进行了适当的编码。例如,在JSP页面中,可以使用EL表达式的默认转义特性,或手动调用StringEscapeUtils.escapeHtml4()方法对输出进行编码。
0x05 总结

本文详细介绍了Java中的XSS毛病原理、实际案例分析及修复方案。希望这能帮助初学者更好地明白和应对这类常见的Web安全问题。通过实施合理的防御步调,我们可以大大低落XSS攻击的风险,保护用户的数据安全。





0x06 其他安全毛病与防御步调

除了XSS攻击之外,Java Web应用步调还大概面临其他范例的安全威胁。为了确保系统的整体安全性,开发者应当熟悉多种常见的Web安全问题及其对应的防护计谋。以下是几种重要的安全毛病以及怎样防范它们的方法:
SQL注入(SQL Injection)

毛病描述:
SQL注入是一种通过构造特殊的输入来操控数据库查询语句的攻击方式。当用户提供的数据未经适当验证就被直接拼接到SQL命令中时,攻击者可以插入恶意的SQL代码,从而执行未经授权的操作,如读取敏感信息、修改或删除数据。
防御步调:
CSRF(跨站哀求伪造)

毛病描述:
CSRF攻击是指攻击者诱使合法用户在其已认证的Web应用中执行非预期的动作。例如,攻击者可以通过一个精心设计的链接或表单提交,在用户不知情的环境下更改密码或发送消息。
防御步调:
文件上传毛病

毛病描述:
如果允许用户上传文件到服务器,而且没有严酷控制上传的内容范例和文件路径,攻击者大概会上传恶意脚本文件,进而执行远程代码或泄漏敏感信息。
防御步调:
序列化毛病

毛病描述:
Java对象序列化是将对象转换成字节流的过程,而反序列化则是相反的过程。如果应用步调担当并处理惩罚了不可信的序列化数据,那么就有大概引入恶意代码,造成远程代码执行等严重效果。
防御步调:

0x07 安全开发最佳实践

为了构建更加安全的Java Web应用步调,除了针对具体毛病接纳相应的防护步调外,还需要遵循一系列的最佳实践:






0x08 安全测试与自动化工具

在开发过程中,确保Java Web应用步调的安全不仅依赖于良好的编码实践,还需要借助一系列的安全测试和自动化工具来识别埋伏的风险点。这些工具可以帮助开发者更早地发现毛病,而且在摆设之前修复它们。以下是几种常用的安全测试方法及其对应的工具:
静态应用安全测试(SAST)

概述:
静态分析工具通过扫描未编译的源代码,查找大概存在的安全隐患,如SQL注入、XSS、不安全的加密算法等。这类工具可以在开发周期的早期阶段发现问题,从而淘汰后期修复的成本。
推荐工具:

动态应用安全测试(DAST)

概述:
动态分析是在运行时对Web应用步调进行黑盒测试,模仿真实的攻击行为,以检测是否存在可利用的毛病。这种方法不需要访问源代码,因此非常得当评估已上线的应用步调。
推荐工具:

模糊测试(Fuzzing)

概述:
模糊测试是一种通过向目的系统发送随机或变异的数据输入,试图触发异常状态的技术。它特殊得当于发现那些难以预料的界限条件错误,如缓冲区溢出、格式化字符串毛病等。
推荐工具:

排泄测试

概述:
排泄测试是指模仿黑客攻击的方式对信息系统进行全面检查的过程。它通常由专业的安全顾问执行,旨在验证现有防御步调的有效性,并提出改进建议。
推荐服务:


0x09 连续集成/连续交付(CI/CD)中的安全整合

随着DevOps文化的遍及,越来越多的企业开始接纳CI/CD流水线来加速软件交付流程。然而,在寻求速度的同时,我们也不能忽视安全性的重要性。将安全测试融入到CI/CD管道中,可以实现自动化、标准化的安全保障,确保每一个版本都是安全可靠的。
在CI/CD中加入安全步骤

工具选择

为了有效实施上述安全步骤,可以选择以下几款流行的CI/CD安全插件或服务:


0xA 应急响应筹划

只管接纳了各种预防步调,但仍旧无法完全杜绝安全事件的发生。因此,订定美满的应急响应筹划是每个组织不可或缺的一部门。一个好的应急响应流程应当包罗以下几个方面:

0xB 结语

本文详细介绍了Java Web应用步调中常见的安全毛病范例及其防护步调,并探讨了怎样利用自动化工具和CI/CD管道提升整体安全性。此外,还夸大了应急响应筹划的重要性,以应对不可避免的安全挑战。希望这些内容能为你提供更多关于Java代码审计的知识,并帮助你在实际工作中做出更加明智的选择。




相关工具




当然可以!针对Java Web应用步调的安全开发、测试和维护,以下是几个关键领域的推荐工具:
1. 静态应用安全测试(SAST)

这些工具可以在不运行代码的环境下分析源代码,帮助识别埋伏的安全毛病。

2. 动态应用安全测试(DAST)

这类工具模仿攻击行为,在应用步调运行时进行黑盒测试,以检测是否存在可利用的毛病。

3. 模糊测试(Fuzzing)

模糊测试是一种通过发送随机或变异的数据输入来触发异常状态的技术,对于发现界限条件错误非常有效。

4. 排泄测试

排泄测试是指模仿黑客攻击的方式对信息系统进行全面检查的过程,确保现有防御步调的有效性。

5. 连续集成/连续交付(CI/CD)中的安全整合

将安全测试融入到CI/CD管道中,实现自动化、标准化的安全保障,确保每一个版本都是安全可靠的。

6. 依赖管理和毛病管理

确保所使用的第三方库是最新的,而且没有已知的安全毛病。

7. 安全配置检察

检察基础办法即代码(IaC)模板,包管云资源和服务配置符合安全基线要求。




















通过以上步调,你可以有效地减轻XSS攻击的风险,保护用户的数据安全。希望这篇文章对你有所帮助!





原文链接:点击这里检察原文
注:本文为原创内容,转载需注明出处。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4