Материалы с мастер-класса по SQLi на Hackday#2

Собрав оставшиеся силы джедая после недельного пентеста в славном городе Київ, и после недолгой остановки в Москве на 8-9 часов, переместился я в культурную столицу нашей необъятной родины - Санкт-Петербург. В минувшие выходные в нем проходило мероприятие с громким названием "Hackday #2".

На мероприятии уже ближе к вечеру я провел мастер-класс по теме "Внедрение операторов SQL". "Велосипед" на этот раз не выдумывал (а его от меня там и не требовали), а просто воспользовался наработками, которые в свое время готовились для института МИФИ. Собственно, материалы мастер-класса, который по времени уместился в один час, представлены ниже.




Виртуальная машина использовалась прежняя, но с небольшими изменениями в контексте blind SQL Injection. Внесенные изменения позволили продемонстрировать быструю технику эксплуатации слепых SQL-инъекций – подбора одного символа в один запрос. Это возможно, если приложение использует приблизительно такой синтаксис:


Так, сопоставив возможные значения параметра id, передаваемого приложению, в данном случае методом GET, с самим контентом и наложив их на карту подбираемых символов становится возможным очень эффективно и за один запрос считывать данные из таблицы и/или файла, если существуют необходимые привилегии.

Proof of concept, реализующий эту идею:



Думаю по коду все становится прозрачно, потому комментировать не стану. Для демонстрации в старой среде просто были добавлены новые данные:



И т.д. Таким образом, было осуществлено сопоставление данных и возможность демонстрации быстрой техники эксплуатации blind SQL Injection.

4 комментария :

  1. Какой то у тебя огромный скрипт получился, у меня попроще: https://forum.antichat.net/showpost.php?p=1258163&postcount=2

    ОтветитьУдалить
  2. >> Какой то у тебя огромный скрипт получился
    просто демка, написанная за полчаса... доведу до ума...))

    >> у меня попроще
    кстати по поводу функции find_in_set. функция не различает регистр букв, поэтому для целей получения данных в разном регистре она не подходит:(

    select find_in_set((select 'a'),'A') - вернет 1

    ОтветитьУдалить
  3. Ошибаетесь, ведь
    select find_in_set((select 'A'),0x41); # вернет 1,
    а
    select find_in_set((select 'a'),0x41); # вернет 0

    ОтветитьУдалить
  4. однако.........
    и ведь:
    select find_in_set((select 'A'),'A'); # 1
    select find_in_set((select 'a'),'A'); # 1

    )) интересная особенность mysql... не знал. спасибо!

    ОтветитьУдалить