Register | Forget Password | Login
Search :
SecurityReason

News

Search

SecurityAlert

About SecurityAlert

ExploitAlert

SecurityReason Research

RSS

News

SecurityAlert

ExploitAlert

Apache

PHP

Corporate

Contact

About us

Services

SecurePHP

Note

If you have found a vulnerability, please send to our SecurityAlert Database :
secalert()securityreason()com

Also if you have new ( 0-day ) exploit, please send to our ExploitAlert Archive :
exploit()securityreason()com

Details : SecurityAlert

  Topic : PHP 5.2.5 cURL safe_mode bypass
  SecurityAlert : 3562
  CVE : CVE-2007-4850
  SecurityRisk : Medium  alert
  Remote Exploit : No
  Local Exploit : Yes
  Exploit Given : No
  Credit : Maksymilian Arciemowicz
  Date : 22.01.2008

  Affected Software : PHP 5.2.5 and 5.2.4


  Advisory Text :  

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

[PHP 5.2.5 cURL safe_mode bypass ]

Author: Maksymilian Arciemowicz (cXIb8O3)
SecurityReason
Date:
- - Written: 21.08.2007
- - Public: 22.01.2008

SecurityReason Research
SecurityAlert Id: 51

CVE: CVE-2007-4850
SecurityRisk: Medium

Affected Software: PHP 5.2.4 and 5.2.5
Advisory URL:
http://securityreason.com/achievement_securityalert/51
Vendor: http://www.php.net

- --- 0.Description ---

PHP is an HTML-embedded scripting language. Much of its syntax is
borrowed from C, Java and Perl with a couple of unique
PHP-specific features thrown in. The goal of the language is to
allow web developers to write dynamically generated pages
quickly.

PHP supports libcurl, a library created by Daniel Stenberg, that
allows you to connect and communicate to many different types of
servers with many different types of protocols. libcurl currently
supports the http, https, ftp, gopher, telnet, dict, file, and
ldap protocols. libcurl also supports HTTPS certificates, HTTP
POST, HTTP PUT, FTP uploading (this can also be done with PHP's
ftp extension), HTTP form based upload, proxies, cookies, and
user+password authentication.

These functions have been added in PHP 4.0.2.

- --- 1. cURL ---
This is very similar to CVE-2006-2563.

http://securityreason.com/achievement_securityalert/39


The first issue [SAFE_MODE bypass]

var_dump(curl_exec(curl_init("file://safe_mode_bypass\x00&qu
ot;.__FILE__)));

is caused by error in curl/interface.c

- ---
#define PHP_CURL_CHECK_OPEN_BASEDIR(str, len,
__ret) \
if (((PG(open_basedir) && *PG(open_basedir)) ||
PG(safe_mode)) &&
\
strncasecmp(str, "file:",
sizeof("file:") - 1) == 0) \
{ \
php_url *tmp_url; \
\
if (!(tmp_url = php_url_parse_ex(str, len))) { \
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid URL
'%s'", str); \
php_curl_ret(__ret); \
} \
\
if (!php_memnstr(str, tmp_url->path,
strlen(tmp_url->path), str + len)) { \
php_error_docref(NULL TSRMLS_CC, E_WARNING, "URL '%s'
contains unencoded control characters", str); \
php_url_free(tmp_url); \
php_curl_ret(__ret); \
} \
\
if (tmp_url->query || tmp_url->fragment ||
php_check_open_basedir(tmp_url->path TSRMLS_CC) || \
(PG(safe_mode) && !php_checkuid(tmp_url->path,
"rb+", CHECKUID_CHECK_MODE_PARAM)) \
) { \
php_url_free(tmp_url); \
php_curl_ret(__ret); \
} \
php_url_free(tmp_url); \
}
- ---

if you have tmp_url = php_url_parse_ex(str, len)
where:

str = "file://safe_mode_bypass\x00".__FILE__

and this function will return:

tmp_url->path = __FILE__

curl_init() functions checks safemode and openbasedir for
tmp_url->path. Not for real path.

- ---
if (argc > 0) {
char *urlcopy;

urlcopy = estrndup(Z_STRVAL_PP(url), Z_STRLEN_PP(url));
curl_easy_setopt(ch->cp, CURLOPT_URL, urlcopy);
zend_llist_add_element(&ch->to_free.str, &urlcopy);
}
- ---

the last step in curl_init() function will only copy
file://safe_mode_bypass to urlcopy.

The main problem exists in php_url_parse_ex() function. If you
put in curl_init() "file://host/somewhere/path.php",
php_url_parse_ex() will select /somewhere/path.php to path
varible. Looks good but it cannot be used, when you will check
real path. Using file:///etc/passwd is correct but between
file:// and /etc/passwd, php_url_parse_ex() will select host and
return path to /passwd.

Tested in PHP 5.2.4 and PHP 5.2.5 (FreeBSD 6.2R)

cxib# php -v
PHP 5.2.5 with Suhosin-Patch 0.9.6.2 (cli) (built: Dec 10 2007
19:54:41) (DEBUG)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies

- --- 2. Exploit ---
SecurityReason will not public official exploit for this issue.
But it is possible to read file from another directories like
/etc/passwd.

- --- 3. How to fix ---
CVS

http://cvs.php.net/viewcvs.cgi/php-src/NEWS?revision=1.2027.2.547
.2.1047&view=markup

- ---
Fixed a safe_mode bypass in cURL identified by Maksymilian
Arciemowicz.
- ---

- --- 4. Greets ---
sp3x, Infospec, p_e_a, schain, l5x and iliaa

- --- 5. Contact ---

Author: SecurityReason [ Maksymilian Arciemowicz ( cXIb8O3 ) ]
Email: cxib [at] securityreason [dot] com
GPG: http://securityreason.pl/key/Arciemowicz.Maksymilian.gpg
[NEW KEY]
GPG: http://securityreason.pl/key/Arciemowicz.Maksymilian.gpg.old
[OLD KEY]
http://securityreason.com
http://securityreason.pl

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (FreeBSD)

iD8DBQFHlnuFW1OhNJH6DMURAl3gAJ9qkpoJ1D0IPxP7khHgcUKyRaZtZACfS6Av
GNPBDDnU6J2LQEaUb7gT/18=
=WWl5
-----END PGP SIGNATURE-----


Alert

*BSD libc (strfmon) Multiple vulnerabilities

high- 2008-03-25

Maksymilian Arciemowicz discovered a Integer Overflow vulnerability in the libc library "strfmon()" function.A vulnerability could allow an attacker who successfully exploits this vulnerability to take control of the affected *BSD systems.

Apache rss

» Apache-SSL memory
   disclosure

» Apache mod_negotiation
   Xss and Http Response
   Splitting

» Apache (mod_status)
   Refresh Header - Open
   Redirector (XSS)

» Apache (mod_proxy_ftp)
   Undefined Charset UTF-7
   XSS Vulnerability

PHP rss

» PHP 5.2.5 and prior :
   *printf() functions
   Integer Overflow

» PHP 5.2.5 cURL safe_mode
   bypass

» PHP 5.2.4
   mail.force_extra_paramete
   rs unsecure

» PHP <= 5.2.5
   stream_wrapper_register()
   Denial of service

Copyright © SecurityReason. All Rights Reserved.