MySQL 注入攻击与防御
MySQL 注入攻击与防御
不能光看理论,学习一下如何攻击,后面再找比赛题目复现
上一篇反序列化文章主要分析wirteObject
和readObject
这两个方法,
知道了序列化和反序列化的过程,漏洞形成的原因主要就是因为服务端进行反序列化数据时,会自动调用类中的readObject
代码,这样就使得攻击者可以在服务器上执行一些恶意代码。
大致有四种情况会导致反序列化形成,
- 入口类(主类)重写
readObject
方法,直接调用危险函数- 入口类的参数中包含可控类,该类中存在危险函数,
readObject
时调用- 入口类参数中包含可控类,该类调用其他有危险方法的类,
readObject
时进行调用- 构造函数/静态代码块等类加载时隐式执行
而入口类必须调用Serializable
接口,不然该类无法被实例化,并且重写了readObject
,可以构造利用链。
这篇讲述URLDNS
,一步步学习,再学习cc链。
终于开始反序列化开篇,之前再RMI的攻击和流程中发现,大多数的数据发送和接收都是反序列化数据。
那么,为什么反序列化常常会带来安全隐患?
一门成熟的语言,如果需要在网络上传递信息,通常会用到一些格式化数据,
比如:
- JSON
- XML
但这两个数据格式都有一个共 同的问题:不支持复杂的数据类型。 大多数处理方法中,JSON和XML支持的数据类型就是基本数据类型,整型、浮点型、字符串、布尔 等,如果开发者希望在传输数据的时候直接传输一个对象,那么就不得不想办法扩展基础的 JSON(XML)语法。
比如,Jackson和Fastjson这类序列化库,在JSON(XML)的基础上进行改造,通过特定的语法来传递对象;亦或者如RMI,直接使用Java等语言内置的序列化方法,将一个对象转换成一串二进制数据进行 传输。
不管是Jackson、Fastjson还是编程语言内置的序列化方法,一旦涉及到序列化与反序列化数据,就可 能会涉及到安全问题。但首先要理解的是,“反序列化漏洞”是对一类漏洞的泛指,而不是专指某种反序 列化方法导致的漏洞,比如Jackson反序列化漏洞和Java readObject造成的反序列化漏洞就是完全不同 的两种漏洞。
我们先来说说Java内置的序列化方法readObject
,和其有关的漏洞
RMI2
中成功实现了codebase进行加载恶意类,但是在实际环境确实难实现符合环境,所以只作为一个了解和认识。
这篇文章主要分析codebase是如何在RMI中进行传递的,以及对分析Java序列化数据的工具SerializationDumper
的使用介绍
从RMI第一篇描述了RMI的通信过程和组成成分,总结一下,一个RMI过程有以下三个参与者:
RMI Registry
RMI Server
RMI Client
但是对于RMI Registry来说,一般在创建时,就直接和服务器端的一个对象进行绑定,所以最后只有Server和Client两部分代码,而Server中就自然包含了Registry和Server两部分:
1 | LocateRegistry.createRegistry(1099); |
上述代码中,第一行是创建并运行RMI Registry
,第二行是将RemoteHelloWorld
对象绑定到Hello
这个Name
上。
Naming.bind
的第一个参数是url
,格式为rmi://host:post/name
。这里的host
和post
就是RMI Registry
的地址和端口,name
就是远程对象绑定的名字。
不过,如果RMI Registry
在本地运行,那么host
和port
是可以省略的,host
默认为localhost
,port
默认是1099
直接保留name
就行,
1 | Naming.bind("Hello",new RemoteHelloWorld()); |
第一篇大致讲了RMI整体的原理和流程,那么接下来自然要想到RMI会有哪些安全问题,可以分为两个方向
- 如果我们能够访问
RMI Registry
,将如何对其进行攻击?- 如果我们可以控制目标RMI客户端中的
Naming.lookup
的第一个参数,也就是RMI Registry
的地址和端口,能不能进行攻击?
熟悉的名字,在CVE学习中,其中Apache solr
的log4j
漏洞和weblogic
远程代码执行都提到了RMI
,作用如名, RMI(remote method invocation)
即远程方法调用
。
Java
执行命令的方法ProcessBuilder
- 反射中使用
getConstructor
获取构造有参构造函数- 可变长参数(
varargs
)在反射中的意义与使用getDeclared
系列反射函数和普通反射的区别于使用
并解决第二篇的两个问题,
- 如果一个类没有无参构造方法,也没有类似单例模式里的静态方法,我们怎样通过反射实例化该类呢?
- 如果一个方法或构造方法是私有方法,我们是否能执行它呢?
本来想将p神的JavaScript污染链文章并在我写的基础浅入里,但是感觉还是得分开学习记录,p神干货还得和我水的文章分开,浅入就讲概念理解学习吧,深入就涉及深入认识污染了