инъекционная атака (я думал, что я был защищен!) <? php / ** / eval (base64_decode (везде) - PullRequest
6 голосов
/ 29 апреля 2010

У меня есть полностью настраиваемый сайт PHP с большим количеством вызовов базы данных. Я только что получил инъекцию. Этот небольшой кусок кода ниже обнаружился на десятках моих PHP-страниц.

<?php /**/ eval(base64_decode(big string of code....

Я был довольно осторожен с моими вызовами SQL и тому подобным; все они в этом формате:

$query = sprintf("UPDATE Sales SET `Shipped`='1', `Tracking_Number`='%s' WHERE ID='%s' LIMIT 1 ;",  
 mysql_real_escape_string($trackNo),
 mysql_real_escape_string($id)); 
 $result = mysql_query($query);  
 mysql_close();

Для записи я редко использую mysql_close() в конце, хотя. Это просто код, который я схватил. Я не могу вспомнить ни одного места, где бы я не использовал mysql_real_escape_string(), (хотя я уверен, что, вероятно, есть пара. Я скоро поищу, чтобы выяснить это). Там также нет мест, где пользователи могут вставить пользовательский HTML или что-нибудь еще. Фактически, большинство доступных пользователю страниц, если они вообще используют вызовы SQL, почти неизбежно являются SELECT * FROM страницами, которые используют GET или POST, в зависимости.

Очевидно, мне нужно усилить свою безопасность, но у меня никогда не было подобных атак, и я не уверен, что мне следует делать. Я решил наложить ограничения на все свои данные и проверить, не пропустил ли я где-нибудь mysql_real_escape_string. У кого-нибудь еще есть предложения?

Кроме того, что делает этот тип кода? Почему это там?

Ответы [ 4 ]

5 голосов
/ 29 апреля 2010

На самом деле инъекция SQL - не единственный тип атаки, которой может подвергаться ваш сервер.

И эта атака не выглядит как инъекция SQL.

В большинстве случаев этопросто троянский конь на вашем ПК, крадущий пароль FTP.

, чтобы увидеть реальный код, замените eval на echo.Но я сомневаюсь, что в этом есть что-то интересное

5 голосов
/ 29 апреля 2010

Это могло быть вызвано любой распространенной атакой, которая скомпрометировала сервер.

Обычно это вызвано LFI (локальным включением файлов), но может быть вызвано чем угодно.

Вы можете узнать больше о LFI из:

http://labs.neohapsis.com/2008/07/21/local-file-inclusion-%E2%80%93-tricks-of-the-trade/

Надеюсь, это поможет (немного)

3 голосов
/ 29 апреля 2010

Несколько быстрых советов:

  • Используйте правильные типы данных перед переменными, такие как intval для чисел в ваших запросах
  • Используйте mysql_real_escape_string для строк в ваших запросах
  • Использовать подготовленные заявления

Ресурс:

См. Руководство по SQL-инъекциям на php.net

1 голос
/ 29 апреля 2010

Я бы посмотрел на остальную часть сервера. MySQL не может изменить / перезаписать файлы для вас. Можно сделать так, чтобы он отправлял вывод в файл («SELECT ... INTO OUTFILE ...»), но есть меры безопасности, которые не позволяют перезаписать файл, который уже существует. Самое большее, SQL-инъекция изменит некоторые ваши данные или изменит запрос, чтобы получить результат, отличный от ожидаемого.

Проверьте, что кто-то проник на ваш сервер, перебрав системную учетную запись путем сканирования SSH или даже компрометации SSH. Если вы находитесь на общем сервере, вполне возможно, что сайт кого-то ELSE был взломан, и атака просто заразила каждый найденный им PHP-файл.

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