java 命令行 反序列化_缓解java执行命令抵御反序列化漏洞的实现方案

最近st2 框架又出漏洞了 一大堆java被执行命令了

这里我提一个解决方案 可以适当缓解服务端被漏洞进行rce漏洞的问题

LD_PRELOAD替换进程底层函数 首先请看这篇文章   如果是某位c++的大佬 您老就不用看了:)

我们来看看我们替换的函数

#include

#include

#include

#include

#include

int system(const char *command){

printf("system!阻止执行!\n");

return 0;

}

FILE * popen( const char * command,const char * type){

printf("popen!阻止执行!\n");

return 0;

}

int execl(const char *path, const char *arg, ...){

printf("execl!阻止执行!\n");

return 0;

}

int execlp(const char *file, const char *arg, ...){

printf("execlp!阻止执行!\n");

return 0;

}

int execle(const char *path, const char *arg, ...){

printf("execle!阻止执行!\n");

return 0;

}

int execv(const char *path, char *const argv[]){

printf("execv!阻止执行!\n");

return 0;

}

int execvp(const char *file, char *const argv[]){

printf("execvp!阻止执行!\n");

return 0;

}

正因为这些函数都是linux内核导出的函数  如果我们能阻止jvm执行这些底层的c族函数 就能达到本文的目的

下面我们开始实战

我们先用java写接口list2 执行 whoami 命令 list3 它执行了pwd命令

两个接口分别用了ProcessBuilder 和 Runtime.getRuntime().exec()  两种不同的方法

a68fbf5fda6191c309ee1c214754f155.png

4f38c5fa11ad6b8f20facc2e71fd055e.png

我们跑起来看看(为了看起来更为清爽  我直接用浏览器访问接口)

正常访问list2接口

819b032df5f7f6f0a9311fcbcbf167ca.png

正常访问list3接口

054bc6c8f9e1198d8c79114b1da86802.png

java运行我们的jar包的后 访问 list3接口 能看到正确获取了当前的 /root/ctest 目录

我们现在使用LD_PRELOAD再观察对比一下

list2 阻止了命令执行

052a868f75a1e2a469d2a91fdd6f589d.png

6678958c77ce8c394394726121594bb0.png这是输出的阻止信息

list3我们也来试试看

1d4fecffaa102c5e14b942a87156e6ef.png

b0269d5726cca36e59749ff1f555a4c6.png

java不再可以执行系统命令了

以这种方法部署的java实例 可以有效地缓解命令执行漏洞 不过对于内存或文件读写还是没有什么好的办法

这种方法建议部署在类似于springboot这类的独立jar包部署的docker场景下

谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值