Пытаются взломать? Странные запросы mySQL

P
На сайте с 21.01.2012
Offline
72
5216

Пытаются взломать? Судя по логам "попытки" начались пару часов назад. В 23:20 попытался обновить сайт - а он лежит. В мускуле увидел кучу зависших процессов, а в логах медленных запросов такое:

# User@Host: @ localhost []
# Query_time: 5060.651570 Lock_time: 0.000149 Rows_sent: 0 Rows_examined: 1013
SET timestamp=1426191857;
SELECT member_id FROM members WHERE LOWER(name)="if(now()=sysdate(),sleep(0),0)/-3246" or 4531=if((42=42),sleep(5),4531) and "mkmf"="mkmf'xor(if(now()=sysdate(),sleep(0),0))or'"xor(if(now()=sysdate(),sleep(0),0))or"/";

т.е. куча запросов выполнялась больше 5000 секунд!

А вот это увидел в логах форума (стоит мост между вп и ипб):

Date: Thu, 12 Mar 2015 18:57:32 +0000
Error: 0 -
IP Address: 5.19.210.207 - /wp-login.php
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
UNION query joins are not allowed.
Add \ipsRegistry::DB()->allow_sub_select=1; before any query construct to allow them

Date: Thu, 12 Mar 2015 18:51:14 +0000
Error: 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''xor(if(now()=sysdate(),sleep(0),0))or'"xor(if(now()=sysdate(),sleep(0),0))or"/"' at line 1
IP Address: 5.19.210.207 - /wp-login.php
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
mySQL query error: SELECT member_id FROM members WHERE LOWER(name)="if(now()=sysdate(),sleep(0),0)/'fivq<'">tdim'xor(if(now()=sysdate(),sleep(0),0))or'"xor(if(now()=sysdate(),sleep(0),0))or"/"

Вопрос: Что это может быть такое? Пытаются или, может быть, уже нашли какую-то дырку или же просто хотели положить сайт? Почему запросы в мускуле висели 5000 сек. - это вообще ад

N
На сайте с 06.05.2007
Offline
419
#1

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

Кнопка вызова админа ()
P
На сайте с 21.01.2012
Offline
72
#2

Так а почему уже взломали?

Все запросы идут на wp-login, запрос который висел 5000 сек:

SELECT member_id FROM members WHERE LOWER(name)="if(now()=sysdate(),sleep(0),0)/-3246" or 4531=if((42=42),sleep(5),4531) and "mkmf"="mkmf'xor(if(now()=sysdate(),sleep(0),0))or'"xor(if(now()=sysdate(),sleep(0),0))or"/";

Используется "мостом" т.е. при попытке залогиниться на сайте Wordpress, идет поиск пользователя в базе IPB. Единственное, как я понимаю, вместо логина человек подставлял

"if(now()=sysdate(),sleep(0),0)/-3246" or 4531=if((42=42),sleep(5),4531) and "mkmf"="mkmf'xor(if(now()=sysdate(),sleep(0),0))or'"xor(if(now()=sysdate(),sleep(0),0))or"/"

В результате чего бд начинала тупить. Разве я не прав?

---------- Добавлено 13.03.2015 в 02:39 ----------

Вообще такого куча:

# User@Host: @ localhost []

# Query_time: 4962.395250 Lock_time: 0.000079 Rows_sent: 0 Rows_examined: 993
SET timestamp=1426191857;
SELECT member_id FROM members WHERE LOWER(email)="if(now()=sysdate(),sleep(0),0)/-4366" or 4172=if((7136>7135),sleep(5),4172) and "cfdn"="cfdn'xor(if(now()=sysdate(),sleep(0),0))or'"xor(if(now()=sysdate(),sleep(0),0))or"/";
# User@Host: @ localhost []
# Query_time: 4992.429271 Lock_time: 0.000078 Rows_sent: 0 Rows_examined: 999
SET timestamp=1426191857;
SELECT member_id FROM members WHERE LOWER(email)="if(now()=sysdate(),sleep(0),0)/-5959" or 8546=if((93=93),sleep(5),8546) and "drxz"="drxz'xor(if(now()=sysdate(),sleep(0),0))or'"xor(if(now()=sysdate(),sleep(0),0))or"/";
# User@Host: @ localhost []
# Query_time: 5030.604401 Lock_time: 0.000249 Rows_sent: 0 Rows_examined: 1007
SET timestamp=1426191857;
SELECT member_id FROM members WHERE LOWER(name)="if(now()=sysdate(),sleep(0),0)/-9988" or 8426=if((5623>5622),sleep(5),8426) and "xjna"="xjna'xor(if(now()=sysdate(),sleep(0),0))or'"xor(if(now()=sysdate(),sleep(0),0))or"/";
# User@Host: @ localhost []
# Query_time: 5091.581603 Lock_time: 0.000167 Rows_sent: 0 Rows_examined: 1019
SET timestamp=1426191857;
SELECT member_id FROM members WHERE LOWER(name)="if(now()=sysdate(),sleep(0),0)/-5987" or 9096=if((30=30),sleep(5),9096) and "piht"="piht'xor(if(now()=sysdate(),sleep(0),0))or'"xor(if(now()=sysdate(),sleep(0),0))or"/";

