Ошибка в SSI encoding

Илья Винокуров ilvin at mail.ru
Wed Apr 8 16:33:43 MSD 2009


Здравствуйте, Игорь!

Повозился с конфигурированием стабильного nginx и обнаружил на первый взгляд безобидную ошибку в ngx_http_core_module

Дело в том, что модуль парсит QUERY STRING и парсит его не строго по RFC1738
http://en.wikipedia.org/wiki/Query_string

Модуль распознает только амперсанд '&' в качестве разделителя параметров, когда как точку с запятой ';' игнорирует. В результате очень легко создается дыра в следующей SSI конструкции:
<!--# if expr="!$arg_action" -->
  <!--# include virtual="/back/script.pl?args&action=good" -->
<!--# else -->
  Sorry
<!--# endif -->

Если запрос будет http://server/index.html?a1=2;action=bad, то бекенду попадет строка:
/back/script.pl?a1=2;action=bad&action=good
И кто его знает какой action сработает...

RFC1738 также не соблюдает и <!--# echo var="" encoding="url" -->
По крайней мере 2 символа ';' и '=' оно не кодирует :(, а надо бы...

PS: Многие скажут, что ';' не актуальна в QUERY_STRING и будут не правы. Точка с запятой вынужденно становится популярной, т.к. в XML конфигурации
<action url="http://server/script?p=1&p=2&p=3" /> не валидно, 
а так <action url="http://server/script?p=1;p=2;p=3" /> валидно

PSS: Давайте сделаем наши высоконагруженные сервера еще и надежными :)

С почтением,
  Илья Винокуров.






More information about the nginx-ru mailing list