Безопасность PHP: как можно неправильно использовать кодировку?

Из этого превосходного вопроса "UTF-8 полностью" я прочитал об этом:

К сожалению, вы должны проверять каждую отправленную строку как допустимую UTF-8, прежде чем пытаться сохранить или использовать ее где-либо. Функция PHP mb_check_encoding() делает свое дело, но вы должны использовать ее неукоснительно. На самом деле это невозможно обойти, поскольку вредоносные клиенты могут отправлять данные в любой кодировке, которую они хотят, и я не нашел способа заставить PHP сделать это за вас надежно .

Теперь я все еще изучаю особенности кодирования и хотел бы точно знать, что злоумышленники могут сделать, чтобы злоупотребить кодированием. Чего можно достичь? Может ли кто-нибудь привести пример? Допустим, я сохраняю пользовательский ввод в базе данных MySQL или отправляю его по электронной почте. Как пользователь может причинить вред, если я не использую mb_check_encoding функциональность?


person User402841    schedule 23.10.2012    source источник


Ответы (2)


как пользователь может причинить вред, если я не использую функциональность mb_check_encoding?

Это касается слишком длинных кодировок.

Из-за досадной причуды дизайна UTF-8 можно создавать последовательности байтов, которые при анализе с помощью наивного декодера битовой упаковки давали бы тот же символ, что и более короткая последовательность байтов, включая один символ ASCII.

Например, символ < обычно представляется как байт 0x3C, но также может быть представлен с помощью чрезмерно длинной последовательности UTF-8 0xC0 0xBC (или даже более избыточных 3- или 4-байтовых последовательностей).

Если вы возьмете этот ввод и обработаете его в инструменте на основе байтов, не обращающем внимания на Unicode, то можно будет избежать любого шага обработки символов, используемого в этом инструменте. Каноническим примером будет отправка 0x80 0xBC в PHP, который имеет собственные байтовые строки. Типичное использование htmlspecialchars для HTML-кодирования символа < здесь не удастся, потому что ожидаемая последовательность байтов 0x3C отсутствует. Таким образом, выходные данные скрипта по-прежнему будут включать в себя слишком длинное закодированное <, и любой браузер, читающий этот вывод, потенциально может прочитать последовательность 0x80 0xBC 0x73 0x63 0x72 0x69 0x70 0x74 как <script и вуаля! XSS.

Оверлонги давно запрещены, и современные браузеры их больше не разрешают. Но это было настоящей проблемой для IE и Opera в течение долгого времени, и нет никакой гарантии, что каждый браузер решит ее правильно в будущем. И, конечно же, это только один пример — в любом месте, где байт-ориентированный инструмент обрабатывает строки Unicode, у вас могут возникнуть аналогичные проблемы. Поэтому наилучший подход — удалить все оверлонги на самой ранней фазе ввода.

person bobince    schedule 23.10.2012
comment
Очень интересно, спасибо! Это проливает некоторый свет на дело. Мне, как новичку в кодировании, непонятно, как я могу проверить это? Что мне нужно сделать, чтобы отправить 0xC0 0xBC на свой веб-сайт, чтобы я мог проверить наличие уязвимостей? Я предполагаю, что не могу использовать (современный) браузер, так что же используется для проверки этого? Стоит ли использовать старую версию Opera? И как мне публиковать такие последовательности символов? Я публикую 0xC0 0xBC, как если бы это был текст, или это работает по-другому? - person User402841; 24.10.2012
comment
Я скорее разместил новый вопрос, чтобы спросить о том, как тест для этого - person User402841; 25.10.2012

Похоже, это сложная атака. Проверка документов для mb_check_encoding дает примечание к «Атаке с недопустимым кодированием». Поиск в Google «Invalid Encoding Attack» приводит к некоторым интересным результатам, которые я попытаюсь объяснить.

Когда такие данные отправляются на сервер, он выполняет некоторое декодирование для интерпретации отправляемых символов. Теперь сервер выполнит некоторые проверки безопасности, чтобы найти закодированную версию некоторых специальных символов, которые могут быть потенциально опасными.

Когда на сервер отправляется недопустимая кодировка, сервер по-прежнему запускает свой алгоритм декодирования и оценивает недопустимую кодировку. Вот где возникает проблема, потому что проверки безопасности могут не искать недопустимые варианты, которые все равно будут создавать вредоносные символы при выполнении алгоритма декодирования.

Пример атаки, запрашивающей полный список каталогов в системе unix:

http://host/cgi-bin/bad.cgi?foo=..%c0%9v../bin/ls%20-al|

Вот несколько ссылок, если вы хотите более подробное техническое объяснение того, что происходит в алгоритмах:

http://www.cgisecurity.com/owasp/html/ch11s03.html#id2862815

http://www.cgisecurity.com/fingerprinting-port-80-attacks-a-look-into-web-server-and-web-application-attack-signatures.html

person Jrod    schedule 23.10.2012