Java代码审计——WebGoat XSS

news2025/7/31 15:46:44

目录

(一)XSS 常见触发位置

1.JSP 表达式

2.EL

 (二)反射型 XSS

(三) 存储型 XSS

(四)XSS 漏洞修复

配置过滤器:


(一)XSS 常见触发位置


XSS 漏洞产生后必然会有相关的输入 / 输出,因此我们只需快速找到这些输入 / 输出点,即可快速地进行跟踪发现漏洞。输入在 Java 中通常使用“ request.getParameter(param)”或“${param}”获取用户的输入信息。输出主要表现为 前端的渲染,我们可以通过定位前端中一些常见的标识来找到它们,然后根据后端逻辑来判断漏洞是否存在。

1JSP 表达式

<%= 变量 %> ”是“ <% out.println( 变量 ); %> ”的简写方式,“ <%=%> ”用于将已声
明的变量或表达式输出到外网页中。
下面两种形式的写法实现的效果是相同的,都是将变量输出到网页中。
  • 形式一:
<%=msg%>
<% out.println(msg); %>

  • 形式二:
<% String msg = request.getParameter('msg');%>
<%=msg%>

通过“request.getParameter”获取 msg 传入的值,然后通过“<%=msg%>”将其输出到网页中

2EL

        EL( Expression Language ,表达式语言)是为了使 JSP 写起来更加简单。 EL 的灵感来自于 ECMAScript XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,使得 JSP的 代 码 更 加 简 化 。 例 如 :“ <%=request.getParameter("username")%> ”等价于
${param.username} ”。 JSP 标准标签库( JSTL )是一个 JSP 标签集合,它封装了 JSP
用的通用核心功能。

 (二)反射型 XSS


我们先updatecert一下,发现红框中的数据直接输出了所以我们直接进行xss即可

 直接拼接payload

接下来我们来看一下源码

查看后端代码可以发现,后端没有进行任何过滤直接进行了拼接输出

(三) 存储型 XSS


 存储型 XSS 与反射型 XSS 核心原理一致,都是将 JavaScript 通过程序输出到 HTML页面中并交由浏览器引擎解析。相比于反射型 XSS,存储型 XSS 危害更大。反射型 XSS 需构造恶意 URL 来诱导受害者点击,而存储型 XSS 由于有效载荷直接被写入了服务器中,且不需要将有效载荷输入到 URL 中,往往可以伪装成正常页面,迷惑性更强。因此存储型 XSS 漏洞对于普通用户而言很难及时被发现。

        若过滤不严,存储型 XSS 极易造成网络蠕虫,导致大量 Cookie 被窃取。当然存储型
XSS 也可用作权限维持来窃取网站后台的登录信息,存储型 XSS 攻击流程如图 2-53 所示。

首先通过其正常的页面功能发现存在路由/show 会打印出用户的留言,根据 web.xml 可以找到其对应的类,如下图 

根据 xml 中的调用可以跟踪到调用类,在类中可以发现,程序首先对“ MessageInfo ServiceImpl”类进行了实例化操作,随后通过 setAttribute 方法对 msg 的值进行存储,并通过“getRequestDispatcher ”将其重定向至“ message.jsp ”文件进行输出,如下图 所示。

  • 追踪 msg 的值,其来源于“msginfo.MessageInfoShowService()”,跟进该方法可以发现程序最终调用了 MessageInfoShowDao 方法,如图

  • 跟进 MessageInfoShowDao 方法,可发现其对数据库进行了连接操作,并从 message数据表中查询出全部数据,赋值给对应的 namemailmessage 并返回给 servlet 层,如下图所示

  •  回到 message.jsp,可以看到 message.jsp 文件从 list 中取出之前存入的 name mail messgae,并渲染 HTML 输出至浏览器,如下图所示:

 到此漏洞的整个执行流程我们已分析完成,接下来便是找到对应的入口进行触发,而触发该漏洞一个最大的问题是:数据来源于数据库,我们需要对其进行控制。也就是说,想要触发该 XSS 漏洞,首先得将包含 XSS 有效载荷的数据插入数据库中。通过搜索对应的关键字可以在 MessageInfoStoreDao 中找到数据对应的入库操作,如下图所示:

  那么接下来的问题便回到了 MessageInfoStoreDao 在哪里被调用,通过调用栈可以发现 MessageInfoStoreService 方法中调用了 MessageInfoStoreDao,如下图所示:

  

