Java Struts2系列的XSS漏洞(S2-002)

打印 上一主题 下一主题

主题 529|帖子 529|积分 1587

0x01 前言

复现一下 S2-002 的洞
0x02 S2-002

漏洞简介

Struts2-002 是一个 XSS 漏洞,该漏洞发生在 s:url 和 s:a 标签中,当标签的属性 includeParams=all 时,即可触发该漏洞。
漏洞影响版本

Struts 2.0.0 - Struts 2.1.8.1
0x03 环境搭建

如果不想手动搭建的话,环境我已经配好了 https://github.com/Drun1baby/JavaSecurityLearning/tree/main/JavaSecurity/Struts2/S2-002AndS2-006
因为 s2-002 的洞是一个 XSS,与处理的 Action 没有任何关系,所以这里我们只需要配置 .jsp 文件,以及 .xml 文件
resources 文件夹下
 
struts.xml
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.  
  3. <!DOCTYPE struts PUBLIC  
  4.        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  5.        "http://struts.apache.org/dtds/struts-2.0.dtd">  
  6.  
  7. <struts>  
  8.    <package name="S2-002" extends="struts-default">  
  9.        <action name="login"  method="execute">  
  10.            <result name="success">welcome.jsp</result>  
  11.            <result name="error">index.jsp</result>  
  12.        </action>  
  13.    </package>  
  14. </struts>
复制代码
 
webapp 文件夹下
index.jsp
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.         pageEncoding="UTF-8"%>  
  3. <%@ taglib prefix="s" uri="/struts-tags" %>  
  4.  
  5. <html>  
  6. <head>  
  7.    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  8.    <title>S2-002</title>  
  9. </head>  
  10. <body>  
  11. <h2>S2-002 Demo</h2>  
  12. <s:url action="login" includeParams="all"></s:url>  
  13. <s:a href="%{url}">click</s:a>  
  14. </body>  
  15. </html>
复制代码
welcome.jsp
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.         pageEncoding="UTF-8"%>  
  3. <%@ taglib prefix="s" uri="/struts-tags" %>  
  4.  
  5. <html>  
  6. <head>  
  7.  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  8.  <title>S2-002</title>  
  9. </head>  
  10. <body>  
  11. <p>Hello <s:property value="username"></s:property></p>  
  12. </body>  
  13. </html>
