Валиден адрес на прокси не прави ръчно написаното SOCKS съобщение валидно. Изпращането на C или C++ структура може да изпрати подпълване или цели числа в хостов ред, които протоколът никога не е изисквал.

За SOCKS5 CONNECT заявка с име на домейн сериализирайте тази последователност явно след договарянето на метода и всяка избрана автентикация:

  1. Версия, команда, резервиран байт и тип на адреса
  2. Дължина на домейна и байтове на домейна
  3. Двубайтовият порт на местоназначението в мрежов ред на байтовете

Дължините на адресите зависят от версията на SOCKS и типа на адреса. Числовите полета с фиксирана ширина се нуждаят от определеното си представяне; низовете на домейн имат собствено кодиране на дължината. Терминаторът на C низ не е обща инструкция да се добави нула към мрежовото съобщение.

Съкращение в реализациятаПроблем за проверка
Присвояване на 32-битова стойност през 8-битов указателНе извежда и четирите байта
Привеждане на буфер към указател към по-голямо цяло числоПодравняването и редът на байтовете все още трябва да се обработват
Допускане, че едно четене или запис е едно съобщениеTCP може да предаде само част от последователността на протокола

Сравнете всяко поле с предвиденото местоназначение и обработвайте частичния I/O. Получаването на два байта не доказва, че целият отговор е пристигнал. Прегледът на тези граници може да различи деформирана заявка от сървър, който отказва коректно описана връзка.

Подобни статии