Перейти к контенту

Показ ошибок SQL запросов - помощь взломщику?


Рекомендуемые сообщения

Есть такой тип взлома форумов как SQL Injection. На человеческом языке это называется внедрение вредоносного кода в запрос, в результате чего злоумышленник может или вывести из строя форум, или получить некоторую важную информацию для дальнейшего взлома.

 

На самом деле то что вываливается при ошибке базы в IPB на экран нужно только администратору форума. Согласитесь, что для простого пользователя это совершенно не нужная информация, с другой стороны для злоумышленника это возможность посмотреть на полный запрос, вызвавший ошибку, и составить на его основе вредоносный запрос.

 

Как будем избавлятся от излишней информативности IPB при ошибках базы?

Очевидно, что нужно запретить IPB выдавать расширенное сообщение об ошибке, заменив его чем то вроде: "Возникли некоторые проблемы в работе форума. Попробуйте зайти позже." Но как быть администратору форума, ему то нужно знать где и из-за чего произошла ошибка!?! Мы поступим просто, будем высылать сообщение об ошибке на некоторый администраторский e-mail, с детальной информацией о ней.

 

Ну что ж приступим.

Открываем файл: /sources/Drivers/mySQL.php

 

В самом его начале после строчки

<?php

добавляем

error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING);

это нам позволит избавится от ругани PHP если сервер база отвалится, или еще какая гадость случится.

 

Далее заменяем строчки:

        if ( !mysql_select_db($this->obj['sql_database'], $this->connection_id) )
        {
            echo ("ERROR: Cannot find database ".$this->obj['sql_database']);
        }

на

        if (!$this->connection_id)
        {    
             $this->fatal_error('ERROR: Link-ID == false, connect failed');
             return false;
        }  
   
        if ( !mysql_select_db($this->obj['sql_database'], $this->connection_id) )
        {
             $this->fatal_error("ERROR: Cannot find database ".$this->obj['sql_database']);
             return false;            
        }

таким образом мы отлавливаем ошибки возникающие при коннекте к серверу базы (первый if) и ошибки при выборе базы форума на сервере (второй if)

 

Находим строчки:

    $the_error .= "\n\nmySQL error: ".mysql_error()."\n";
    $the_error .= "mySQL error code: ".$this->error_no."\n";
    $the_error .= "Date: ".date("l dS of F Y h:i:s A");
     
    $out = "<html><head><title>Invision Power Board Database Error</title>
    <style>P,BODY{ font-family:arial,sans-serif; font-size:11px; }</style></head><body>
     <br><br><blockquote><b>There appears to be an error with the {$INFO['board_name']} database.</b><br>
    You can try to refresh the page by clicking <a href=\"javascript:window.location=window.location;\">here</a>, if this
    does not fix the error, you can contact the board administrator by clicking <a href='mailto:{$INFO['email_in']}?subject=SQL+Error'>here</a>
    <br><br><b>Error Returned</b><br>
    <form name='mysql'><textarea rows=\"15\" cols=\"60\">".htmlspecialchars($the_error)."</textarea></form><br>We apologise for any inconvenience</blockquote></body></html>";
         
    
        echo($out);
        die("");

удаляем их, теперь IPB об ошибках будет молчать как партизан. Частично задача решена, продолжаем дальше.

 

Там же заменим строчки:

    if ($this->return_die == 1)
    {
         $this->error    = mysql_error();
         $this->error_no = mysql_errno();
         $this->failed   = 1;
         return;
    }

на

    $this->error    = mysql_error();
    $this->error_no = mysql_errno();
     
    if ($this->return_die == 1)
    {
         $this->failed   = 1;
         return;
    }

 

