【技术原创】Java利用技巧——通过反射修改属性 - 嘶吼 RoarTalk – 网络安全行业综合服务平台,4hou.com

【技术原创】Java利用技巧——通过反射修改属性

3gstudent 技术 2022-02-08 11:45:00
138268
收藏

导语:本文介绍了通过反射枚举JspServletWrapper实例的具体实现,记录思路和细节,便于以此类推,修改其他内容。

0x00 前言

在上篇文章《Zimbra漏洞调试环境搭建》提到了通过反射枚举JspServletWrapper实例的实现,本文将要以此为例,详细介绍实现的思路和细节,便于以此类推,实现其他功能。

0x01 简介

本文将要介绍以下内容:

◼反射中的常用操作

◼获得类的所有字段

◼获得类的所有方法

◼调用类的方法

◼枚举JspServletWrapper实例的实现细节

0x02 反射中的常用操作

1.获得类的所有字段

getField():

能够获取本类以及父类中的public字段

getDeclaredField():

能够获取本类中的所有字段

这里以Zimbra环境为例,给出示例代码

(1)获取request对象的所有字段

image.png

(2)获取request对象的父类的所有字段

image.png

2.获得类的所有方法

getMethods():

能够获取本类以及父类或者父接口中的公共方法(public修饰符修饰的)

getDeclaredMethods():

能够获取本类中的所有方法,包括private、protected、默认以及public的方法

这里以Zimbra环境为例,给出示例代码

(1)获取request对象的所有方法

image.png

(2)获取request对象的父类的所有方法

image.png

3.调用类的指定方法

这里以Zimbra环境为例,给出示例代码

搭建好Zimbra漏洞调试环境后,定位request对象的getHeader(String name)方法,代码细节如下:

image.png

对照代码细节,参数类型为String

调用request对象的getHeader(String name)方法,参数为"User-Agent",实现代码如下:

image.png

0x03 枚举JspServletWrapper实例的实现细节

1.下断点

选择文件servlet-api-3.1.jar,依次选中javax.servlet->http->HttpServlet.class,在合适的位置下断点,当运行到断点时,可以查看request对象的完整结构,如下图

e9e0eae38cecda9913564d7bfcf1b5a.png

查看request对象的结构,我们最终定位到了JspServletWrapper实例的位置,直观的映射为:request->_scope->_servlet->rctxt->jsps

接下来,我们需要按照这个映射,通过多次反射最终获得JspServletWrapper实例

(1)读取request对象的所有字段

image.png

在回显的结果中能够找到_scope

(2)从request对象获得_scope实例并再次枚举字段

image.png

在回显的结果中能够找到_servlet

(3)获得_servlet实例并再次枚举字段

image.png

回显的结果为:serialVersionUID

这里没有rctxt字段

尝试寻找原因:开启调试器,定位至关键位置,如下图

46a735c03b2f1ba1fabf34da4ab54c7.png

从图中可以看到,_servlet的类为JettyJspServlet

JettyJspServlet继承自JspServlet,成员变量只有serialVersionUID,这与我们通过访问jsp页面得到的结果一致

查看JspServlet的相关实现代码,如下图

5872d6fee77f3adc12ac3e6f4d198a2.png

从图中可以看到,rctxt为JspServlet的成员变量,属性为private,所以子类JettyJspServlet无法继承成员变量rctxt

这里我们可以直接选取_servlet实例的父类进行枚举字段

(4)选取_servlet实例的父类进行枚举字段

image.png

在回显的结果中能够找到jsps

(5)获得jsps实例并枚举字段

开启调试器,查看jsps的类型,如下图

7a9266135013ed420e1958d8b9ae80c.png

从图中可以看到,jsps的类为ConcurrentHashMap,这里只需要枚举出所有Key即可

添加需要导入的包后,得出最终实现代码:

image.png

补充:删除指定JspServletWrapper的实例

只需要调用ConcurrentHashMap的remove方法即可

示例代码:

image.png

0x04 小结

本文介绍了通过反射枚举JspServletWrapper实例的具体实现,记录思路和细节,便于以此类推,修改其他内容。

如若转载,请注明原文地址
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论

 
本站4hou.com,所使用的字体和图片文字等素材部分来源于原作者或互联网共享平台。如使用任何字体和图片文字有侵犯其版权所有方的,嘶吼将配合联系原作者核实,并做出删除处理。
©2022 北京嘶吼文化传媒有限公司 京ICP备16063439号-1 本站由 提供云计算服务