CodeQL挖掘fastjson漏洞
fastjson反序列化这个漏洞原理这里就不过多BB了,简单解释:
fastjson反序列化的触发点在 parse 或者 parseObject 方法,该方法一个参数会接受一个json字符串,然后将其反序列化为一个java对象并调用其 getXXX 或 setXXX 方法。攻击者可以精心构造一个json字符串,触发危险的 getXXX 或 setXXX 方法,导致产生危害严重的漏洞
参考:https://tttang.com/archive/1579/
Source按照Spring框架,这个Source一般定义为各种Controller的参数或者request.getParameter等
可能还有其他,具体问题具体分析
代码如下:
class AllControllerMethod extends Method{
AllControllerMethod(){
exists(RefType rt |
rt.getName().indexOf("Controller")>0 and
thi ...
CodeQL挖掘MyBatis框架的SQL注入
MyBatis的SQL注入MyBatis支持两种参数符号,一种是#,另一种是$。使用参数符号#的句子:
<select id="selectPerson" parameterType="int" resultType="hashmap">
SELECT * FROM PERSON WHERE ID = #{id}
</select>
MyBatis会创建一个预编译语句,生成的代码类似于
// Similar JDBC code, NOT MyBatis…
String selectPerson = "SELECT * FROM PERSON WHERE ID=?";
PreparedStatement ps = conn.prepareStatement(selectPerson);
ps.setInt(1,id);
参数会在SQL语句中用占位符”?”来标识,然后使用prepareStatement来预编译这个SQL语句\
另一种使用参数符号$时,MyBa ...
XML-RPC反序列化漏洞
XML-RPC反序列化漏洞XML-RPCXml-RPC是一个远程过程调用(remote procedure call,RPC)的分布式计算协议,通过XML将调用函数封装,并使用HTTP协议作为传送机制。
CVE-2016-5003环境搭建:
起一个Maven项目导入下面依赖:
<dependencies>
<dependency>
<groupId>org.apache.xmlrpc</groupId>
<artifactId>xmlrpc-common</artifactId>
<version>3.1.3</version>
</dependency>
<dependency>
<groupId>org.apache.xmlrpc</groupId>
<artifactId>xmlrpc-server</artifa ...
Spring内存马
学习,记录
前置知识Beanbean 是 Spring 框架的一个核心概念,它是构成应用程序的主干,并且是由 Spring IoC 容器负责实例化、配置、组装和管理的对象。
通俗来讲:
bean 是对象
bean 被 IoC 容器管理
Spring 应用主要是由一个个的 bean 构成的
ApplicationContext在Spring里,BeanFactory是IoC容器的实际代表,而ApplicationContext正好继承了BeanFactory,所以org.springframework.context.ApplicationContext接口也代表了IoC容器,一旦获得了ApplicationContext实例,也即获得了IoC容器的引用。
这是BeanFactory与ApplicationContext的区别:
BeanFactory的实现是按需创建,即第一次获取Bean时才创建这个Bean,而ApplicationContext会一次性创建所有的Bean
ContextLoaderListener在spring应用里,可以同时有多个Context,其中只有一个 ...
Code-Breaking Puzzles
前言这个是P牛知识星球上的一道题,历史久远,但是值得学习
题目文件:https://www.leavesongs.com/media/attachment/2018/11/23/challenge-0.0.1-SNAPSHOT.jar
题目分析解压jar拿到配置文件
spring:
thymeleaf:
encoding: UTF-8
cache: false
mode: HTML
keywords:
blacklist:
- java.+lang
- Runtime
- exec.*\(
user:
username: admin
password: admin
rememberMeKey: c0dehack1nghere1
反编译class查看一下代码,可以边运行jar边分析
查看MainController,没有登录的情况下会跳转到/login
@GetMapping({"/login"})
public String login() {
...
东华杯ezgadget
题目分析题目给了一个jar,反编译查看
路由
public class IndexController {
@ResponseBody
@RequestMapping({"/"})
public String index(HttpServletRequest request, HttpServletResponse response) {
return "index";
}
@ResponseBody
@RequestMapping({"/readobject"})
public String unser(@RequestParam(name = "data",required = true) String data, Model model) throws Exception {
byte[] b = Tools.base64Decode ...
C3P0
C3P0反序列化C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等
连接池类似于线程池,在一些情况下我们会频繁地操作数据库,此时Java在连接数据库时会频繁地创建或销毁句柄,增大资源的消耗。为了避免这样一种情况,我们可以提前创建好一些连接句柄,需要使用时直接使用句柄,不需要时可将其放回连接池中,准备下一次的使用。类似这样一种能够复用句柄的技术就是池技术。
环境:
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
URLClassLoader漏洞发生在com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase这个类
先看看序列化writeO ...
JDBC反序列化
JDBC反序列化认识JDBCJDBC(Java DataBase Connectivity)是一种用于执行Sql语句的Java Api,即Java数据库连接,是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,可以为多种关系数据库提供统一访问,提供了诸如查询和更新数据库中数据的方法,是Java访问数据库的标准规范。简单理解为链接数据库、对数据库操作都需要通过jdbc来实现。Mysql JDBC 中包含一个危险的扩展参数: “autoDeserialize”。这个参数配置为 true 时,JDBC 客户端将会自动反序列化服务端返回的数据,造成RCE漏洞。
漏洞原理若攻击者能控制JDBC连接设置项,则可以通过设置其配置指向恶意MySQL服务器触发ObjectInputStream.readObject(),构造反序列化利用链从而造成RCE。通过JDBC连接MySQL服务端时,会有几句内置的查询语句需执行,其中两个查询的结果集在MySQL客户端进行处理时会被ObjectInputStream.readObject()进行反序列化处理。如果攻击者可以控制JDBC连接设置项,那么可 ...
CommonsBeanutils反序列化
CommonsBeanutils反序列化CB1环境搭建:
<dependencies>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.22.0-GA</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
</dependencies>
下图是学习CC链的时 ...
Java Agent内存马
JavaAgent内存马在 jdk 1.5 之后引入了 java.lang.instrument 包,该包提供了检测 java 程序的 Api,比如用于监控、收集性能信息、诊断问题,通过 java.lang.instrument 实现的工具我们称之为 Java Agent ,Java Agent 能够在不影响正常编译的情况下来修改字节码,即动态修改已加载或者未加载的类,包括类的属性、方法
Agent 内存马的实现就是利用了这一特性使其动态修改特定类的特定方法,将我们的恶意方法添加进去
说白了 Java Agent 只是一个 Java 类而已,只不过普通的 Java 类是以 main 函数作为入口点的,Java Agent 的入口点则是 premain 和 agentmain
Java Agent 支持两种方式进行加载:
premain(了解)实现 premain 方法,在启动时进行加载 (该特性在 jdk 1.5 之后才有)
首先创建一个demo
package org.example;
import java.lang.instrument.Instrumentation;
publ ...