2023-06-27 19:18:58
Интересная особенность, связанная с парсингом кук. Некоторые серверы, такие как Jetty или Undertow, в своей работе реализуют спецификацию RFC2965, в которой есть необычная реализация синтаксического анализа.
Если
Jetty примет на вход
Cookie: search_history="lolkek; JSESSIONID=1337; asdf=end";
То такой заголовов будет разборан как одна кука
search_history со значением lolkek; JSESSIONID=1337; asdf=end, вместо трех отдельных. Если
Jetty видит значение, которое начинается с двойных кавычек, то он будет пытаться прочитать строку до тех пор, пока не увидит закрывающую кавычку, даже если на пути встретится точка с запятой.
Опасно это тем, что если
search_history где-то рендерится на странице, то ее можно будет использовать для эксфильтрации любой куки (например,
JSESSIONID) с флагом
HttpOnly. Для этого нужно будет найти
XSS и проэксплуатировать ее, записав в
search_history двойные кавычки, чтобы оставшаяся часть заголовка отобразилась на странице.
К этому восприимчивы Jetty, Undertow, TomCat, Python Zope и любые другие серверы и фреймворки, которые руководствуются RFC2616, когда парсят строки. Библиотека http.cookies для Python, а именно классы
BaseCookie и
SimpleCookie тоже реализуют эту спеку. Ее используют aiohttp, cherrypy, web.py, bottle, webob (Pyramid, TurboGears).
3.0K views16:18