没有合适的资源?快使用搜索试试~ 我知道了~
Java安全漫谈 - 03.反射篇(3)1
需积分: 0 1 下载量 151 浏览量
2022-08-03
18:44:52
上传
评论
收藏 435KB PDF 举报
温馨提示
试读
3页
对于可变长参数,Java其实在编译的时候会编译成一个数组,也就是说,如下这两种写法在底层是等价的(也就不能重载):也由此,如果我们有一个数组,想传给hello函
资源详情
资源评论
资源推荐
Java安全漫谈 - 03.反射篇(3)
这是代码审计知识星球中Java安全的第三篇文章。
上次讲了个简单的命令执行Payload,但遗留下来两个问题:
如果一个类没有无参构造方法,也没有类似单例模式里的静态方法,我们怎样通过反射实例化该类
呢?
如果一个方法或构造方法是私有方法,我们是否能执行它呢?
第一个问题,我们需要用到一个新的反射方法 getConstructor 。
和 getMethod 类似, getConstructor 接收的参数是构造函数列表类型,因为构造函数也支持重载,
所以必须用参数列表类型才能唯一确定一个构造函数。
获取到构造函数后,我们使用 newInstance 来执行。
比如,我们常用的另一种执行命令的方式ProcessBuilder,我们使用反射来获取其构造函数,然后调用
start() 来执行命令:
ProcessBuilder有两个构造函数:
public ProcessBuilder(List<String> command)
public ProcessBuilder(String... command)
我上面用到了第一个形式的构造函数,所以我在 getConstructor 的时候传入的是 List.class 。
但是,我们看到,前面这个Payload用到了Java里的强制类型转换,有时候我们利用漏洞的时候(在表
达式上下文中)是没有这种语法的。所以,我们仍需利用反射来完成这一步。
其实用的就是前面讲过的知识:
通过 getMethod("start") 获取到start方法,然后 invoke 执行, invoke 的第一个参数就是
ProcessBuilder Object了。
Class clazz = Class.forName("java.lang.ProcessBuilder");
((ProcessBuilder)
clazz.getConstructor(List.class).newInstance(Arrays.asList("calc.exe"))).star
t();
1
2
Class clazz = Class.forName("java.lang.ProcessBuilder");
clazz.getMethod("start").invoke(clazz.getConstructor(List.class).newInstance(
Arrays.asList("calc.exe")));
1
2
番皂泡
- 粉丝: 18
- 资源: 320
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0