Lucene search

K
seebugRootSSV:3465
HistoryJun 23, 2008 - 12:00 a.m.

PHP 5 'posix_access()'函数'safe_mode'绕过目录遍历漏洞

2008-06-2300:00:00
Root
www.seebug.org
12

0.005 Low

EPSS

Percentile

72.5%

BUGTRAQ ID: 29797
CVE ID:CVE-2008-2665
CNCVE ID:CNCVE-20082665

PHP 5是一款开放源代码的网络编程语言。
PHP 5 'posix_access()'存在’safe_mode绕过问题,远程攻击者可以利用漏洞访问WEB ROOT目录之外的数据,导致敏感信息泄漏。

问题代码如下:


PHP_FUNCTION(posix_access)
{
long mode = 0;
int filename_len, ret;
char *filename, *path;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &filename,
&filename_len, &mode) == FAILURE) {
RETURN_FALSE;
}

path = expand_filepath(filename, NULL TSRMLS_CC);

if (!path) {
POSIX_G(last_error) = EIO;
RETURN_FALSE;
}

if (php_check_open_basedir_ex(path, 0 TSRMLS_CC) ||
(PG(safe_mode) && (!php_checkuid_ex(filename, NULL,
CHECKUID_CHECK_FILE_AND_DIR, CHECKUID_NO_ERRORS)))) {
efree(path);
POSIX_G(last_error) = EPERM;
RETURN_FALSE;
}

ret = access(path, mode);
efree(path);

if (ret) {
POSIX_G(last_error) = errno;
RETURN_FALSE;
}

RETURN_TRUE;
}


var_dump(posix_access("http://…/…/…/etc/passwd"))==True
var_dump(posix_access("/etc/passwd"))==False

因为path = expand_filepath(filename, NULL TSRMLS_CC);会更改"http://…/…/…/etc/passwd" to path=/etc/passwd。

(PG(safe_mode) && (!php_checkuid_ex(filename, NULL,
CHECKUID_CHECK_FILE_AND_DIR, CHECKUID_NO_ERRORS)))会检查实际路径"http://…/…/…/etc/passwd"。http://用于php_checkuid_ex()函数中,因此safe_mode可绕过。

PHP 5.2.6
目前没有解决方案提供:
<a href=“http://www.php.net/” target=“_blank”>http://www.php.net/</a>