命令执行与反序列化漏洞简介和防御 - 帅的被狗咬

时间:2024-03-11 10:38:57

命令执行与反序列化漏洞简介和防御

一、远程代码执行漏洞(RCE)

1、远程系统命令执行漏洞

       应用系统在设计上,需要给用户提供指定的远程命令操作接口,而设计者在完成该功能时,并没有做严格的安全控制,那攻击者就可以通过该接口控制整个后台服务器 。

      例:我们常见的路由器、防火墙、入侵检测等设备的web管理界面上,一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。 

 注:现在很多的甲方企业都开始实施自动化运维,大量的系统操作会通过"自动化运维平台"进行操作,在这种平台上往往会出现远程系统命令执行的漏洞

2、远程代码执行漏洞

      因为需求设计,不管是使用了代码执行的函数,还是使用了不安全的反序列化,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。

预防:如果需要给前端用户提供操作类的API接口,一定要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法。

3、实战测试

(1)执行系统命令: assert,system,passthru,exec,pcntl_exec,shell_exec,popen,proc_open,``(反单引号)
(2)代码执行与加密: eval, assert, call_user_func,base64_decode, gzinflate, gzuncompress, gzdecode, str_rot13
(3)文件包含与生成: require, require_once, include, include_once, file_get_contents, file_put_contents, fputs, fwrite
(4).htaccess: SetHandler, auto_prepend_file, auto_append_file
(5)dvwa low && Medium & 或&;& High | (代码里面的|后有一个空格)
(6)struts2命令执行漏洞攻防演示    注:https://www.seebug.org/search/?keywords=struts2

 二、反序列化漏洞

1、反序列化就是把一个对象变成可以传输的字符串,目的就是为了方便传输。

注:当我们写了一个class,这个class里面存有一些变量。当这个class被实例化了之后,在使用过程中里面的一些变量值发生了改变。以后在某些时候还会用到这个变量,如果我们让这个class一直不销毁,等着下一次要用它的时候再一次被调用的话,浪费系统资源。当我们写一个小型的项目可能没有太大的影响,但是随着项目的壮大,一些小问题被放大了之后就会产生很多麻烦。这个时候PHP就和我们说,你可以把这个对象序列化了,存成一个字符串,当你要用的时候再放他出来就好了。在我们讲PHP反序列化的时候,基本都是围绕着serialize(),unserialize()这两个函数。

2、反序列化漏洞产生的原理
serialize() 和 unserialize() 在 PHP内部实现上是没有漏洞的,之所以会产生反序列化漏洞是因为应用程序在处理对象、魔术函数以及序列化相关问题的时候导致的。当传给 unserialize() 的参数可控时,那么用户就可以注入精心构造的 payload,而当进行反序列化的时候就有可能会触发对象中的一些魔术方法,造成意想不到的危害。

Weblogic 常见漏洞有那些:弱口令、Java 反序列化漏洞操作(CVE-2018-2628)、任意文件上传漏洞操作(CVE-2018-2894)、XML Decoder 反序列化漏洞操作(CVE-2017-10271)、SSRF 漏洞(需要安装Weblogic时选择UDDI组件)、反序列化漏洞(CVE-2019-2725 )

三、安全防范

1、安全配置好php相关参数

      通过Php配置文件里面有个disable_functions = 配置,这个禁止某些php函数,服务器便是用这个来禁止php的执行命令函数。

例如:disable_functions =system,passthru,shell_exec,exec,popen   便禁止了用这些函数来执行系统命令

2、升级中间件

3、严格控制传入变量,严谨使用魔法函数

 注:序列化和反序列化知识

        序列化就是把实体对象状态按照一定的格式写入到有序字节流,反序列化就是从有序字节流重建对象,恢复对象状态。序列化机制的核心就是对象状态的保存与重建。

①Java序列化就是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中,序列化后的字节流保存了Java对象的状态以及相关的描述信息。

②Java反序列化:Java客户端从文件中或网络上获得序列化后的对象字节流后,根据字节流中所保存的对象状态及描述信息,通过反序列化重建对象。

2、为什么需要序列化与反序列化

一是可以实现数据的持久化,在MVC模式中很是有用;二是实现了远程通信,即在网络上传送对象的字节序列。

总的来说可以归结为以下几点:

(1)永久性保存对象,保存对象的字节序列到本地文件或者数据库中;
(2)通过序列化以字节流的形式使对象在网络中进行传递和接收;
(3)通过序列化在进程间传递对象;