• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Как использовать User Agent для атак на сайты

tabac

CPU register
Пользователь
Регистрация
30.09.2018
Сообщения
1 610
Решения
1
Реакции
3 332
Пользовательский агент (User Agent) — это строка текста, идентифицирующая браузер и операционную систему для веб-сервера. User Agent передаётся в HTTP заголовке когда браузер делает запрос к веб-серверу.

Вы можете посмотреть передаваемые HTTP заголовки, в том числе User Agent в Инструментах разработчика веб-мастера. Например, в Chrome для этого нажмите F12, перейдите на вкладку Network и в окне General найдите Request Headers (заголовки запроса):

xchrome-user-agent.png.pagespeed.ic.Wv8IigUeiI.webp


Пример User Agent:
Код:
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36
Как можно использовать User Agent при атаках на сайты? Я знаю по крайней мере 3 варианта:
  1. SQL-инъекции через User Agent
  2. XSS с помощью User Agent
  3. Подмена User Agent для обмана сервера
Эта инструкция расскажет, как менять User Agent и делать инъекции через User Agent чтобы притвориться другим устройством или выполнить атаки на сайт.

XSS через User Agent​

XSS уязвимости бывают:
  • Хранимые (Постоянные)
  • Отражённые (Непостоянные)
Все показанные ниже XSS являются непостоянными, то есть показываются только пользователю, который их эксплуатирует, а следовательно, не являются опасными. Такие уязвимости обычно даже не принимают по Bounty программам (некоторые крупные компании дают вознаграждение за найденные уязвимости, если вы сообщили о них, это называется Bug Bounty).

Начнём мы с простейшего способа менять User Agent — прямо в веб-браузере. Конечно же, для это есть множество расширений браузеров, но подменить User Agent можно даже без них. Здесь же просто напомним краткий алгоритм:

Google Chrome/Chromium
  • Инструменты разработчика (F12)
  • Нажмите кнопку меню справа от вкладки «Console» в нижней части панели инструментов разработчика и выберите «Network conditions»
  • На вкладке «Network conditions» снимите флажок «Select automatically» рядом с «User agent».
  • Затем вы можете выбрать пользовательский агент из списка или скопировать и вставить пользовательский агент в поле.
Firefox:
  • Ведите about:config в адресную строку Firefox и нажмите Enter.
  • Введите general.useragent.override в поле фильтра. Он, вероятно, не существует в вашей системе. Чтобы добавить эту настройку, переключитесь тип значения на «Строка» и нажмите + (плюс).
  • Введите желаемый пользовательский агент.
Если для сайта whatleaks.com ввести в качестве строки User Agent
Код:
<script>alert(1)</script>
То получим всплывающее окно alert.

xwhatleaks.png.pagespeed.ic.a1Kb1hCO2R.webp


Это сайт whatsmyuseragent.org:

xwhatsmyuseragent.png.pagespeed.ic.ChlJqgMgxM.webp


Это сайт getright.com/useragent.html

xgetright.png.pagespeed.ic.NyDsz5HJ1U.webp


Сайт manytools.org/http-html-text/user-agent-string/

xmanytools.png.pagespeed.ic.pfvW235QGv.webp


На сайт amiunique.org/fp нет XSS инъекции, но поломался JavaScript код.

amiunique.png


На самом деле, пользователь действительно может как угодно изменять показываемую ему страницу на лету. Если эту страницу кроме него никто не видит, то проблем нет. Другое дело, если значения User Agent сохраняются и затем могут сработать, то есть если значения User Agent сохраняются и затем показываются кому-либо ещё, например, владельцу сайта (скажем, при анализе статистики) или другим пользователям (например, виджете популярных или последних User Agent посетителей).

Как делать SQL-инъекцию через User Agent​

Вы тоже уже успели об этом подумать? Если программисты забывают о том, что User Agent'у не стоит доверять как абсолютно всему остальному, приходящему от пользователей, то значит там могут не фильтроваться теги и специальные символы? Пример этому мы уже увидели — на всех приведённых выше сайтах не фильтруется и не заменяются специальные символы в теге <script>.

А что если специальные символы тоже не фильтруются и значение User Agent сохраняется в базу данных? А это уже SQL-инъекция! Среди приложений, которые могут сохранять значения User Agent в базу данных: программы для сбора статистики веб-сайтов, метрики, виджеты «браузеры последних посетителей» и т. д.

В bWAPP есть пример инъекции через User Agent. Там она называется «SQL Injection - Stored (User-Agent)».