а ниже этих строк добавим

    $message  = "Database error in:\r\n{$the_error}\r\n\r\n"; 
    $message .= 'mySQL error: ' . $this->error . "\r\n\r\n";
    $message .= 'mySQL error number: ' . $this->error_no . "\r\n\r\n";
    $message .= 'Script URI: '. $_SERVER['REQUEST_URI'] . "\r\n";  
    $message .= 'Date: ' . date('l dS of F Y h:i:s A') . "\r\n";
    $message .= 'IP Address: ' . $_SERVER['REMOTE_ADDR'] . "\r\n";
 
    $mail_headers  = "From: \"".$INFO['email_tech']."\" <".$INFO['email_tech'].">\n";
    $mail_headers .= "To: ".$INFO['email_tech']."\n";  
    $mail_headers .= "Subject: Database error!\n";  
    $mail_headers .= "Content-Type: text/plain; charset=\"windows-1251\"\n";
    $mail_headers .= "X-Priority: 3\n";
    $mail_headers .= "X-Mailer: IPB PHP Mailer\n";  
 
    @mail ($INFO['email_tech'], 'Database error!', $message , $mail_headers);

    echo "<html><head><title>System Error</title>";
    echo "</head>\r\n";
    echo "<body>\r\n";
    echo "<b>Возникли некоторые проблемы в работе форума.</b><br />\r\n";
    echo "Попробуйте зайти позже. Либо нажмите кнопку<a href=\"javascript:window.location=window.location;\">обновить</a> в вашем браузере.";
    echo "<p>Приносим извинения за причиненные неудобства.</p>";
    echo "\r\n\r\n</body></html>";
    exit;

 

файл mySQL.php готов к дальнейшему использованию. Осталось только внести изменения в файл ./conf_global.php

 

после строчки

$INFO['email_out']='admin@domain.com';

добавим

$INFO['email_tech']='tech_admin@domain.com';

e-mail адреса не забудьте поменять на свои =)

параметр email_tech прописывает ящик на который будут кидаться сообщения об ошибках базы.

 

вот вроде бы и все.

Ссылка на комментарий
Поделиться на других сайтах

  • Ответы 62
  • Создана
  • Последний ответ

Лучшие авторы в этой теме

Лучшие авторы в этой теме

Fastserg

А так же не мешало бы видеть сам запрос, который мог вызвать сбой...

Так это же $the_error (текст запроса, который в textarea в стандарте отображается) и есть.

Ссылка на комментарий
Поделиться на других сайтах

а й меня как обычно не все слава богу

Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of [runtime function name](). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. in /usr/clients/lalala/www/sources/Topics.php on line 798

 

от така бяка

строка в которой ругаеться

// Get the member info. We parse the data and cache it.
// It's likely that the same member posts several times in
// one page, so it's not efficient to keep parsing the same
// data
                        
                        if ($row['author_id'] != 0)
                        {
                                // Is it in the hash?
                                if ( isset($cached_members[ $row['author_id'] ]) )
                                {
                                        // Ok, it's already cached, read from it
                                        $poster = $cached_members[ $row['author_id'] ];
                                        $row['name_css'] = 'normalname';
                                }
                                else
                                {
                                        $row['name_css'] = 'normalname';
                       798  --->>  $poster = $this->parse_member( &$row );
                                        // Add it to the cached list
                                        $cached_members[ $row['author_id'] ] = $poster;
                                }

Ссылка на комментарий
Поделиться на других сайтах

Vanish

допустим произошла SQL ошибка, например, Too many connections. Она возникла одновременно допустим у 100 человек. И чего все эти 100 писем админу пошлются?

Ссылка на комментарий
Поделиться на других сайтах

все 100 и пошлются, хотя от настроек мылсервера зависит, хотя если у вас выпадает Too many connections то все 100 =)
Ссылка на комментарий
Поделиться на других сайтах

народ, в моем вопросе у кого руки растут не оттуда ? ошибка то вроде php.ini мне нужно знать кого пинать в данном варианте ... хотя я решился на апдейт своей единицы.
Ссылка на комментарий
Поделиться на других сайтах

Vanish

единица 1.1.1 но по идее

 

If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file.

версия тут не при чем.

Ссылка на комментарий
Поделиться на других сайтах

а точно, я просто сижу запаренный...

$poster = $this->parse_member( &$row );