Тут просто какие то условия бредовые, я не понимаю.

L
На сайте с 07.12.2007
Offline
351
#3
Preci:
Пытаются взломать?

SQL-инъекцию проводят. У вас переменные name и email не экранируется при передаче в MySQL в LOWER(name)="...неэкранированная переменная...". Вы пропускаете в запрос одинарные и двойные кавычки. Скоро сломают, если не уже.

Перед подстановкой в sql-запрос все данные(прислылаемые пользователем) должны обрабатываться по mysql_real_escape_string для PHP 4.

На PHP 5 лучше использовать библиотеки MySQLi или PDO_MySQL.

PS: И не лишне пользовательский ввод чистить регуляркой или фильтром типа if (filter_var($email, FILTER_VALIDATE_EMAIL)) от недопустимых символов. В Имени/email-е допустимы букво-цифры, '@._-', там нечего делать символам ()/, ПРОБЕЛУ и особенно - кавычкам " '.

Хотя, если честно - в email много чего допустимо по RFC...

Также, переменные надо ограничивать/проверять по длине. У вас есть размер для полей name/email в БД, а вам сейчас пихают 167 символов в запросе:

SELECT member_id FROM members WHERE LOWER(email)="if(now()=sysdate(),sleep(0),0)/-5959" or 8546=if((93=93),sleep(5),8546) and "drxz"="drxz'xor(if(now()=sysdate(),sleep(0),0))or'"xor(if(now()=sysdate(),sleep(0),0))or"/"
P
На сайте с 21.01.2012
Offline
72
#4

Я связался с автором моста и он ответил:

this SQL injection uses the IPBWI function name2id located in \member.inc.php

Unfortunately, IP.board 3 does not support prepared statements, so you should harden this query by yourself, using your own prepared-statement class or additional filtering. As IPBWI API is opensource, there are no limits for you in hardening this query. You can set an alternative path to your custom IPBWI class directory on WordPress' IPBWI core settings.

Функция:

public function name2id($names){

if(is_array($names)){
foreach($names as $i => $j){
$sql = $this->ipbwi->ips_wrapper->DB->query('SELECT member_id FROM '.$this->ipbwi->board['sql_tbl_prefix'].'members WHERE LOWER(name)="'.$this->ipbwi->ips_wrapper->DB->addSlashes($this->ipbwi->makeSafe(strtolower(trim($names)))).'"');
if($row = $this->ipbwi->ips_wrapper->DB->fetch($sql)){
$ids[$i] = $row['member_id'];
}else{
$ids[$i] = false;
}
}
return $ids;
}else{
$sql = $this->ipbwi->ips_wrapper->DB->query('SELECT member_id FROM '.$this->ipbwi->board['sql_tbl_prefix'].'members WHERE LOWER(name)="'.$this->ipbwi->ips_wrapper->DB->addSlashes($this->ipbwi->makeSafe(strtolower(trim($names)))).'"');
if($row = $this->ipbwi->ips_wrapper->DB->fetch($sql)){
return $row['member_id'];
}else{
return false;
}
}
}

После:

public function name2id($names){

Пытаюсь добавить:

$names = strip_tags($names);

$names = htmlspecialchars($names);
$names = mysql_real_escape_string($names);

Но результата никакого нет... Может, есть какие-то хуки для Wordpress, что бы при попытке залогиниться Wordpress удалял плохие символы из логина, а затем уже логин "чистым" уйдет в "мост"?

---------- Добавлено 13.03.2015 в 16:50 ----------

Вообщем автор плагина что-то нашаманил, теперь при использовании логина if(now()=sysdate(),sleep(0),0)/-3246" or 4531=if((42=42),sleep(5),4531) and "mkmf"="mkmf'xor(if(now()=sysdate(),sleep(0),0))or'"xor(if(now()=sysdate(),sleep(0),0))or"/

Wordpress пишет ERROR: Invalid username.

Ошибка была в файле ips_wrapper.inc.php

Надо заменить строку

$sql = $this->DB->query('SELECT member_id FROM '.$this->settings['sql_tbl_prefix'].'members WHERE LOWER(name)="'.strtolower(trim($_POST['log'])).'"');

На

$sql = $this->DB->query('SELECT member_id FROM '.$this->settings['sql_tbl_prefix'].'members WHERE LOWER(name)="'.$this->DB->addSlashes(strtolower(trim($_POST['log']))).'"');

Тему можно закрывать

L
На сайте с 07.12.2007
Offline
351
#5
Preci:
Пытаюсь добавить:...

Для быстрой ручной заплатки можно было сделать что-то вроде:

$names = str_replace( array('"', "'", '/', '('), '', $names);

или регуляркой. Но автор плагина сделал грамотнее.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий