Он делает предположение о виде оператора 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, которые могут автоматизировать этот процесс и пытаться автоматически выгружать все содержимое базы данных через незащищенный веб-интерфейс. Сообщение в блоге Рафаля Лоса содержит немного больше технической информации.
Вы не ограничены кражей данных; если вы можете вставить произвольный SQL, то обязательная ссылка xkcd иллюстрирует это лучше, чем я.