GaRY's Blog

Beginning is always beautiful

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

PHP 5.1.5 在8.17号发布了,修补了几个绕过open_basedir的漏洞,我们一个个来看:

Quote form http://www.php.net/release_5_1_5.php


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

posted on 2006-08-23 20:38 wofeiwo 阅读(800) 评论(0)  编辑 收藏 引用 网摘 所属分类: PHP security


只有注册用户登录后才能发表评论。
网站导航:

导航

<2006年8月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

统计

留言簿(10)

随笔分类(90)

随笔档案(61)

搜索

最新随笔

最新评论