通过调用栈继续跟进 MessageInfoStoreService,可以发现在 StoreXSS 中对其进行了调用,并且 MessageInfoStoreService 中的三个参数全部直接来源于 GET 方法,如下图所示

 因为程序没有对输入进行任何校验,所以只需找到添加数据的路由后插入对应的有效载荷

(四)XSS 漏洞修复


        前面已经讲过导致 XSS 漏洞的主要原因是输入可控并且没有经过过滤便直接输出,因此防御 XSS 漏洞一般有以下几种方法。
  1. 编写全局过滤器实现拦截,并在 web.xml 进行配置。下面将给出一个网上使用较多的拦截器样例。

配置过滤器:

public class XSSFilter implements Filter { 
 @Override
public void init(FilterConfig filterConfig) throws ServletException { 
                 } 
 @Override 
 public void destroy() { 
                 } 
 @Override 
 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws 
IOException, ServletException { 
 chain.doFilter(new XSSRequestWrapper((HttpServletRequest) request), response); 
 } 
}
实现包装类:
import java.util.regex.Pattern; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletRequestWrapper; 
public class XSSRequestWrapper extends HttpServletRequestWrapper { 
     public XSSRequestWrapper(HttpServletRequest servletRequest) { 
         super(servletRequest); 
 } 
 @Override 
      public String[] getParameterValues(String parameter) { 
         String[] values = super.getParameterValues(parameter); 
             if (values == null) { 
                     return null; 
     } 
         int count = values.length; 
         String[] encodedValues = new String[count]; 
             for (int i = 0; i < count; i++) { 
                     encodedValues[i] = stripXSS(values[i]); 
         } 
                 return encodedValues; 
} 
@Override 
        public String getParameter(String parameter) { 
             String value = super.getParameter(parameter); 
        return stripXSS(value); 
     } 
@Override 
 public String getHeader(String name) { 
         String value = super.getHeader(name); 
                 return stripXSS(value); 
 } 
 private String stripXSS(String value) { 
         if (value != null) { 
     // NOTE: It's highly recommended to use the ESAPI library and uncomment the following
line to 
 // avoid encoded attacks. 
 // value = ESAPI.encoder().canonicalize(value); 
 // Avoid null characters 
 value = value.replaceAll("", ""); 
 // Avoid anything between script tags 
 Pattern scriptPattern = Pattern.compile("(.*?)", Pattern.CASE_INSENSITIVE); 
 value = scriptPattern.matcher(value).replaceAll(""); 
 // Avoid anything in a src="http://www.yihaomen.com/article/java/..." type of e-xpression 
     scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'",                     Pattern.CASE_INSENSITIVE | 
Pattern.MULTILINE | Pattern.DOTALL); 
 value = scriptPattern.matcher(value).replaceAll(""); 
 scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"", Pattern.CASE_INSENSITIVE | 
Pattern.MULTILINE | Pattern.DOTALL); 
         value = scriptPattern.matcher(value).replaceAll(""); 
 // Remove any lonesome tag 
         scriptPattern = Pattern.compile("", Pattern.CASE_INSENSITIVE); 
 value = scriptPattern.matcher(value).replaceAll(""); 
 // Remove any lonesome tag 
         scriptPattern = Pattern.compile("", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | 
Pattern.DOTALL); 
 value = scriptPattern.matcher(value).replaceAll(""); 
 // Avoid eval(...) e-xpressions 
         scriptPattern = Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | 
Pattern.MULTILINE | Pattern.DOTALL); 
         value = scriptPattern.matcher(value).replaceAll(""); 
 // Avoid e-xpression(...) e-xpressions 
 scriptPattern = Pattern.compile("e-xpression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | 
         Pattern.MULTILINE | Pattern.DOTALL); 
         value = scriptPattern.matcher(value).replaceAll(""); 
 // Avoid javascript:... e-xpressions 
         scriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE); 
                 value = scriptPattern.matcher(value).replaceAll(""); 
 // Avoid vbscript:... e-xpressions 
         scriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE); 
         value = scriptPattern.matcher(value).replaceAll(""); 
 // Avoid onload= e-xpressions 
     scriptPattern = Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | 
Pattern.MULTILINE | Pattern.DOTALL); 
         value = scriptPattern.matcher(value).replaceAll(""); 
 } 
 return value; 
 } 
}



