Это делает предположение о своего рода 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 иллюстрирует это лучше, чем я могу.
Именно то, что я искал. Благодаря! –
Следует отметить, что не каждая база данных допускает стекирование запросов. Например, mysql5 представил его, но mysql_query() все еще принимает только 1 запрос. – rook