Forwarded from Пост Импакта
#api #params
> Ничего не могу найти на сайте, может ещё что-то посмотреть?
Иногда встречается сайт, на котором всего лишь несколько конечных точек. Казалось, все параметры были проверены на уязвимости, а в чек-листе отмечены любые возможные проверки на инъекции и логику.
Однако, бывают уязвимости, которые не видны с первого взгляда. Например (CAPEC-460) HTTP Parameter Pollution или (CWE-472) External Control of Assumed-Immutable Web Parameter. Данные ошибки возникают из-за неожиданного поведения в функциях обработки параметров.
Давайте рассмотрим первую атаку HTTP Parameter Pollution, она состоит из возможности добавления повторяющихся параметров с помощью специальных разделителей запроса.
Например, у нас открыт сайт по продаже арбузов в браузере
Это происходит, потому что Apache Tomcat 🐈 при анализе двух одинаковых параметров (
Но не все сервера используют приоритет порядка, так, например, ASP.NET/IIS конкатенирует значения. Поэтому в случаях, когда выполнению XSS мешает санитизация или WAF, можно составить следующий payload:
Помимо приоритетов, нужно также вспомнить о разделителях для параметров. Существует не только привычный & (амперсанд) и , (запятая) но и ряд других символов, тут нужно обратиться к стандартам и поискать реализации. Если открыть (rfc6570) URI Template можно найти Path-Style Parameter
Обычный URL будет следующим:
• CVE-2021-23336 — Python библиотека
• ParseThru — Go библиотека
{"client_id":4, "client_id":17, "action":"delete"}
> Ничего не могу найти на сайте, может ещё что-то посмотреть?
Иногда встречается сайт, на котором всего лишь несколько конечных точек. Казалось, все параметры были проверены на уязвимости, а в чек-листе отмечены любые возможные проверки на инъекции и логику.
Однако, бывают уязвимости, которые не видны с первого взгляда. Например (CAPEC-460) HTTP Parameter Pollution или (CWE-472) External Control of Assumed-Immutable Web Parameter. Данные ошибки возникают из-за неожиданного поведения в функциях обработки параметров.
Давайте рассмотрим первую атаку HTTP Parameter Pollution, она состоит из возможности добавления повторяющихся параметров с помощью специальных разделителей запроса.
Например, у нас открыт сайт по продаже арбузов в браузере
🌐 example.com/profile.jsp?client_id=1
Для кнопки "Открыть профиль" устанавливается динамически в ответе от сервера html:<a href="profile.jsp?client_id=1&action=view
А теперь изменим запрос добавив в него параметр и закодировав разделитель & как %26:🌐 example.com/profile.jsp?client_id=1%26action%3Ddelete
В результате для кнопки "Открыть профиль" задаётся html:<a href="profile.jsp?client_id=1&action=delete&action=view
При нажатии на кнопку — профиль пользователя будет удалён. Для того чтобы заставить жертву удалить свой аккаунт, нам нужно отправить ей ссылку и подождать.Это происходит, потому что Apache Tomcat 🐈 при анализе двух одинаковых параметров (
action) берёт значение первого:&action=delete&action=view
Вот так выглядит код на стороне сервера:String client_id = request.getParameter("client_id");
GetMethod get = new GetMethod("https://example.com/profile");
get.setQueryString("client_id=" + client_id + "&action=" + action);
href_link=get.URL;
Разработчик должен был учесть такое поведение и проверить возможность внедрения параметра action в client_id
Вообще, приоритет и процесс обработки параметров можно взять из этой таблицы ниже:Technology/HTTP backend | Parsing Result | Example |Так, для Server: Apache Tomcat будет взято значение из первого совпадения
---------------------------------------------------------------------
ASP.NET/IIS | All occurrences | par1=val1,val2 |
ASP/IIS | All occurrences | par1=val1,val2 |
PHP/Apache | Last occurrence | par1=val2 |
JSP Servlet/Apache Tomcat | First occurrence | par1=val1 |
JSP Servlet/Oracle Application | First occurrence | par1=val1 |
IBM HTTP Server | First occurrence | par1=val1 |
action=delete
А для Server: Apache значение уже будет action=view — последний параметрНо не все сервера используют приоритет порядка, так, например, ASP.NET/IIS конкатенирует значения. Поэтому в случаях, когда выполнению XSS мешает санитизация или WAF, можно составить следующий payload:
example.com/search?param=<audio/n="¶m="src/onerror=alert()>
В результате на странице html будет <audio n="," src/onerror=alert()> и XSS успешно сработает 💣Помимо приоритетов, нужно также вспомнить о разделителях для параметров. Существует не только привычный & (амперсанд) и , (запятая) но и ряд других символов, тут нужно обратиться к стандартам и поискать реализации. Если открыть (rfc6570) URI Template можно найти Path-Style Parameter
Обычный URL будет следующим:
example.com/users?role=admin&firstName=N
А теперь преобразуем его в вид Path-Style:example.com/users;role=admin;firstName=N
Использование в качестве разделителя ; (точки с запятой) не повсеместно. Это приводит к различиям обработки во фреймворках и как следствие к уязвимостям, в частности, на микросервисных архитектурах: • CVE-2021-23336 — Python библиотека
urllib.parse.parse_qsl не игнорирует точку с запятой.• ParseThru — Go библиотека
net/url не игнорирует точку с запятой и выводит предупреждение http: URL query contains semicolon...
Следует помнить, что уязвимость HTTP Parameter Pollution может возникать не только в URL, но и в любой части POST/GET запроса, а также в теле JSON.{"client_id":4, "client_id":17, "action":"delete"}
👍4🔥4