Статья [Blind SQL Injection] Хакаем portswigger Conditional Errors

Здравия желаю! В статье я пройдусь по лабе со . Надеюсь, у всех читающих эту статью стандартная тема Codeby. Это мощная статья

21743439_6505016.jpeg

План статьи:
  1. Докажем, что параметр уязвим
  2. Проверим существование базы данных
  3. Подтвердим наличие 'administrator' в базе
  4. Узнаём длину пароля, используя Burp как Хацкер (настаиваю на использовании Pro версии)
  5. Узнаём пароль, используя Burp как Хацкер

Нам сказано:
Код:
Результаты SQL-запроса не возвращаются, и приложение не реагирует каким-либо образом в зависимости от того, возвращает ли запрос какие-либо строки. Если SQL-запрос вызывает ошибку, приложение возвращает пользовательское сообщение об ошибке.

База данных содержит другую таблицу с именем users, столбцы которой называются username и password. Вам необходимо использовать уязвимость слепой SQL-инъекции, чтобы узнать пароль administrator пользователя.

Чтобы решить лабораторную работу, войдите в систему как administrator пользователь.
Записали нужное.

1689872831023.png


Зайдём на главную страницу сайта и используем Burp Suite для перехвата и изменения запроса, содержащего TrackingId файла cookie. Для простоты предположим, что исходное значение файла cookie равно TrackingId=xyz


1689921121363.png
Докажем что параметр уязвим:

  1. Измените TrackingId файл cookie, добавив к нему одинарные кавычки:
    Код:
    TrackingId=xyz'
    Убедитесь, что получено сообщение об ошибке.

  2. Теперь измените ее на две кавычки:
    Код:
    TrackingId=xyz''
    Убедитесь, что ошибка исчезла. Это говорит о том, что синтаксическая ошибка (в данном случае незакрытая кавычка) оказывает заметное влияние на ответ.

  3. Теперь вам нужно подтвердить, что сервер интерпретирует внедрение как SQL-запрос, т. е. что ошибка является синтаксической ошибкой SQL, в отличие от ошибок любого другого типа. Для этого сначала нужно создать подзапрос, используя допустимый синтаксис SQL. Попробуйте отправить:
    Код:
    TrackingId=xyz'||(SELECT '')||'
    Мы используем оператор конкатенации "||" для объединения значения "xyz'" с результатом пустого запроса "select '' ".

    1689881783220.png


    В этом случае обратите внимание, что запрос по-прежнему кажется недопустимым. Это значит что возможно используется база Oracle, т.к ей нужна какая та база, нельзя просто взять и достать из ничего. Это как я возьму и хочу захватить воздух в ладошках, а вот не получиться, либо дырки(SQL) либо я создаю вакум

    Код:
    TrackingId=xyz'||(SELECT '' FROM dual)||'
    Теперь всё работает.

    1689881804459.png
    • Подтверждено!
      1689921433607.png

1689921171500.png
Проверяем существование базы данных!

Теперь нам сказали что там есть база users, давайте проверим
Код:
TrackingId=xyz'||(SELECT '' FROM 'users')||'

1689873630503.png


Почему? Да потому что. Сказал бы нуб, но я про хакер.
Допустим у нас в таблице users 5 записей и это означает, что будет выведено в 5 разных строк, что может нарушить наш кул-Запрос, и нам надо сказать WHERE rownum=1 и это гарантирует что выведется одна запись

1689874523748.png


Подтверждено!
1689921459517.png

1689921221801.png
Подтверждаем наличие 'administrator' в базе


Вы думайте вам это поможет?
Код:
xyz'||(SELECT+'' FROM users where username='administrator')||'
нет давайте будем умнее, но сначала я докажу это.

1689875756631.png


1689875725099.png


Поэтому нам надо использовать некое выражение Oracle. И это будет похоже на операторы IF ELSE
Код:
xyz'|| (SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM dual)||'
И что же тут написано:
Когда 1=1 то выполни это, соответсвенно 1 будет всегда = 1, а TO_CHAR(1/0) даст нам сообщение об ошибке по понятной причине.

Код:
xyz'|| (SELECT CASE WHEN (1=0) THEN TO_CHAR(1/0) ELSE '' END FROM dual)||'
А тут мы перейдём к оператору ELSE, и выведет пустую строку, что значит мы получим ответ 200, т.е нет ошЫбок
1689876641505.png

