最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

环球今亮点!Java Struts2系列的XSS漏洞(S2-002)

来源:博客园

0x01 前言

复现一下 S2-002 的洞

0x02 S2-002

漏洞简介

Struts2-002是一个XSS漏洞,该漏洞发生在s:urls: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

                   welcome.jsp       index.jsp         

webapp 文件夹下

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"      pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %>         S2-002   

S2-002 Demo

click

welcome.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"      pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %>       S2-002   

Hello

接着在 WEB-INF 下,web.xml

    S2-002 Example     struts2   org.apache.struts2.dispatcher.FilterDispatcher       struts2   /*       index.jsp   

项目结构如图,至此环境搭建完毕

0x04 漏洞复现与分析

http://localhost:8080/?%22%3E%3Cscript%3Ealert(1)%3C/script%3E%3C%22

漏洞分析

之前自己也没有分析过 XSS 相关的漏洞,在最后我会做一个小结来思考一下如何自己挖掘出这个漏洞

我们先下一个断点在org.apache.struts2.views.jsp.ComponentTagSupport#doStartTag()方法处,开始调试

当在 JSP 文件中遇到Struts2标签时,程序会先调用doStartTag()方法 ,并将标签中的属性设置到对应标签对象相应属性中。最后,在遇到/>结束标签的时候调用doEndTag()方法。

【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注 “博客园” 获取!】

① 网安学习成长路径思维导图 ② 60+网安经典常用工具包 ③ 100+SRC漏洞分析报告 ④ 150+网安攻防实战技术电子书 ⑤ 最权威CISSP 认证考试指南+题库 ⑥ 超1800页CTF实战技巧手册 ⑦ 最新网安大厂面试题合集(含答案) ⑧ APP客户端安全检测指南(安卓+IOS)

进入到了index.jsp

跟进this.component.start()

index.jspincludeParams=all,往下看代码知道 88 行,跟进mergeRequestParameters()方法

includeParams=all的情况下会调用mergeRequestParameters()将 Tomcat 处取来的参数,这里取到了我们输入的 payload,并且保存在this.parameters

mergeRequestParameters()方法运行完毕,往下是includeGetParameters()方法,也跟进去看一下;发现也是调用了mergeRequestParameters(),同样是保存在了this.parameters中,不过这一次保存的是经过 url 编码的数据

继续往下,程序还调用了includeExtraParameters()方法,跟进;这里的意思是如果有额外的参数,会被保存进这里,然后再保存到this.paramters

其实到这里漏洞出发点就来了,第一次调用mergeRequestParameters()方法的时候那一段参数是未经过 URL 编码的,从而产生了 XSS

在执行完毕doStartTag()方法之后,会去到doEndTag()方法,我们跟进this.component.end()this.component是 URL 类,所以也就是调用了URL.end()

往下走,第 146 行,判断目前调度器(Dispatcher)的实例是否支持这一 Struts2 组件的行为,并且判断这一个请求是否需要 Struts2 组件调用某 Action 来处理;如果不需要调用 Action 处理,则直接进入buildUrl()的代码逻辑,如果需要 Action 来处理,会先去选择/调用 Action,再进行后续操作。

其实也就是 Struts2 运行的基本逻辑

此处因为我们定义了action=login,所以进入到了 else 的代码逻辑,跟进this.determineActionURL()方法

determineActionURL()方法先定位到了对应的action,再进行buildUrl()的操作,跟进buildUrl()

再跟进

此时的 params 即将会被拿去拼接,造成触发 XSS 漏洞

具体拼接是在 115 行的buildParametersString()方法,跟进再跟进

至此,漏洞分析结束

漏洞修复

修改pom.xml,将 Struts2 版本提升至 2.0.11(这是根据公告的,其实并没有真正解决漏洞)

经过对 2.0.11.1 的代码阅读,在UrlHelperbuildUrl()方法里,第 136 行增加了如下修复代码:

// link是最终的生成的url    for(result = link.toString();     result.indexOf("<script>") > 0;     result = result.replaceAll("<script>", "script")) {     }

太鸡肋,基本算不上修复。。。

0x05 小结

因为是 XSS 漏洞,成因基本都是未进行 URL 编码或某种转码,所以我们可以去看处理参数的过程进行漏洞挖掘。

S2-002 还是比较简单的一个漏洞。

更多靶场实验练习、网安学习资料,请点击这里>>

关键词: 进入到了 学习资料