• Java代码审计rce漏洞


    Runtime

    Runtime.exec("command")

    1. public class LocalRuntime extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. String cmd = req.getParameter("cmd");
    5. InputStream ins = Runtime.getRuntime().exec(cmd).getInputStream();
    6. ServletOutputStream sos = resp.getOutputStream();
    7. int len;
    8. byte[] bytes = new byte[1024];
    9. while ((len = ins.read(bytes))!=-1){
    10. sos.write(bytes, 0, len);
    11. }
    12. }
    13. @Override
    14. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    15. super.doGet(req, resp);
    16. }
    17. }

     

    反射Runtime

    1、反射获取Runtime的class对象

    2、获取Runtime构造方法

    3、newInstance一个新Runtime的实例对象

    4、获取exec方法

    5、invoke激活执行

    1. public class ReflactRuntime extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
    4. String cmd = req.getParameter("cmd");
    5. try {
    6. Class cls = Class.forName("java.lang.Runtime");
    7. Constructor constructor = cls.getDeclaredConstructor();
    8. constructor.setAccessible(true);
    9. Object runtime = constructor.newInstance();
    10. Method exec = cls.getMethod("exec", String.class);
    11. Process process = (Process) exec.invoke(runtime, cmd);
    12. InputStream ins = process.getInputStream();
    13. int len;
    14. byte[] bytes = new byte[1024];
    15. ServletOutputStream sos = resp.getOutputStream();
    16. while ((len = ins.read(bytes)) != -1){
    17. sos.write(bytes, 0, len);
    18. }
    19. } catch (Exception e) {
    20. e.printStackTrace();
    21. }
    22. }
    23. @Override
    24. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    25. super.doGet(req, resp);
    26. }
    27. }

     

    ProcessBuilder

    ProcessBuilder此类用于创建操作系统进程。每个ProcessBuilder实例管理进程属性的集合。 start()方法使用这些属性创建一个新的Process实例。 start()方法可以从同一实例重复调用,以创建具有相同或相关属性的新子进程。

    ProcessBuilder.start()Runtime.exec方法都可以创建一个本机进程并返回一个Process子类的Process (Runtime.exec底层调用的也是ProcessBuilder.start()),可以用来控制进程并获取有关它的信息。

    ProcessBuilder命令执行

    1、创建ProcessBuilder实例化对象

    2、调用start方法执行

    3、返回的Process对象调用getInputStream获取输入流

    4、读取输入流写入输出流

    public class Pr
  • 相关阅读:
    工控行业各品牌程序扩展格式和软件
    STM32 软件IIC 控制OLED 显示屏
    淘宝天猫API接入说明(淘宝天猫商品详情+关键词搜索商品列表)商品详情数据,商品sku数据,商品优惠券数据
    JS基础笔记-关于对象
    PowerCLi 导入License到vCenter 7
    使用vmware ESXi安装和复制虚拟机
    EL表达式
    Javascript 基础知识学习
    C++中的四种强制类型转换符详解
    Visual Studio 2022 将类库项目上传至NuGet
  • 原文地址:https://blog.csdn.net/m0_55772907/article/details/127865056