2、采用开源安全控制库( OWASP )企业安全应用程序接口( ESAPI)实现,类似的还有谷歌的 xssProtect
// HTML Context 
String html = ESAPI.encoder().encodeForHTML("<script>alert('xss')</script>"); 
// HTML Attribute Context 
String htmlAttr = ESAPI.encoder().encodeForHTMLAttribute("<script>alert('xss')</script>"); 
// Javascript Attribute Context 
String jsAttr = ESAPI.encoder().encodeForJavaScript("<script>alert('xss')</script>");
3、对所有字符采用 HTML 实体编码
<% 
 String Str = "<script>alert('XSS')</script>"; 
 Str = Str.replaceAll("\"","&quot;"); 
 Str = Str.replaceAll("&","&amp;"); 
 Str = Str.replaceAll("\\(","&#40;"); 
 Str = Str.replaceAll("<","&lt;"); 
 Str = Str.replaceAll(">","&gt;"); 
 Str = Str.replaceAll("\'","&#39;"); 
 Str = Str.replaceAll("\\)","&#41;"); 
 out.println(Str); 
%>

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

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

相关文章

HTML期末作业课程设计期末大作业__电影长津湖介绍带视频(6页)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 摄影作品 | 影视设计网页 | 在线电影 | 视频音频元素 | HTML期末大学生网页设计作业&#xff0c;Web大学生网页 HTML&#xff1a;结构 CSS&#xff1…

uiautomator2的安装,使用,在浏览器中查看页面的信息,简单快捷的ui测试工具,app测试工具(一)

uiautomator2的安装&#xff0c;使用&#xff0c;简单快捷的ui测试工具&#xff0c;app测试工具 安装方法 命令行中输入 pip install uiautomator pip install weditor在andriod studio中启动一个模拟器 启动 python -m weditor即可在浏览器看到弹出的窗口&#xff0c;里面…

【滤波跟踪】基于不变扩展卡尔曼滤波器对装有惯性导航系统和全球定位系统IMU+GPS进行滤波跟踪附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

核苷酸类化合物库 脂类化合物库参与细胞调控

核苷及核苷酸是机体内的一种重要的内源物质&#xff0c;参与细胞的多种生命进程&#xff0c;如 DNA 和 RNA 合成&#xff0c;信号转导及代谢等。核苷及核苷酸类似物是人工合成的&#xff0c;经过一定化学修饰的物质&#xff0c;可以模拟机体内核苷及核苷酸&#xff0c;参与细胞…

Git合并出现MERGING有效解决方法

Git合并出现MERGING有效解决方法错误描述解决办法参考链接错误描述 我在操作git合并时候意外出现了MERGING&#xff0c;很懵逼&#xff0c;如图所示&#xff1a; 遇到这个问题也是很头疼了&#xff0c;百度了很多方法有说是&#xff1a;“在命令行输入&#xff1a;git reset …

“以赛助教”进校园,CCF大数据与计算智能大赛成高校人才探索实践AI技术的第二课堂!

随着第十届CCF大数据与计算智能大赛&#xff08;简称2022 CCF BDCI&#xff09;的报名通道关闭、《大咖说系列专题报告》收官&#xff0c;“以赛助教”系列活动也正式宣告结束。 CCF大数据与计算智能大赛&#xff08;CCF BDCI&#xff09;由中国计算机学会于2013年创办&#x…

verilog 流水线控制

文章目录Verilog 流水线控制1、关键问题、实现方式及其对比2、实现方式2.1、控流水线输入&#xff1a;根据每一拍的 din_en_d* 打拍&#xff0c;没有最终的 else block2.2、控流水线输入&#xff1a;根据每一拍的 din_en_d* 打拍&#xff0c;有最终的 else block2.3、控流水线每…

真香!宝藏学习方式还可以这样,家人们绝不能错过

文 / 谷雨&#xff08;微信公众号&#xff1a;王不留&#xff09; 《谷雨&#xff1a;告诉大家一个小秘密》一文&#xff0c;辛苦码字半夜&#xff0c;阅读量却扑街&#xff0c;我想根本原因是标题名字起得太差。 前几天看了一个不知真假的截屏&#xff0c;说到小红书上的关键词…

Linux挂载Windows端NFS服务(实现板端Linux与PC互传文件)

Linux挂载Windows端NFS服务&#xff08;实现板端Linux与PC互传文件&#xff09; 1. kernel编译时打开NFS客户端服务 在宿主机打开kernel文件夹&#xff0c;先make clean&#xff0c;然后make menuconfig&#xff0c;进入配置界面&#xff1a; 使用/查找NFS&#xff0c;找到Ne…

终于有阿里P8从开发、运维两个角度总结出了Redis实战手册

