S2-016调试学习

前段时间发现某目标一系列S2-016的站,于是:

1、漏洞信息

官方说明:

就是通过控制参数前缀redirect:action:redirectAction: 最后远程代码执行。官方的poc

2、搭建环境

ide用的是idea2019.3,用的jar包是vulhub里s2-016的jar包。

在idea选择创建struts2项目,之后再放入vulhub里s2-016的jar包,再配置一下xml,之后写个action(就是一个struts2的HelloWorld项目)。

POC 验证,redirect:${3*4}url编码redirect%3a%24%7b3*4%7d,执行了OGNL表达式:

3、调试追踪

https://cwiki.apache.org/confluence/display/WW/S2-016 看,是 DefaultActionMapper 处理重定向前缀参数出的问题。在DefaultActionMapper构造方法里面,有new了一个PrefixTrie对象。

这里选择重定向前缀redirect:也是REDIRECT_PREFIX的那个put方法下个断点。

216行再下个断点,可以看到payload设置到了mapping的result里的location里面。

往下走,到了handleSpecialParameters方法,功能大概是处理一下参数(参数唯一什么的):

继续往下走,来到getMapping函数,先处理了一下action后缀名,发现之后调用了handleSpecialParameters,之后设置mapping的name和method然后return了。

之后来到findActionMapping函数,最后返回了个ActionMapping对象。

下来到了StrutsPrepareAndExecuteFilter过滤器,发现执行了execute.executeAction()函数。

继续F8下去,来到ServletRedirectResult的doExecute函数,发现已经执行了payload(ognl表达式:${3*4},finalLocation值为执行结果,payload换为执行whoami命令行,finalLocation存储执行结果)。

返回execute.executeAction()调试,f7跟进,发现执行了serviceAction方法。

再f7跟进,一直f8下来,执行了result.execute()

执行了父类StrutsResultSupport的 execute 方法,进入,可以看到payload在location。

进入conditionalParse,发现执行了TextParseUtil.translateVariables之后return,继续往下,发现payload已经执行,parsedValue存储执行结果。

继续看TextParseUtil.translateVariables函数

    public static Object translateVariables(char[] openChars, String expression, final ValueStack stack, final Class asType, final TextParseUtil.ParsedValueEvaluator evaluator, int maxLoopCount) {
        TextParseUtil.ParsedValueEvaluator ognlEval = new TextParseUtil.ParsedValueEvaluator() {
            public Object evaluate(String parsedValue) {
                Object o = stack.findValue(parsedValue, asType);
                if (evaluator != null && o != null) {
                    o = evaluator.evaluate(o.toString());
                }

                return o;
            }
        };
        TextParser parser = (TextParser)((Container)stack.getContext().get("com.opensymphony.xwork2.ActionContext.container")).getInstance(TextParser.class);
        XWorkConverter conv = (XWorkConverter)((Container)stack.getContext().get("com.opensymphony.xwork2.ActionContext.container")).getInstance(XWorkConverter.class);
        Object result = parser.evaluate(openChars, expression, ognlEval, maxLoopCount);
        return conv.convertValue(stack.getContext(), result, asType);
    }

再跟入parser.evaluate函数,发现执行evaluator.evaluate(var),此时var为`3*4

一直往下,OgnlValueStack类的getValue函数获得值,最后由ognlUtil.getValue执行ognl表达式返回结果。

三、参考文章

https://xz.aliyun.com/t/4603

https://www.jianshu.com/p/de165430e8a8

原文地址:https://www.cnblogs.com/nobgr/p/12291701.html

时间: 2024-10-14 09:22:59

S2-016调试学习的相关文章

vlc源码分析(七) 调试学习HLS协议

HTTP Live Streaming(HLS)是苹果公司提出来的流媒体传输协议.与RTP协议不同的是,HLS可以穿透某些允许HTTP协议通过的防火墙. 一.HLS播放模式 (1) 点播模式(Video on demand, VOD) 点播模式是指当前时间点可以获取到所有index文件和ts文件,二级index文件中记录了所有ts文件的地址.这种模式允许客户端访问全部内容.上面的例子中就是一个点播模式下的m3u8的结构. (2) 直播模式(Live) 直播模式是指实时生成M3u8和ts文件.它的

CCT之CAMERA TUNNING调试学习总结

ob 静态电流 shading 阴影, 3a GAMMA:拍灰阶卡, ccm isp 是image signal processing,用于图像处理,比如gamma调整,dynamic range correction,smmoth,sharpness,format convert,resize,edge enhancement ,color correction等操作都是这里完成的.3aa 是ae/af/awb algorithms. 3aa 的硬件模块分析输出3a的统计信息.3aa软件是分析

OD调试学习笔记7—去除未注册版软件的使用次数限制

OD调试学习笔记7—去除未注册版软件的使用次数限制 本节使用的软件链接 (想自己试验下的可以下载) 一:破解的思路 仔细观察一个程序,我们会发现,无论在怎么加密,无论加密哪里,这个程序加密的目的就是需要你掏腰包来获得更多的功能或者解除限制.那么我们就可以逆向的来思考,如果该程序成功的注册后,那么程序的行为必将发生变化,如NAG去除了,如功能限制没有了等等.也就是说,程序的代码的走法也会跟未注册的时候截然不同.因为程序的行为改变了,那么决定它所有行为的代码走法也会发生变化. 二:认识OD的两种断点

.net 高级调试学习(3)异常查看

还是 .net 高级调试学习(2)中的源代码, 运行调试程序到输出异常,windbg自动中断后, 1.执行.loadby sos clr 2.执行!printexception ,(PS :缩写!pe)看到如下: Exception object: 0000000002557cb8 Exception type: System.ArgumentException Message: Obj cannot be null InnerException: <none> StackTrace (gen

android学习笔记(9)android程序调试学习

相应若水老师的第十四课 一,Log日志输出 Log.v(tag,message);        //verbose模式,打印最具体的日志 Log.d(tag,message);        //debug级别的日志 Log.i(tag,message);        //info级别的日志 Log.w(tag,message);        //warn级别的日志 Log.e(tag,message);        //error级别的日志 tag用来标记log消息的源头用常量来表示.

gdb 调试学习

gdb 是unix/linux 系统下的程序调试工具,和IDE(如VS, Eclipse等)的图形化调试工具相比,gdb在断点,跟踪显示方面有着不足,但是它在某些方面比图形化调试工具更加丰富的功能. gdb 调试前提 如果希望程序能够被gdb调试,则需要在编译程序时候,指定 -g 选项. gdb 的调试和程序的release 优化一样,也存在着级别,可以手动设置.默认的gdb级别为2, 当把gdb的调试级别设置为3的时候,可以在gdb调试过程中 macro expand/exp  对程序中的宏定

android学习笔记(7)android程序调试学习

对应若水老师的第十四课 一,Log日志输出 Log.v(tag,message);        //verbose模式,打印最详细的日志 Log.d(tag,message);        //debug级别的日志 Log.i(tag,message);        //info级别的日志 Log.w(tag,message);        //warn级别的日志 Log.e(tag,message);        //error级别的日志 tag用来标记log消息的源头用常量来表示.

eclipse debug (调试) 学习心得

进入debug模式: 1.设置断点 2.启动servers端的debug模式 3.运行程序,在后台遇到断点时,进入debug调试状态 ============================= 作用域 功能 快捷键 全局 单步返回 F7 全局 单步跳过 F6 全局 单步跳入 F5 全局 单步跳入选择 Ctrl+F5 全局 调试上次启动 F11 全局 继续 F8 全局 使用过滤器单步执行 Shift+F5 全局 添加/去除断点 Ctrl+Shift+B 全局 显示 Ctrl+D 全局 运行上次启动

.net 高级调试学习(2)对象查看

调试的程序源代码如下: using System; using System.Text; namespace Advanced.NET.Debugging.Chapter3 { public class ObjTypes { public struct Coordinate { public int xCord; public int yCord; public int zCord; public Coordinate(int x, int y, int z) { xCord = x; yCor