Если в качестве значения User Agent ввести что-нибудь вроде
Код:
Chrome'
То на выходе мы получим замечательное сообщение:
Код:
Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Chrome', '192.168.0.89')' at line 1
xuser-agent-sqli.png.pagespeed.ic.liY_g884fc.webp


Конечно же, там где SQLi, там и sqlmap. Чтобы протестировать SQL-инъекцию в User Agent используйте опцию --user-agent, в которой место инъекции укажите символом * (звёздочкой). Пример команды:
Код:
sqlmap -u 'http://192.168.0.96/bWAPP/sqli_17.php' --user-agent="Chrome*" --cookie 'PHPSESSID=a3400ca39ae4c6c1b25bb1eeb91c5410; security_level=0' --dbs
Конечно же, уязвимость найдена и выведен список баз данных:

xsqlmap.png.pagespeed.ic.lb77krCOUV.webp


На странице https://kali.tools/?p=816 вы найдёте ссылки на подробнейшие инструкции по sqlmap и скоро будет добавлена ещё одна — SQL инъекции в User Agent, Referer, Cookie и произвольные HTTP заголовки.

Как подменить User Agent в командной строке​

Чтобы поменять User Agent для утилиты cURL используйте опцию -A. Сравните вывод двух команд:
Код:
curl -I https://suip.biz
curl -I -A 'Chrome' https://suip.biz
curl-user-agent.png

Как подменить User Agent в Burp Suite​

В Burp Suite перейдите на вкладку «Proxy» → «Options», найдите раздел «Match and Replace» (совпадения и замена). Там уже присутствует несколько правил по замену User Agent для эмуляции запросов от различных устройств.
burp-suit-2.png

Вы можете включить имеющиеся правила или создать новое. Для создания нового нажмите кнопку «Add».
В качестве «Type» выберите «Request header».
В качестве значения поля «Match» укажите
Код:
^User-Agent.*$
В поле «Replace» впишите значение, на которое будет заменён HTTP заголовок пользовательского агента. Обратите внимания, что поскольку мы заменяем заголовок целиком, то начинаться он должен со строки «User-Agent: ».
В поле «Comment» впишите любой комментарий, чтобы быстро вспомнить, для чего нужен этот заголовок.
Поставьте галочку «Regex match».
burp-suit.png


Включите его поставив галочку в столбце «Enabled».
burpsuit.png

По умолчанию Burp Suite в качестве прокси прослушивает localhost:8080.

С cURL можно использовать опцию -x, чтобы отправить запрос через Burp Suite, например:
Код:
curl -x http://localhost:8080 -A 'Any User Agent' --cookie 'security_level=0; PHPSESSID=46d368f57a7c0e17905377f07846b5b0' 'http://192.168.0.96/bWAPP/sqli_17.php'
Как можно увидеть, значение заголовка User Agent было заменено и мы получили сообщение об ошибке, которая может означать SQL-инъекцию.
burp-suit-target.png


User-Agent Impersonation​

В OWASP Mutillidae II есть задание «User-Agent Impersonation». У вас это задание будет по адресу http://localhost/mutillidae/index.php?page=user-agent-impersonation.php.
user-agent-impersonation.png

На этой странице нам показывают сообщение:
Код:
Sorry. You do not look like an Apple iPad using Safari Browser.
This page uses JavaScript browser and O/S fingerprinting to decide if the user-agent is allowed.
Дальше есть вариант моего решения, но я рекомендую самостоятельно решить этот пример — он не такой простой, как кажется.