1689876673558.png

Абалдеть хакеры мои, у нас получилось! Погладьте себя по голове если вы выполняйте практику со мной!!! Вы супер!
Такой запрос не каждый может написать.

1689876173914.png


Offensive Security
С новыми силами в путь хакинга!

Код:
xyz'|| (SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'
Мы получаем ошибку 500, что означает что пользователь administrator существует

1689878669949.png

1689878791063.png

Это трудно понять, но я тебе скажу. Может крутые ребята дополнят этот момент в коментах.
Когда мы говорим,
Код:
xyz'|| (SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'
то если 1=1, выполняй этот код THEN TO_CHAR(1/0), а в случае когда user не существует, он возвращает 200 OK, т.е он не выполнял эту часть запроса потому что его просто нет там.
Подтверждено!

1689921467545.png





1689921263501.png
Узнаём длину пароля!


Я могу вас поздравить что вы будете наконец то хакать пароли!!
Код:
xyz'|| (SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator' AND LENGTH(password)>1)||'

1689879800922.png

1689879861910.png

Делаем вывод, что пароль меньше 666 символов, и больше 1.
Круто теперь узнаём точный результат, МЫЖ хакеры.
Берём burp, и отправляем запрос в Intruder (CTRL+I)
1689879966038.png

Тут всё просто если вы его там открывали.
Clear - очистить
Add - Добавить :cool:

Тыкаем сюда
1689880034252.png


И говорим Отрыжке, шагай по числовой прямой в сторону числа 44 с шагом 1. (Визуализировали?)
1689880116226.png



Тут ума тоже не надо, математика. Условие было больше 19, видим ещё 200OK, после 20 видим 500, т.е >20, УЖЕ НЕТ!! а что может быть между >19 и >20, 20 потому что строго больше 20, а не >=20
1689880214493.png


Ответ: 20
Подтверждено!

1689921402920.png


1689921326863.png
Узнаём пароль

Код:
xyz'|| (SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator'  AND substr(password,1,1)='a')||'

Мы спрашиваем равна ли первая буква пароля букве 'a'

Intruder!
1. Ставим параграфы на 1, и на букву.
2. Ставим тип аттаки "Cluster bomb"
1689880994449.png



Payloads вы уже знайте.
1689881032602.png

и меняем Payload set, что бы брутить букву
Min/Max length, 1 потому что использовать один символ за раз, а не перестановки
1689881097971.png



После нашей суперской атаки, которую наверное вы повторяйте, мы получили ОГРОМНЫЙ результат
используем фильтры!
1689881261231.png

Поздравляю! Записываем наш пароль!

1689881349796.png


Ещё раз congrats, вы стали ближе к Pro-Cool Haцcker LEVEL!
Надеюсь вам нравится мой стиль статей, и если вы всё выполнили успешны по моей статье пишите в тг-чате Codeby #якулхацкер и я подарю вам Шампанского!
Жду реакций и жалоб, а также если вам зашло, то докажите реакцией и сделаю статью про автоматизацию с помощью крутого языка для крутых людей. (Эт Python)
 
Последнее редактирование модератором:
  • Нравится
Реакции: f22

dotru

Green Team
07.09.2019
36
2
BIT
3
Приемущество Burp Pro в данном случае только при бруте? В чем отличие будет с коммунити версией ?
 

apache2

Green Team
26.02.2021
39
21
BIT
277
Приемущество Burp Pro в данном случае только при бруте? В чем отличие будет с коммунити версией ?
4 причины
1. Скорость брута
2. Возможность фильтра, где мы получили много ответов и надо было отфильтровать.
3. Возможность чувствовать себя Pro-Cool Haцcker
а 4 лишнее
 

Местный

Grey Team
23.04.2023
255
108
BIT
769
Приемущество Burp Pro в данном случае только при бруте? В чем отличие будет с коммунити версией ?
в про версии есть сканнер на уязвимости, также можно crawl запустить, чтобы бурп линки собирал. А потом полученные линки прогнать по всевозможным сканнерам или вручную протестировать на уязвимости
 
  • Нравится
Реакции: dotru
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!