все дело в амперсанде перед $row, попробуй убрать. Но проблема через хостера решаться должна.

Ссылка на комментарий
Поделиться на других сайтах

допустим произошла SQL ошибка, например, Too many connections. Она возникла одновременно допустим у 100 человек. И чего все эти 100 писем админу пошлются?

тогда можно составить список подобных ошибок, о которых админ не будет узнавать :D

Ссылка на комментарий
Поделиться на других сайтах

Vanish

Сейчас у меня только один вопрос, а это на IPB 2.0 работать будет?

Если нет, то если не составит большого труда, прошу переделать и под IPB 2.0, т.к. данная модификация является очень полезной :D

Ссылка на комментарий
Поделиться на других сайтах

  • 8 месяцев спустя...

Хороший мод. Но: если пользователей будет 1000 и соответственно мне придёт 1000 писем.

Не мог бы ты попровать его, чтобы письма не улетали, а все ошибки записывались в файл какой-нибудь, и потом можно было просто посмотреть(желательно через админку).

Ссылка на комментарий
Поделиться на других сайтах

  • 1 месяц спустя...
Сейчас я над этим занимаюсь :D[1115474217:1115477751]Уже есть некоторые наработки ;) инфа в логе примерно так будет выглядеть:
<?die('Your bunny wrote...')?>a%3A1%3A%7Bi%3A0%3Ba%3A2%3A%7Bs%3A5%3A%22ORIGN%22%3Bs%3A3552%3A%22YSUzQTUlM0ElN0JzJTNBNCUzQSUyMnRpbWUlMjIlM0JpJTNBMTExNTQ3NzY1NCUzQnMlM0E1JTNBJT
IyY2FjaGUlMjIlM0JOJTNCcyUzQTclM0ElMjJxdWVyaWVzJTIyJTNCaSUzQTUlM0JzJTNBMTAlM0ElMj
J
hZGRpdGlvbmFsJTIyJTNCYSUzQTQlM0ElN0JzJTNBNSUzQSUyMmxldmVsJTIyJTNCcyUzQTExJTNBJTI
y
cXVlcnkrZXJyb3IlMjIlM0JzJTNBNSUzQSUyMmVycm5vJTIyJTNCaSUzQTEwNjQlM0JzJTNBNSUzQSUy
M
mVycm9yJTIyJTNCcyUzQTY5JTNBJTIyWW91K2hhdmUrYW4rZXJyb3IraW4reW91citTUUwrc3ludGF4K
2
5lYXIrJTI3ZHNnZmhnZmhnamdoamhqJTI3K2F0K2xpbmUrMSUyMiUzQnMlM0ExMCUzQSUyMmFkZGl0aW
9
uYWwlMjIlM0JzJTNBMTUlM0ElMjJkc2dmaGdmaGdqZ2hqaGolMjIlM0IlN0RzJTNBNyUzQSUyMmZ1bGx
v
YmolMjIlM0JhJTNBOSUzQSU3QnMlM0ExMiUzQSUyMnNxbF9kYXRhYmFzZSUyMiUzQnMlM0E0JTNBJTIy
b
TByZyUyMiUzQnMlM0E4JTNBJTIyc3FsX3VzZXIlMjIlM0JzJTNBNCUzQSUyMm0wcmclMjIlM0JzJTNBO
C
UzQSUyMnNxbF9wYXNzJTIyJTNCcyUzQTUlM0ElMjIxMjM0NSUyMiUzQnMlM0E4JTNBJTIyc3FsX2hvc3
Q
lMjIlM0JzJTNBOSUzQSUyMmxvY2FsaG9zdCUyMiUzQnMlM0E4JTNBJTIyc3FsX3BvcnQlMjIlM0JzJTN
B
MCUzQSUyMiUyMiUzQnMlM0ExMCUzQSUyMnBlcnNpc3RlbnQlMjIlM0JzJTNBMSUzQSUyMjAlMjIlM0Jz
J
TNBMTQlM0ElMjJzcWxfdGJsX3ByZWZpeCUyMiUzQnMlM0E2JTNBJTIyaXBiMTNfJTIyJTNCcyUzQTE0J
T
NBJTIyY2FjaGVkX3F1ZXJpZXMlMjIlM0JhJTNBNSUzQSU3QmklM0EwJTNCcyUzQTcwMCUzQSUyMlNFTE
V
DVCttb2RlcmF0b3IubWlkK2FzK2lzX21vZCUyQyttb2RlcmF0b3IuYWxsb3dfd2FybiUyQyttLmlkJTJ
D
K20ubmFtZSUyQyttLm1ncm91cCUyQyttLnBhc3N3b3JkJTJDK20uZW1haWwlMkMrbS5yZXN0cmljdF9w
b
3N0JTJDK20udmlld19zaWdzJTJDK20udmlld19hdnMlMkMrbS52aWV3X3BvcCUyQyttLnZpZXdfaW1nJ
T
JDK20uYXV0b190cmFjayUyQyUwQSsrKysrKysrKysrKysrKysrKysrKysrKysrKysrK20ubW9kX3Bvc3
R
zJTJDK20ubGFuZ3VhZ2UlMkMrbS5za2luJTJDK20ubmV3X21zZyUyQyttLnNob3dfcG9wdXAlMkMrbS5
t
c2dfdG90YWwlMkMrbS50aW1lX29mZnNldCUyQyttLnBvc3RzJTJDK20uam9pbmVkJTJDK20ubGFzdF9w
b
3N0JTJDJTBBKysrKysrKysrKysrJTA5JTA5JTA5JTA5KyttLmxhc3RfdmlzaXQlMkMrbS5sYXN0X2Fjd
G
l2aXR5JTJDK20uZHN0X2luX3VzZSUyQyttLnZpZXdfcHJlZnMlMkMrbS5vcmdfcGVybV9pZCUyQyttLn
R
lbXBfYmFuJTJDK20uc3ViX2VuZCUyQytnLiUyQSUwQSsrKysrKysrKysrKyUwOSUwOSUwOSUwOSsrRlJ
P
TStpcGIxM19tZW1iZXJzK20lMEErKysrKysrKysrKyslMDklMDklMDklMDkrKysrTEVGVCtKT0lOK2lw
Y
jEzX2dyb3VwcytnK09OKyUyOGcuZ19pZCUzRG0ubWdyb3VwJTI5JTBBKysrKysrKysrKysrJTA5JTA5J
T
A5JTA5KysrK0xFRlQrSk9JTitpcGIxM19tb2RlcmF0b3JzK21vZGVyYXRvcitPTislMjhtb2RlcmF0b3
I
ubWVtYmVyX2lkJTNEbS5pZCtPUittb2RlcmF0b3IuZ3JvdXBfaWQlM0RtLm1ncm91cCslMjklMEErKys
r
KysrKysrKyslMDklMDklMDklMDkrK1dIRVJFK20uaWQlM0QxJTIyJTNCaSUzQTElM0JzJTNBNzUlM0El
M
jJERUxFVEUrRlJPTStpcGIxM19zZXNzaW9ucytXSEVSRStydW5uaW5nX3RpbWUrJTNDKzExMTU0NzQwN
T
Qrb3IrbWVtYmVyX2lkJTNEJTI3MSUyNyUyMiUzQmklM0EyJTNCcyUzQTI4MCUzQSUyMklOU0VSVCtJTl
R
PK2lwYjEzX3Nlc3Npb25zKyUyOGlkJTJDK21lbWJlcl9uYW1lJTJDK21lbWJlcl9pZCUyQytpcF9hZGR
y
ZXNzJTJDK2Jyb3dzZXIlMkMrcnVubmluZ190aW1lJTJDK2xvY2F0aW9uJTJDK2xvZ2luX3R5cGUlMkMr
b
WVtYmVyX2dyb3VwJTI5K1ZBTFVFUyslMjglMjc0MDc5MDAyMWE1NmFjMjFjNDc0NGMzMWQ5MTNkMjU3Z
C
UyNyUyQyslMjdOYXZpZ2F0b3IlMjclMkMrJTI3MSUyNyUyQyslMjcxMjcuMC4wLjElMjclMkMrJTI3TW
9
6aWxsYSUyRjMuMCslMjhXaW5kb3dzK05UKzUuMSUzQitVJTI5K09wZXJhKzcuMjMrKyU1QnJ1JTVEJTI
3
JTJDKyUyNzExMTU0Nzc2NTQlMjclMkMrJTI3JTJDJTJDJTI3JTJDKyUyNyUyNyUyQys0JTI5JTIyJTNC
a
SUzQTMlM0JzJTNBOTAlM0ElMjJVUERBVEUraXBiMTNfbWVtYmVycytTRVQrbGFzdF92aXNpdCUzRGxhc
3
RfYWN0aXZpdHklMkMrbGFzdF9hY3Rpdml0eSUzRCUyNzExMTU0Nzc2NTQlMjcrV0hFUkUraWQlM0QlMj
c
xJTI3JTIyJTNCaSUzQTQlM0JzJTNBMjIwJTNBJTIyU0VMRUNUK3MuJTJBJTJDK3QudGVtcGxhdGUlMkM
r
Yy5jc3NfdGV4dCUwQSsrKyslMDklMDklMDklMDklMDlGUk9NK2lwYjEzX3NraW5zK3MlMEErKysrJTA5
J
TA5JTA5JTA5JTA5KytMRUZUK0pPSU4raXBiMTNfdGVtcGxhdGVzK3QrT04rJTI4dC50bWlkJTNEcy50b
X
BsX2lkJTI5JTBBKysrKyUwOSUwOSUwOSUwOSUwOSsrTEVGVCtKT0lOK2lwYjEzX2NzcytjK09OKyUyOH
M
uY3NzX2lkJTNEYy5jc3NpZCUyOSUwQSsrKyslMDkrKysrKysrKysrKyUwOSsrK1dIRVJFK3MuZGVmYXV
s
dF9zZXQlM0QxJTIyJTNCJTdEcyUzQTUlM0ElMjJkZWJ1ZyUyMiUzQmklM0EwJTNCJTdEJTdE%22%3Bs%3A8%3A%22CHECKSUM%22%3Bs%3A32%3A%22f729e4aa256301c83d746c7796bda768%22%3B%7D%7D

