Двойной кодирование
Двойное кодирование - это акт кодирования данных дважды под строкой с использованием одной и той же схемы кодирования. Обычно он используется в качестве метода атаки для обхода схем авторизации или фильтров безопасности, которые перехватывают пользовательский ввод. При атаках двойного кодирования против фильтров безопасности символы полезной нагрузки, которые рассматриваются как незаконные этими фильтрами, заменяются их двойной формой.
Двойное ури-кодирование-это особый тип двойного кодирования, в котором данные подписаны дважды подряд . Он использовался для обхода схем авторизации и фильтров безопасности против инъекции кода , обхода каталогов , перекрестных сценариев (XSS) и SQL-инъекции .
Описание
[ редактировать ]При двойном кодировании данные кодируются дважды в строке с использованием одной и той же схемы кодирования, то есть двойной кодируемой формы данных X
является Encode(Encode(X))
где Encode
является функцией кодирования. [ 1 ]
Двойное кодирование обычно используется в качестве метода атаки для обхода схем авторизации или фильтров безопасности, которые перехватывают пользовательский ввод. [ 2 ] При атаках двойного кодирования против фильтров безопасности символы полезной нагрузки, которые рассматриваются как незаконные этими фильтрами, заменяются их двойной формой. [ 3 ] Фильтры безопасности могут обрабатывать данные X
и его закодированная форма как незаконная. [ 4 ] Однако это все еще возможно для Encode(Encode(X))
, которая является двойной формой данных X
, чтобы не рассматриваться как незаконные с помощью фильтров безопасности и, следовательно, пройти через них, но позже целевая система может использовать двумя декодированную форму Encode(Encode(X))
, что есть X
, то, что фильтры рассматривались бы как незаконные. [ 5 ]
Двойной ури-кодирование
[ редактировать ]Двойное ури-кодирование, также называемое двойным процентным кодированием, представляет собой особый тип двойного кодирования, в котором данные дважды подписаны. [ 6 ] Другими словами, двойной кодируемой формы данных X
является URI-encode(URI-encode(X))
. [ 7 ] Например, для расчета двойной кодируемой формы <
, первый <
уриводимен как %3C
который тогда, в свою очередь %253C
, то есть, double-URI-encode(<) = URI-encode(URI-encode(<)) = URI-encode(%3C) = %253C
. [ 8 ] В качестве другого примера для расчета двойной кодируемой формы ../
, первый ../
уриводимен как %2E%2E%2F
который тогда, в свою очередь %252E%252E%252F
, то есть, double-URI-encode(../) = URI-encode(URI-encode(../)) = URI-encode(%2E%2E%2F) = %252E%252E%252F
. [ 9 ]
Двойное ури-кодирование обычно используется в качестве техники атаки против веб-приложений и веб-браузеров для обхода схем авторизации и фильтров безопасности, которые перехватывают пользовательский ввод. [ 10 ] [ 11 ] Например, потому что .
и его уризаторная форма %2E
используются в некоторых атаках прохождения каталогов, они обычно рассматриваются как незаконные фильтры безопасности. [ 12 ] Однако это все еще возможно для %252E
, который является двойной кодированной формой .
, чтобы не рассматриваться как незаконные с помощью фильтров безопасности и, следовательно, проходить через них, но позже, когда целевая система строит путь, связанный с атакой обхода каталога, она может использовать двойную декорированную форму %252E
, что есть .
, то, что фильтры рассматривались бы как незаконные. [ 13 ]
Двойные атаки умодимости были использованы для обхода схем авторизации и фильтров безопасности в отношении инъекции кода, прохождения каталога, XSS и инъекции SQL. [ 14 ]
Профилактика
[ редактировать ]Декодирование некоторого пользовательского ввода дважды, используя одну и ту же схему декодирования, один раз перед мерой безопасности и один раз после этого может позволить атаку двойного кодирования обходить эту меру безопасности. [ 15 ] Таким образом, чтобы предотвратить атаки двойного кодирования, все операции декодирования на пользовательском вводе должны происходить перед схемами авторизации и фильтрам безопасности, которые перехватывают ввод пользователя. [ 16 ]
Примеры
[ редактировать ]PHP
[ редактировать ]На языке программирования PHP элементы данных в $_GET
и $_REQUEST
достаточно ури, и поэтому программисты должны избегать вызовов urldecode
функционируйте на них. [ 17 ] Вызов urldecode
функционировать в данных, которые были прочитаны из $_GET
или $_REQUEST
приводит к тому, что данные разбираются в URI раз больше, чем должны, и, следовательно, могут открыть возможность для двойных атак уризации.
Справочник
[ редактировать ]В следующей программе PHP значение $_GET["file"]
используется для создания пути файла, который будет отправлен пользователю. Это открывает возможность для атак каталогов, которые включают их полезную нагрузку в http параметр file
Полем В качестве фильтра безопасности против атаки обхода каталогов, эта программа ищет значение, которое он читает $_GET["file"]
Для последовательностей обхода каталогов и выходов, если он находит один. Однако после этого фильтра программа уточняет данные, которые он прочитал $_GET["file"]
, что делает его уязвимым для удвоения атак по умоданию.
<?php
/* Note that $_GET is already URI-decoded */
$path = $_GET["file"];
/* Security filter */
/* Exit if user input contains directory traversal sequence */
if (strstr($path, "../") or strstr($path, "..\\"))
{
exit("Directory traversal attempt detected.");
}
/* URI-decode user input once again */
$path = urldecode($path);
/* Build file path to be sent using user input */
echo htmlentities(file_get_contents("uploads/" . $path));
Этот фильтр предотвращает полезные нагрузки, такие как ../../../../etc/passwd
и его уризаторная форма %2E%2E%2F%2E%2E%2F%2E%2E%2F%2E%2E%2Fetc%2Fpasswd
Полем Однако, %252E%252E%252F%252E%252E%252F%252E%252E%252F%252E%252E%252Fetc%252Fpasswd
, который является двойной кодированной формой ../../../../etc/passwd
, будет обойти этот фильтр. При двойной полезной нагрузке %252E%252E%252F%252E%252E%252F%252E%252E%252F%252E%252E%252Fetc%252Fpasswd
используется, значение $_GET["file"]
будет %2E%2E%2F%2E%2E%2F%2E%2E%2F%2E%2E%2Fetc%2Fpasswd
который не содержит никакой последовательности обхода каталога и, таким образом, проходит через фильтр и будет передаваться urldecode
функция, которая возвращается ../../../../etc/passwd
, в результате чего успешная атака.
XSS
[ редактировать ]В следующей программе PHP значение $_GET["name"]
используется для создания сообщения, которое будет показано пользователю. Это открывает возможность для атак XSS, которые включают их полезную нагрузку в параметр http name
Полем В качестве фильтра безопасности против атак XSS эта программа продезинфицирует значение, которое он читает $_GET["name"]
через htmlentities
функция Однако после этого фильтра программа уточняет данные, которые он прочитал $_GET["name"]
, что делает его уязвимым для удвоения атак по умоданию.
<?php
/* Note that $_GET is already URI-decoded */
$name = $_GET["name"];
/* Security filter */
/* Sanitize user input via htmlentity */
$name = htmlentities($name);
/* URI-decode user input once again */
$name = urldecode($name);
/* Build message to be shown using user input */
echo "Hello " . $name;
Этот фильтр предотвращает полезные нагрузки, такие как <script>alert(1)</script>
и его уризаторная форма %3Cscript%3Ealert%281%29%3C%2Fscript%3E
Полем Однако, %253Cscript%253Ealert%25281%2529%253C%252Fscript%253E
, который является двойной кодированной формой <script>alert(1)</script>
, будет обойти этот фильтр. При двойной полезной нагрузке %253Cscript%253Ealert%25281%2529%253C%252Fscript%253E
используется, значение $_GET["name"]
будет %3Cscript%3Ealert%281%29%3C%2Fscript%3E
который не содержит никакого незаконного характера и, таким образом, проходит через htmlentities
функционировать без каких -либо изменений и будет передано urldecode
функция, которая возвращается <script>alert(1)</script>
, в результате чего успешная атака.
Источники
[ редактировать ]- CAPEC (2022). «CAPEC-120: двойное кодирование» . capec.mitre.org . 3.7 Получено 23 июля 2022 года .
- CWE (2022). «CWE-174: двойное декодирование тех же данных» . cwe.mitre.org . 4.8 . Получено 23 июля 2022 года .
- Имперва (2022). «Двойной URL -кодирование» . docs.imperva.com . Получено 23 июля 2022 года .
- OWASP (2022). «Двойное кодирование» . Owasp.org . Получено 23 июля 2022 года .
- PHP (2022). "Urldecode" . php.net . Получено 23 июля 2022 года .
- Портсугер (2022). «Запутывающие атаки с использованием кодировки» . portswigger.net . Запутывание с помощью двойного URL -кодирования . Получено 23 июля 2022 года .
- Прасад, Прахар (2016). «Двойное кодирование» . Освоение современного тестирования проникновения в Интернет . Packt Publishing. С. 11–14. ISBN 978-1785284588 .
Ссылки
[ редактировать ]- ^ CAPEC 2022 , Описание. «Служба использует повторение процесса кодирования для набора символов (то есть символов, кодирующего символ символа), чтобы запутать полезную нагрузку конкретного запроса».
- ^ CAPEC 2022 , описание, поток выполнения. «Это [двойное кодирование] может позволить противнику обходить фильтры, которые пытаются обнаружить незаконные символы или строки, такие как те, которые могут использоваться в обходных или инъекционных атакх [...], например, путем двойного кодирования определенных символов в URL (Например, точки и сутки). противник может попытаться получить доступ к ограниченным ресурсам на веб -сервере или заставлять просмотреть защищенные страницы (таким образом, подрывая службу авторизации) Также попробуйте другие атаки в стиле инъекции, используя эту схему атаки: инъекция команды, инъекция SQL и т. Д. »
- ^ CAPEC 2022 , описание, поток выполнения. «Это [двойное кодирование] может позволить противнику обходить фильтры, которые пытаются обнаружить незаконные символы или строки, такие как те, которые могут использоваться в обходе или инъекционных атакх. Приказ попытаться пройти мимо фильтров ».
- ^ OWASP 2022 , описание. «Используя двойную кодировку, можно обойти фильтры безопасности, которые только декодируют пользовательский ввод».
- ^ OWASP 2022 , описание. «Используя двойную кодировку, можно обойти фильтры безопасности, которые только один раз декодируют пользовательский ввод. Второй процесс декодирования выполняется бэкэнд -платформой или модулями, которые должным образом обрабатывают кодируемые данные, но не имеют соответствующих проверок безопасности».
- ^ Prasad 2016 , с. 11. «Двойной процент кодирование одинаково, что процент кодирования с поворотом, который каждый символ кодируется дважды, а не один раз».
- ^ Prasad 2016 , с. 11. «Двойной процент кодирование одинаково, что процент кодирования с поворотом, который каждый символ кодируется дважды, а не один раз».
- ^ Prasad 2016 , с. 11. «Поэтому, если бы мне пришлось кодировать <с использованием двойного кодирования, я сначала кодирую его в его процентно-кодированный формат, который составляет %3C, а затем снова процент кодирует символ %. Результат этого будет %253C».
- ^ OWASP 2022 , описание. "Например, ../ (Dot-dot-slash) символы представляют %2e %2e %2f в шестнадцатеричном представлении. Когда символ %снова кодируется, его представление в шестнадцатеричном коде составляет %25. Результат из процесса двойного кодирования ../ (dot-dot-slash) будет%252e%252e%252f "
- ^ Prasad 2016 , с. 11. "Эта техника [двойной процент кодирования] очень удобна при попытке уклониться от фильтров, которые пытаются черному списку определенных кодируемых символов"
- ^ CAPEC 2022 , поток выполнения. «Например, путем двойного кодирования определенных символов в URL -адреса (например, точек и ударов), противник может попытаться получить доступ к ограниченным ресурсам на веб -сервере или принудительно обратиться за защищенными страницами (таким образом, подрывает службу авторизации). Стчаний также может также может принять участие в Попытка других атак в стиле инъекции, используя эту схему атаки: инъекция команды, инъекция SQL и т. Д. »
- ^ CAPEC 2022 , Описание. «Например, точка (.), Часто используемая в атаках прохождения пути и, следовательно, часто блокируемой фильтрами, может быть кодируется URL как %2e. Однако многие фильтры распознают это кодирование и все равно будут блокировать запрос».
- ^ CAPEC 2022 , Описание. «В двойном кодировании %в приведенном выше URL -кодировке будет кодироваться снова как %25, что приведет к %252E, которые некоторые фильтры могут не поймать, но которые все еще можно интерпретировать как точку (.) Столбками на цели. "
- ^ CWE 2022 , наблюдаемые примеры.
- ^ CWE 2022 , описание. «Программное обеспечение дважды декодирует один и тот же вход, что может ограничить эффективность любого механизма защиты, который происходит между операциями декодирования».
- ^ CWE 2022 , Потенциальные смягчения. «Входные данные должны быть декодированы и канониализированы в текущее внутреннее представление приложения, прежде чем будет подтверждено (CWE-180)».
- ^ Php 2022 , Примечания. «Предупреждение: суперглобалы $ _get и $ _request уже декодированы. Использование urldecode () на элементе в $ _get или $ _request может иметь неожиданные и опасные результаты».