2010-06-01 4 views
2

Я немного знаю о SQL-инъекциях и расшифровке URL-адресов, но может ли кто-то, кто больше разбирается в этом вопросе, по-моему, взглянуть на следующую строку и рассказать мне, что именно она пытается сделать?Ошибка SQL-инъекции на моем сервере

Несколько детей из Пекина пару недель назад попробовали несколько инъекций, как показано ниже.

% 27% 20and% 20char (124)% 2Buser% 2Bchar (124) = 0% 20and% 20% 27% 27% = 27

ответ

4

Это делает предположение о своего рода SQL заявления о том, что данные формы подставляются в, и предполагая, что он будет плохо дезинфицирован на каком-то этапе по дороге. Рассмотрим программу разговора с сервером SQL (CISH код чисто для примера):

fprintf(sql_connection, "SELECT foo,bar FROM users WHERE user='%s';"); 

Однако, с помощью данной строки, сервер SQL видит:

SELECT foo,bar FROM users WHERE user='' and char(124)+user+char(124)=0 and ''=''; 

Упс! Это было не то, что вы намеревались. Что будет дальше, зависит от базы данных и от того, есть ли у вас подробные сообщения об ошибках.

Общеизвестно, что ленивые веб-разработчики могут предоставлять подробные сообщения об ошибках безоговорочно для всех клиентов и не отключать их. (Мораль: только включить подробные отчеты об ошибках для очень жесткой доверенной сети, если это вообще возможно.) Такой отчет об ошибке обычно содержит некоторую полезную информацию о структуре базы данных, которую злоумышленник может использовать, чтобы выяснить, куда идти дальше.

Теперь рассмотрите имя пользователя '; DESCRIBE TABLE users; SELECT 1 FROM users WHERE 'a'='. И так оно продолжается ... Здесь существует несколько разных стратегий, в зависимости от того, как именно данные выходят. Существуют инструменты SQL-инъекций, которые могут автоматизировать этот процесс и попытаться автоматически выгрузить все содержимое базы данных через незащищенный веб-интерфейс. Rafal Los's blog post содержит немного больше технических знаний.

Вы не ограничены только кражей данных; если вы можете вставить произвольный SQL, ну, obligatory xkcd reference иллюстрирует это лучше, чем я могу.

+0

Именно то, что я искал. Благодаря! –

+1

Следует отметить, что не каждая база данных допускает стекирование запросов. Например, mysql5 представил его, но mysql_query() все еще принимает только 1 запрос. – rook

2

Вы найдете подробную информацию здесь:

http://blogs.technet.com/b/neilcar/archive/2008/03/15/anatomy-of-a-sql-injection-incident-part-2-meat.aspx

Эти линии дважды закодирован - The первый набор кодированных символов, которая будет переведена на IIS, являются обозначается% XX. Например,% 20 представляет собой пространство . Второй набор не предназначен для перевода до тех пор, пока он не достигнет SQL Server, и они используют функцию char (xxx) в SQL.

+0

Я знаком с char(). На что это нацеливается? –

2
' and char(124)+user+char(124)=0 and ''=' 

это strange..however, убедитесь, что вы убегаете строки, так что не будет никаких SQL инъекций

+0

Все это было дезинфицировано классом, прежде чем он попал в базу данных, поэтому я уверен, что ничего не получилось. –

+0

хорошая работа, вам не о чем беспокоиться тогда :) – 2010-06-01 20:27:33

+0

Я все еще хотел бы это понять :) –

2

Другие люди осветили, что происходит, поэтому я собираюсь сделать минутку, чтобы залезть на свою лошадь с высокой лошадью, и настоятельно рекомендую, чтобы, если вы еще не (я не подозреваю, что не из комментария ниже), что вы использовать параметризованные запросы.Они буквально делают вас неуязвимыми для SQL-инъекций, потому что они вызывают параметры и запрос, которые будут передаваться полностью отдельно. Существуют также потенциальные преимущества в производительности, yadda yadda и т. Д.

Но серьезно, сделайте это.