Данный пример готовился как самый первый в этой статье, поскольку обход проверки кажется элементарным. Казалось бы, выбираем в Инструментах разработчика правильный User Agent, вроде такого
Код:
Mozilla/5.0 (iPad; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1
и задание пройдено.

Но что-то пошло не так:

mutillidae.png

Страница никак не хочет принимать подходящий под условие User Agent.

Я посмотрел исходный код и обнаружил там:
Код:
if(
        window.navigator.platform === "iPad" &&
        window.navigator.appName === "Netscape" &&
        window.navigator.appCodeName === "Mozilla" &&
        window.navigator.appVersion.indexOf("iPad") !== -1 &&
        window.navigator.appVersion.indexOf("Mac") !== -1 &&
        window.navigator.appVersion.indexOf("AppleWebKit") !== -1 &&
        window.navigator.appVersion.indexOf("Safari") !== -1 &&
        window.navigator.product === "Gecko" &&
        window.navigator.productSub === "20030107"
){
    lResultTD.innerHTML = "Congratulations. You look like an iPad using Safari Browser to me.";
    lResultTD.className = "success-header";
}else{
    lResultTD.innerHTML = "Sorry. You do not look like an Apple iPad using Safari Browser.<br />This page uses JavaScript browser and O/S fingerprinting to decide if the user-agent is allowed.";
    lResultTD.className = "error-header";
}
Я не знаю, насколько всё в порядке с этим кодом, возможно, в современных браузерах он просто неадекватен. Но можно заметить, что очень легко поломать логику всех этих многочисленных проверок добавив в конце « || 1» что означает «ИЛИ истина». То есть независимо от того, какой будет результат всех предыдущих проверок, это условие всё равно всегда будет возвращать «Истина».

Я воспользовался методом
Код:
if(
        window.navigator.platform === "iPad" &&
        window.navigator.appName === "Netscape" &&
        window.navigator.appCodeName === "Mozilla" &&
        window.navigator.appVersion.indexOf("iPad") !== -1 &&
        window.navigator.appVersion.indexOf("Mac") !== -1 &&
        window.navigator.appVersion.indexOf("AppleWebKit") !== -1 &&
        window.navigator.appVersion.indexOf("Safari") !== -1 &&
        window.navigator.product === "Gecko" &&
        window.navigator.productSub === "20030107" || 1
)
Такой подход устроил механизм проверки Пользовательского Агента и задание пройдено.

Автор Alexey
источник hackware.ru
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Это.просто.нереально.
Что за великая мудрость? Я в восторге! Никогда бы не подумал что это реально, атака через user-agent. Огромная благодарность за такую информацию.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Надеюсь это был сарказм .
Нет, не сарказм. Ранее я не знал, точнее не догадывался, что можно что-либо протащить через отпечаток. Что поделать с теми, кто только начинает изучение? Сколько всего вокруг нас что мы не знаем! Рядом, в комментариях люди, кто знает больше вас и тоже поражаются, когда говорят о очевидных для их уровня делах, а вы удивлены.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
У меня не получилось подменить отпечаток в firefox 79.0 на linux. Если у вас нет возможности подмены, вы можете использовать расширение User-Agent Switcher, он позволяет вносить любые изменения в отпечаток. Достаточно выбрать любой стандартный отпечаток из предложенных и на нижней панели есть кнопка "ручка" для ручного редактирования отпечатка.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Пользовательский агент (User Agent) — это строка текста, идентифицирующая браузер и операционную систему для веб-сервера. User Agent передаётся в HTTP заголовке когда браузер делает запрос к веб-серверу.

Вы можете посмотреть передаваемые HTTP заголовки, в том числе User Agent в Инструментах разработчика веб-мастера. Например, в Chrome для этого нажмите F12, перейдите на вкладку Network и в окне General найдите Request Headers (заголовки запроса):

xchrome-user-agent.png.pagespeed.ic.Wv8IigUeiI.webp


Пример User Agent:
Код:
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36
Как можно использовать User Agent при атаках на сайты? Я знаю по крайней мере 3 варианта:
  1. SQL-инъекции через User Agent
  2. XSS с помощью User Agent
  3. Подмена User Agent для обмана сервера
Эта инструкция расскажет, как менять User Agent и делать инъекции через User Agent чтобы притвориться другим устройством или выполнить атаки на сайт.

XSS через User Agent​

XSS уязвимости бывают:
  • Хранимые (Постоянные)
  • Отражённые (Непостоянные)
Все показанные ниже XSS являются непостоянными, то есть показываются только пользователю, который их эксплуатирует, а следовательно, не являются опасными. Такие уязвимости обычно даже не принимают по Bounty программам (некоторые крупные компании дают вознаграждение за найденные уязвимости, если вы сообщили о них, это называется Bug Bounty).

Начнём мы с простейшего способа менять User Agent — прямо в веб-браузере. Конечно же, для это есть множество расширений браузеров, но подменить User Agent можно даже без них. Здесь же просто напомним краткий алгоритм:

Google Chrome/Chromium
  • Инструменты разработчика (F12)
  • Нажмите кнопку меню справа от вкладки «Console» в нижней части панели инструментов разработчика и выберите «Network conditions»
  • На вкладке «Network conditions» снимите флажок «Select automatically» рядом с «User agent».
  • Затем вы можете выбрать пользовательский агент из списка или скопировать и вставить пользовательский агент в поле.
Firefox:
  • Ведите about:config в адресную строку Firefox и нажмите Enter.
  • Введите general.useragent.override в поле фильтра. Он, вероятно, не существует в вашей системе. Чтобы добавить эту настройку, переключитесь тип значения на «Строка» и нажмите + (плюс).
  • Введите желаемый пользовательский агент.
Если для сайта whatleaks.com ввести в качестве строки User Agent
Код:
<script>alert(1)</script>
То получим всплывающее окно alert.

xwhatleaks.png.pagespeed.ic.a1Kb1hCO2R.webp


Это сайт whatsmyuseragent.org:

xwhatsmyuseragent.png.pagespeed.ic.ChlJqgMgxM.webp


Это сайт getright.com/useragent.html

xgetright.png.pagespeed.ic.NyDsz5HJ1U.webp


Сайт manytools.org/http-html-text/user-agent-string/

xmanytools.png.pagespeed.ic.pfvW235QGv.webp


На сайт amiunique.org/fp нет XSS инъекции, но поломался JavaScript код.

amiunique.png


На самом деле, пользователь действительно может как угодно изменять показываемую ему страницу на лету. Если эту страницу кроме него никто не видит, то проблем нет. Другое дело, если значения User Agent сохраняются и затем могут сработать, то есть если значения User Agent сохраняются и затем показываются кому-либо ещё, например, владельцу сайта (скажем, при анализе статистики) или другим пользователям (например, виджете популярных или последних User Agent посетителей).

Как делать SQL-инъекцию через User Agent​

Вы тоже уже успели об этом подумать? Если программисты забывают о том, что User Agent'у не стоит доверять как абсолютно всему остальному, приходящему от пользователей, то значит там могут не фильтроваться теги и специальные символы? Пример этому мы уже увидели — на всех приведённых выше сайтах не фильтруется и не заменяются специальные символы в теге <script>.

А что если специальные символы тоже не фильтруются и значение User Agent сохраняется в базу данных? А это уже SQL-инъекция! Среди приложений, которые могут сохранять значения User Agent в базу данных: программы для сбора статистики веб-сайтов, метрики, виджеты «браузеры последних посетителей» и т. д.

В bWAPP есть пример инъекции через User Agent. Там она называется «SQL Injection - Stored (User-Agent)».

Если в качестве значения User Agent ввести что-нибудь вроде
Код:
Chrome'
То на выходе мы получим замечательное сообщение:
Код:
Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Chrome', '192.168.0.89')' at line 1
xuser-agent-sqli.png.pagespeed.ic.liY_g884fc.webp


Конечно же, там где SQLi, там и sqlmap. Чтобы протестировать SQL-инъекцию в User Agent используйте опцию --user-agent, в которой место инъекции укажите символом * (звёздочкой). Пример команды:
Код:
sqlmap -u 'http://192.168.0.96/bWAPP/sqli_17.php' --user-agent="Chrome*" --cookie 'PHPSESSID=a3400ca39ae4c6c1b25bb1eeb91c5410; security_level=0' --dbs
Конечно же, уязвимость найдена и выведен список баз данных:

xsqlmap.png.pagespeed.ic.lb77krCOUV.webp


На странице https://kali.tools/?p=816 вы найдёте ссылки на подробнейшие инструкции по sqlmap и скоро будет добавлена ещё одна — SQL инъекции в User Agent, Referer, Cookie и произвольные HTTP заголовки.

Как подменить User Agent в командной строке​

Чтобы поменять User Agent для утилиты cURL используйте опцию -A. Сравните вывод двух команд:
Код:
curl -I https://suip.biz
curl -I -A 'Chrome' https://suip.biz
curl-user-agent.png

Как подменить User Agent в Burp Suite​

В Burp Suite перейдите на вкладку «Proxy» → «Options», найдите раздел «Match and Replace» (совпадения и замена). Там уже присутствует несколько правил по замену User Agent для эмуляции запросов от различных устройств.
burp-suit-2.png

Вы можете включить имеющиеся правила или создать новое. Для создания нового нажмите кнопку «Add».
В качестве «Type» выберите «Request header».
В качестве значения поля «Match» укажите
Код:
^User-Agent.*$
В поле «Replace» впишите значение, на которое будет заменён HTTP заголовок пользовательского агента. Обратите внимания, что поскольку мы заменяем заголовок целиком, то начинаться он должен со строки «User-Agent: ».
В поле «Comment» впишите любой комментарий, чтобы быстро вспомнить, для чего нужен этот заголовок.
Поставьте галочку «Regex match».
burp-suit.png


Включите его поставив галочку в столбце «Enabled».
burpsuit.png

По умолчанию Burp Suite в качестве прокси прослушивает localhost:8080.

С cURL можно использовать опцию -x, чтобы отправить запрос через Burp Suite, например:
Код:
curl -x http://localhost:8080 -A 'Any User Agent' --cookie 'security_level=0; PHPSESSID=46d368f57a7c0e17905377f07846b5b0' 'http://192.168.0.96/bWAPP/sqli_17.php'
Как можно увидеть, значение заголовка User Agent было заменено и мы получили сообщение об ошибке, которая может означать SQL-инъекцию.
burp-suit-target.png


User-Agent Impersonation​

В OWASP Mutillidae II есть задание «User-Agent Impersonation». У вас это задание будет по адресу http://localhost/mutillidae/index.php?page=user-agent-impersonation.php.
user-agent-impersonation.png

На этой странице нам показывают сообщение:
Код:
Sorry. You do not look like an Apple iPad using Safari Browser.
This page uses JavaScript browser and O/S fingerprinting to decide if the user-agent is allowed.
Дальше есть вариант моего решения, но я рекомендую самостоятельно решить этот пример — он не такой простой, как кажется.

Данный пример готовился как самый первый в этой статье, поскольку обход проверки кажется элементарным. Казалось бы, выбираем в Инструментах разработчика правильный User Agent, вроде такого
Код:
Mozilla/5.0 (iPad; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1
и задание пройдено.

Но что-то пошло не так:

mutillidae.png

Страница никак не хочет принимать подходящий под условие User Agent.

Я посмотрел исходный код и обнаружил там:
Код:
if(
        window.navigator.platform === "iPad" &&
        window.navigator.appName === "Netscape" &&
        window.navigator.appCodeName === "Mozilla" &&
        window.navigator.appVersion.indexOf("iPad") !== -1 &&
        window.navigator.appVersion.indexOf("Mac") !== -1 &&
        window.navigator.appVersion.indexOf("AppleWebKit") !== -1 &&
        window.navigator.appVersion.indexOf("Safari") !== -1 &&
        window.navigator.product === "Gecko" &&
        window.navigator.productSub === "20030107"
){
    lResultTD.innerHTML = "Congratulations. You look like an iPad using Safari Browser to me.";
    lResultTD.className = "success-header";
}else{
    lResultTD.innerHTML = "Sorry. You do not look like an Apple iPad using Safari Browser.<br />This page uses JavaScript browser and O/S fingerprinting to decide if the user-agent is allowed.";
    lResultTD.className = "error-header";
}
Я не знаю, насколько всё в порядке с этим кодом, возможно, в современных браузерах он просто неадекватен. Но можно заметить, что очень легко поломать логику всех этих многочисленных проверок добавив в конце « || 1» что означает «ИЛИ истина». То есть независимо от того, какой будет результат всех предыдущих проверок, это условие всё равно всегда будет возвращать «Истина».

Я воспользовался методом
Код:
if(
        window.navigator.platform === "iPad" &&
        window.navigator.appName === "Netscape" &&
        window.navigator.appCodeName === "Mozilla" &&
        window.navigator.appVersion.indexOf("iPad") !== -1 &&
        window.navigator.appVersion.indexOf("Mac") !== -1 &&
        window.navigator.appVersion.indexOf("AppleWebKit") !== -1 &&
        window.navigator.appVersion.indexOf("Safari") !== -1 &&
        window.navigator.product === "Gecko" &&
        window.navigator.productSub === "20030107" || 1
)
Такой подход устроил механизм проверки Пользовательского Агента и задание пройдено.

Автор Alexey
источник hackware.ru
Если через отпечаток есть возможность атаки, то полагаю и через куки тоже? Ведь не все ресурсы записывают отпечаток. Касательно печенья я нашел несколько зарубежных статей, но информация устаревшая. Хотел бы лично у вас спросить, вы знакомы с таким видом атаки? Не могли бы вы рассказать о ней?
 
|| 1
С таким же успехом можно было просто удалить весь javascript и в html записать нужный текст...
Смысл задания — обойти проверку, а не отключать код проверки. Это не решение.
 
Если через отпечаток есть возможность атаки, то полагаю и через куки тоже? Ведь не все ресурсы записывают отпечаток. Касательно печенья я нашел несколько зарубежных статей, но информация устаревшая. Хотел бы лично у вас спросить, вы знакомы с таким видом атаки? Не могли бы вы рассказать о ней?
Да, конечно, куки зачастую сохраняют в бд для отслеживания поведения юезеров на сайте. Вы можете ознакомиться с данным типом атак, пройдя лабораторны порсвиггера по слепым скулям.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх