Struts2漏洞学习

学习步骤:
0.idea学习
1.struts2框架的学习 (B站视频学习,action、struts.xml
2.ognl表达式学习(AST、(one)(two)执行情况需要在确认下?)
3.漏洞的原理代码学习(java每个http请求都是一个线程)

%{ }表达式的根是执行的时候设置的
默认root是valuestack值栈,context是上下文环境变量。root内的元素可以不用#,context的需要#,如request、session等(每次的请求context与valuestack是一个存储池,可能随着代码的执行而改变,所以先执行的可以改变环境变量导致后执行的绕过限制,具体怎么取值,需要看执行的时候哪个是root,哪个是context):
表达式可以设置没有的值如_abc供后续调用(增),也可以将内部的值进行修改(改),改之后执行payload就是在改了环境变量的环境中执行代码了(覆盖很重要,后面执行的会把前面的给覆盖掉

1.#设置值的代码 memberaccess
2.低版本覆盖(在key裏面)
3.高版本改方法参数(利用getInstance()获取环境对象,利用方法来修改参数)思路是对,调试成功
能覆盖是因为设置memberaccess参数在RESERVED_KEYS里面(key在在RESERVED_KEYS会执行方法,不在里面的只会赋值)通过方法设置(覆盖)了变量值,高版本没在RESERVED_KEYS里面,所以设置了map的普通值,在调用setaccess的时候,调用的是对象的变量,不是对象的Map值,所以设置普通值并没有用。


这个眼镜应该是不在本函数里,但是已经定义好了的变量:
用#com. xxx. xxx. 不能直接获得对象,经过查看源代码得知,有. 点会分开处理,所以可以用#request【xxxx】来代替(研究成功,很有成就感)

私有属性值只能通过自己的方法设置,无法直接赋值

view as 很重要,需要改成与类型一致,才能更好的看清楚变量的属性,(方法要到类中去看ctrl+f-2)
contextmap值都在_values里面,context本身有属性变量,用ognl表达式取得值是在_values几年的(有保留key会调用相关的方法)所以改_values的值不会影响context本身的属性,有保留字调用方法可以改本身的属性,直接改也可以改属性,调用方法(没有另外限制的话)

OGNL表达式
expression、root、context
,逗号用来分隔不同的表达式,执行顺序正常从前往后执行
参数名=参数值

0.S2漏洞的原理
1.S2-057搭建(有namespace才能触发)---搭建、复现、调试成功
2.新漏洞061调试
3.新漏洞061调试
4.找新的CVE

().()为什么能执行,是因为转换成 ASTList了
调试程序 真好玩 debug

maven是个寻找jar包补丁差异的神器

struts2执行流程:
1.请求到StrutsPrepareAndExecuteFilter(web.xml设置的)
2.ActionMapping(准备actionmapping)
2.serviceAction(设置valuestack和context、ActionProxy)
3.ActionInvocation(invocation.invoke()、interceptor.intercept(DefaultActionInvocation.this)  intercepter拦截器调用(类似递归):invokeActionOnly()-action调用:执行完拦截器之前未执行的代码) 
posted @ 2021-03-31 21:18  1uan  阅读(124)  评论(0)    收藏  举报