Использование комментов для упрощения SQL инъекций

Правильное завершение запроса — это основная проблема, с которой может столкнуться атакующий во время тестирования. Инъекция не должна ломать sql запрос, и значит что часть следующая за инъекцией, тоже должна быть валидна. В этой статье разберем, как комментарии смогут отбросить концовку запроса, следующую за инъекцией, для упрощения атаки.

Синтаксис комментариев

Прежде чем перейти к главной теме статьи, давай разберем синтаксис комментариев для разных баз данных.

Синтаксис MySQL MSSQL Oracle PostgreSQL Комментарий
— Comment + + + + Используется для комментирования всей оставшейся часть линии запроса. В MySQL обязательно должен следовать какой-либо символ или пробел
# Comment + Так же комментирует оставшуюся часть строки запроса. В отличии от «—» нет необходимости вставлять символ после «#»
/* Comment */ + + + +  C-подобные комментарии позволяют делать много строчные комментарии. Это тип комментариев редко используется при sql инъекциях, но он может быть полезен в некоторых редких случаях, которые описаны в конце статьи.  Если комментарий будет не закрыт, sql запрос завершится ошибкой.

Завершение запроса

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

Скрипт:

Инъекция:

Сформированный запрос:

Линейный комментарий убирает последнее условие и даже нет необходимости обрабатывать закрывающую кавычку. Такого же результата можно было бы добить и без комментариев, но это было бы немного сложнее. Большую пользую этот вид атаки принесет при более сложных запросах. Например, если используются группировки GROUP BY, условия HAVING . и т.д. А так же, когда инъекция внедряется в какие-то подзапросы.

Блочные комментарии

Последняя ситуация, когда комментарии могу упростить проведение атаки, это случай, когда в одном запросе используется несколько уязвимых параметров. В данном случае, удобно использовать блочные С-подобные комменты, для исключения части запроса. Пример:

Скрипт:

Инъекция:

Запрос:

Как и упоминалось ранее, данный способ редко используется в реальных случаях. Однако, это может быть полезно что бы упростить следующие ситуации:

  • Когда другие комментарии использовать не получается. Например, двойное тире фильтруется приложением.
  • Когда невозможно использовать серию запросов
  • Когда невозможно использовать UNION SQL инъекции

Есть что написать?