从开发、运维两个角度总结了Redis实战经验&#xff0c;深入浅出地剖析底层实现&#xff0c;包含大规模集群开发与运维的实际案例、应用技巧。 前言Redis作为基于键值对的NoSQL数据库&#xff0c;具有高性能、丰富的数据结构、持久化、高可用、分布式等特性&#xff0c;同时Redi…

Windows10安装Docker(基于WSL2,包含WSL2安装教程)

WSL2 wsl是windows自带的功能&#xff0c;只需要开启Windows功能即可安装子系统 可以通过以下命令获取发行版名字 wsl --list --online通过以下命令安装 wsl --install -d ${发行版名字} 如 wsl --install -d Ubuntu-20.04安装后会弹出来子系统设置用户名密码 运行以下命令…

matlab解下列微分方程

解下列微分方程 &#xff08;1&#xff09;ydsolve(‘Dyxy’,‘y(0)1’,‘x’) y -x-12exp(x) x[1 2 3] x 1 2 3 -x-12exp(x) ans 3.4366 11.7781 36.1711 &#xff08;2&#xff09;x’2x3y,y’2xy,x(0)-2,y(0)2.8,0<t<10,做相平面图 新建M函数 function dyweifen1(…

d盘不见了怎么恢复?数据恢复,一键操作

d盘是我们日常生活中常用的一种硬盘&#xff0c;平时我们会用到 d盘来存储我们平时要用到的文件资料&#xff0c;如文档、图片、视频等。而由于我们日常使用它时都是在 Windows系统下&#xff0c;所以就很容易忽略 d盘的重要性了。当遇到 d盘不见的情况&#xff0c; d盘不见了怎…

php宝塔部署实战ptcms小说管理系统源码带采集规则

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 有个朋友发消息跟我说&#xff0c;他下载了一套ptcms的小说系统&#xff0c;在搭建的时候一直部署不好&#xff0c;这套系统还带有采集功能的&#xff0c;让我帮他看看&#xff0c;我抽空看了并测试了一下&#x…

【菜菜的sklearn课堂笔记】逻辑回归与评分卡-梯度下降求解逻辑回归

视频作者&#xff1a;菜菜TsaiTsai 链接&#xff1a;【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili 我们以最著名也最常用的梯度下降法为例。 现在有一个带两个特征并且没有截距的逻辑回归y(x1,x2)y(x_{1},x_{2})y(x1​,x2​)&#xff0c;两个特征…

【java】 对命名规范的思考——VO,BO,PO,DO,DTO是什么

作为Java开发人员免要接触VO&#xff0c;BO&#xff0c;PO&#xff0c;DO&#xff0c;DTO&#xff0c;但很多朋友对这些概念一直以来都是云里雾里&#xff0c;本来是规范性的东西&#xff0c;使用起来却反而导致更加混乱了。先附上我自己常用的命名习惯&#xff1a; 数据对象&…

IVIF:multi-scale densenet

UNFusion: A unified multi-scale densely connected network for infrared and visible image fusion &#xff08;UNFusion: 用于红外和可见光图像融合的统一多尺度密集连接网络&#xff09; 大多数基于深度学习的方法主要侧重于卷积操作来提取局部特征&#xff0c;但没有充…

推荐系统最通俗介绍

文章目录1.推荐系统概念2.推荐系统发展历史3.个性化推荐系统框架4.部分案例4.1 搜狐视频个性化推荐架构4.2 今日头条推荐系统架构4.3 Netflix推荐系统架构图5. 视频推荐系统流程设计总结资料整理&#xff0c;来源于北大刘宏志教授讲座内容。 在介绍推荐系统前&#xff0c;我们先…

【目标检测】池化层(pooling)的反向传播是怎么实现的

目录&#xff1a;池化层的反向传播是怎么实现的一、前言二、平均池化二、最大池化四、最大池化的数学原理一、前言 卷积神经网络中一个不可导的环节就是Pooling池化操作&#xff0c;因为Pooling池化操作使得feature map的尺寸发生变化&#xff0c;假如做222\times 222的池化&a…

一.node的事件处理;二.node的全局对象;三.node的readline模块;四.node的Web编程

目录 一.node的事件处理 1.node采用的事件驱动模式来进行事件处理的&#xff1a;只有当事件被触发时才执行相关程序 2.node是单线程运行的&#xff1a;采用事件轮询方式&#xff0c;不断的查询事件队列中的消息&#xff0c;然后根据消息执行对应的回调函数 3.node事件机制中…