author: 80vul-B
team:http://www.80vul.com
date:2009-05-27
updata:2009-6-19
—————–updata—————————————
昨天php5.2.10出来了,fix了PCH-006里提到的bug:
Fixed bug #45997 (safe_mode bypass with exec/system/passthru (windows only))
然而遗憾的是还有问题,看看php是咋fix这个的:
…
b = strrchr(cmd, PHP_DIR_SEPARATOR);
#ifdef PHP_WIN32
if (b && *b == ‘\\’ && b == cmd) {
// 注意标红的代码:p
php_error_docref(NULL TSRMLS_CC, E_WARNING, “Invalid absolute path.”);
goto err;
}
#endif
…
恩,fix后执行exec(‘\dir’)会报错,但是exec(’80vul\b\dir’)依旧会执行:)
PoC:
—————————————————————–
一 前言
就在昨天milw0rm上公布了一个非常有意思的漏洞:PHP <= 5.2.9 Local Safemod Bypass Exploit (win32).作者看到公告后,在php源代码基础上分析了下这个问题的根本原因,于是就有本文.
二 描叙
在php手册了有一节: 给出了受安全模式影响的一些函数如:
backtick operator 本函数在安全模式下被禁用。
shell_exec()(在功能上和 backticks 函数相同) 本函数在安全模式下被禁用。
exec() 只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用 ..。escapeshellcmd() 将被作用于此函数的参数上。
system() 只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用 ..。escapeshellcmd() 将被作用于此函数的参数上。
passthru() 只能在 safe_mode_exec_dir 设置的