关于最近的几个open_basedir绕过漏洞

Published on 2006 - 08 - 23
    <p>PHP 5.1.5 在8.17号发布了,修补了几个绕过open_basedir的漏洞,我们一个个来看:<br /><br />Quote form <a href="http://www.php.net/release_5_1_5.php">http://www.php.net/release_5_1_5.php</a><br /></p>
    <hr />

Added missing safe_mode/open_basedir checks inside the error_log(), file_exists(), imap_open() and imap_reopen() functions.
Fixed possible open_basedir/safe_mode bypass in cURL extension and with realpath cache.



首先是error_log().奇怪的是,我对比了5.1.5和5.1.2的代码,并没有发现PHP_FUNCTION(error_log)以及PHPAPI int _php_error_log有任何改变.而且在 bugs.php.net 上没有search到任何关于此bug的报告.测试5.1.2的时候,也没发现error_log函数能绕过open_basedir的限制任意写文件.



Warning: error_log(): open_basedir restriction in effect. File(C:\err.txt) is not within the allowed path(s): (D:\phproot;D:\admin) in D:\phproot\test\error.php on line 2 Warning: error_log(C:\err.txt): failed to open stream: Operation not permitted in D:\phproot\test\error.php on line 2

<?
error_log("You messed up!", 3, "C:\err.txt");
?> 

其次是file_exists().这个漏洞很无聊.最多只能判断这个文件是否存在而已.无法做些有意义的动作.
有意思的是,在研究代码的时候,发现饶过open_basedir的不光是file_exists函数.在php源代码中,对大多数处理文件的函数组都使用了同一个宏:

FileFunction(PHP_FN(file_exists), FS_EXISTS)

然后FileFunction再调用 php_stat(Z_STRVAL_PP(filename), (php_stat_len) Z_STRLEN_PP(filename), funcnum, return_value TSRMLS_CC) 进行处理.所以同样的饶过漏洞也存在与同样使用此宏,并且返回值都是BOOL类型的is_executable,is_writeable,is_readable,is_dir,is_file,is_link函数.

imap_open()和imap_reopen()
这两个比较有意思,但是要求是必须要有imap扩展库,漏洞出在imap_open函数的第一个参数.如果把inbox替换为文件或目录,就能用imap相关函数对其进行处理.
http://bugs.php.net/bug.php?id=37265

cURL
没什么好说拉.securityreason已经贴出了详细的分析和POC,url贴出来,自己看吧 : )
http://securityreason.com/achievement_securityalert/39

Comments
Write a Comment