复制代码
接着在 WEB-INF 下,web.xml
  1. <!DOCTYPE web-app PUBLIC  
  2. "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"  
  3. "http://java.sun.com/dtd/web-app_2_3.dtd" >  
  4.  
  5. <web-app>  
  6.  <display-name>S2-002 Example</display-name>  
  7.  <filter>  
  8.    <filter-name>struts2</filter-name>  
  9.    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>  
  10.  </filter>  
  11.  <filter-mapping>  
  12.    <filter-name>struts2</filter-name>  
  13.    <url-pattern>/*</url-pattern>  
  14.  </filter-mapping>  
  15.  <welcome-file-list>  
  16.    <welcome-file>index.jsp</welcome-file>  
  17.  </welcome-file-list>  
  18. </web-app>
复制代码
项目结构如图,至此环境搭建完毕
[img=400,498.7128]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202303031505205.png[/img]
0x04 漏洞复现与分析
  1. http://localhost:8080/?%22%3E%3Cscript%3Ealert(1)%3C/script%3E%3C%22
复制代码
[img=720,552.4042879019908]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202303031505207.png[/img]
漏洞分析

之前自己也没有分析过 XSS 相关的漏洞,在最后我会做一个小结来思考一下如何自己挖掘出这个漏洞
我们先下一个断点在 org.apache.struts2.views.jsp.ComponentTagSupport#doStartTag() 方法处,开始调试
[img=720,276.0669815371404]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202303031505208.png[/img]
当在 JSP 文件中遇到 Struts2 标签  结束标签的时候调用 doEndTag() 方法。
【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注 “博客园” 获取!】
 ① 网安学习成长路径思维导图
 ② 60+网安经典常用工具包
 ③ 100+SRC漏洞分析报告
 ④ 150+网安攻防实战技术电子书
 ⑤ 最权威CISSP 认证考试指南+题库
 ⑥ 超1800页CTF实战技巧手册
 ⑦ 最新网安大厂面试题合集(含答案)
 ⑧ APP客户端安全检测指南(安卓+IOS)
进入到了 index.jsp
[img=720,373.9764705882353]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202303031505209.png[/img]
跟进 this.component.start()
[img=720,344.4906234161176]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202303031505210.png[/img]
在 index.jsp 中 includeParams=all,往下看代码知道 88 行,跟进 mergeRequestParameters() 方法
在 includeParams=all 的情况下会调用 mergeRequestParameters() 将 Tomcat 处取来的参数,这里取到了我们输入的 payload,并且保存在 this.parameters 中
[img=720,305.5774647887324]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202303031505211.png[/img]
mergeRequestParameters() 方法运行完毕,往下是 includeGetParameters() 方法,也跟进去看一下;发现也是调用了 mergeRequestParameters(),同样是保存在了 this.parameters 中,不过这一次保存的是经过 url 编码的数据
[img=720,286.36720453554295]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202303031505212.png[/img]
继续往下,程序还调用了 includeExtraParameters() 方法,跟进;这里的意思是如果有额外的参数,会被保存进这里,然后再保存到 this.paramters
[img=720,299.7564276048715]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202303031505213.png[/img]
其实到这里漏洞出发点就来了,第一次调用 mergeRequestParameters() 方法的时候那一段参数是未经过 URL 编码的,从而产生了 XSS
在执行完毕 doStartTag() 方法之后,会去到 doEndTag() 方法,我们跟进 this.component.end(),this.component 是 URL 类,所以也就是调用了 URL.end()
[img=720,318.54330708661416]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202303031505214.png[/img]
往下走,第 146 行,判断目前调度器(Dispatcher)的实例是否支持这一 Struts2 组件的行为,并且判断这一个请求是否需要 Struts2 组件调用某 Action 来处理;如果不需要调用 Action 处理,则直接进入 buildUrl() 的代码逻辑,如果需要 Action 来处理,会先去选择/调用 Action,再进行后续操作。
其实也就是 Struts2 运行的基本逻辑
[img=720,301.67966957319874]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202303031505215.png[/img]
此处因为我们定义了 action=login,所以进入到了 else 的代码逻辑,跟进 this.determineActionURL() 方法
[img=720,290.25]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202303031505216.png[/img]
determineActionURL() 方法先定位到了对应的 action,再进行 buildUrl() 的操作,跟进 buildUrl()
[img=720,311.35135135135135]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202303031505217.png[/img]
再跟进
[img=720,338.42055185537583]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202303031505218.png[/img]
此时的 params 即将会被拿去拼接,造成触发 XSS 漏洞
[img=720,358.2067247820672]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202303031505219.png[/img]
具体拼接是在 115 行的 buildParametersString() 方法,跟进再跟进
[img=720,285.4736842105263]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202303031505220.png[/img]
至此,漏洞分析结束
漏洞修复

修改 pom.xml,将 Struts2 版本提升至 2.0.11(这是根据公告的,其实并没有真正解决漏洞)
经过对 2.0.11.1 的代码阅读,在 UrlHelper 类 buildUrl() 方法里,第 136 行增加了如下修复代码:
  1. // link是最终的生成的url
  2.        for(result = link.toString();
  3.        result.indexOf("<script>") > 0;
  4.        result = result.replaceAll("<script>", "script")) {
  5.        }
复制代码
太鸡肋,基本算不上修复。。。
0x05 小结

因为是 XSS 漏洞,成因基本都是未进行 URL 编码或某种转码,所以我们可以去看处理参数的过程进行漏洞挖掘。
S2-002 还是比较简单的一个漏洞。
更多靶场实验练习、网安学习资料,请点击这里>>
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

没腿的鸟

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表