[1115474217:1115479318]На одну ошибку — 4кб места, но это самый полный дамп состояния MySQL.[1115474217:1115479382]Если кто хочет, можете попробовать расшифровать этот кусок :)

Ссылка на комментарий
Поделиться на других сайтах

  • 1 месяц спустя...
Папки sources/drivers в 2.0.4 ( у меня правда стоит 2.1 Alpha 4 ) нету :D
Ссылка на комментарий
Поделиться на других сайтах

Чаще всего мод такую ошибку присылает:

Database error in:
mySQL query error: INSERT INTO ibf_sessions
(id,member_name,member_id,member_group,in_forum,in_topic,login_type,running_t
ime,location,ip_address,browser)
VALUES('google_session','GoogleBot','0','2','0','2338','','1119124913','ST,,','66.249.66.73','Mozilla/5.0 (compatible;
Googlebot/2.1; +http://ww')

mySQL error: Duplicate entry 'google_session' for key 1

mySQL error number: 1062

 

А вообще - полезно :D

Ссылка на комментарий
Поделиться на других сайтах

угу, я в своё время это обсуждал, никто не поверил :D

но что-то тему не нахожу

Ссылка на комментарий
Поделиться на других сайтах

  • 2 недели спустя...
Мне только что мегабайтовое письмо пришло, угадайте что за ошибка БД!?
Ссылка на комментарий
Поделиться на других сайтах

Нет:

mySQL error: Got a packet bigger than 'max_allowed_packet'

 

mySQL error number: 1153

 

Судя из запроса - кто-то додумался слишком-большую ПМку кому-то прислать! В 1.2 чтоли нету проверки на кол-во символов в ПМ? :D

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.