vyvchy
    Теми розділу

    11 · Security для QA

    SSRF, завантаження файлів і XXE

    Зміст

    Три різні рядки — URL у полі «підтягнути картинку за посиланням», імʼя файлу у формі завантаження, XML у тілі запиту. Спільне в них одне: кожен керує дією, яку виконує сервер — сходити мережею, записати файл на диск, розібрати документ. А серверна дія успадковує все, що має сервер: місце всередині периметра, права у файловій системі, довіру сусідніх сервісів. не пробиває мережеву межу — він просить застосунок зробити це за нього.

    Для QA це клас, де функціональна перевірка не бачить нічого: картинка підтягнулась, файл прийнявся, XML розібрався, статус 200. Ця глава — канонічний виклад , завантаження файлів, , , , й : інші глави посилаються сюди. Межі: категорія — глава Авторизація та контроль доступу, хибна конфігурація — глава Security misconfiguration і розкриття даних, механіка відсоткового кодування — глава URL і кодування.

    SSRF: запит, який робить сам сервер

    SSRF (Server-Side Request Forgery) — слабкість, за якої вебсервер отримує URL від компонента вище за потоком, тягне вміст за цим URL і недостатньо перевіряє, що запит іде саме туди, куди мав би. OWASP описує те саме з боку : це вектор, який зловживає застосунком, щоб той сам сходив у внутрішню чи зовнішню мережу або на власну машину. У старих матеріалах трапляється синонім XSPA (Cross Site Port Attack).

    Чому це працює, видно з одного речення каталогу слабкостей: підставивши URL на несподіваний хост чи порт, атакувальник робить запит таким, ніби його шле сервер, — і так може обійти контроль доступу на кшталт файрвола, який не пускає його туди напряму. Далі сервер працює як : сканування портів усередині мережі, читання локальних файлів через file://, протоколи на кшталт gopher:// чи tftp://, що дають більше контролю над вмістом запиту. Цілі названо поіменно — внутрішні адмінпанелі, хмарних метаданих, локальні сервіси на localhost. Перший запит при цьому зазвичай HTTP, а другий застосунок може зробити іншою схемою (file://, phar://, gopher://, data://, dict://), тож перевірка «а це взагалі http(s)-адреса?» — окремий крок.

    У хмарі SSRF типово використовують, щоб викрасти облікові дані й токени доступу із (instance metadata service) — AWS, Azure, GCP. Мінімум, який блокують у , — адреса 169.254.169.254 і доменне імʼя metadata.amazonaws.com. IMDSv2 в AWS названо додатковим шаром (defence in depth), який помʼякшує частину випадків, а не закриває клас.

    Сервіс метаданихЗастосунокАтакувальникСервіс метаданихЗастосунокАтакувальникФайрвол не спрацював —запит зробив довірений серверURL у параметрі:http://169.254.169.254/...запит іде від імені сервераоблікові дані й токенивміст у відповіді застосункуСервіс метаданихЗастосунокАтакувальникСервіс метаданихЗастосунокАтакувальникФайрвол не спрацював —запит зробив довірений серверURL у параметрі:http://169.254.169.254/...запит іде від імені сервераоблікові дані й токенивміст у відповіді застосунку

    SSRF у редакції 2025: чому це контроль доступу

    У :2025 окремої категорії SSRF немає: зламаний контроль доступу (Broken Access Control) лишається №1, і SSRF влито саме в нього. Провідні категорії названо поіменно — розкриття чутливої інформації неавторизованому , розкриття через надіслані дані, CWE-918 SSRF і CSRF; тобто обидві «підробки запиту» тепер живуть усередині контролю доступу. Поруч стоїть цифра, яку варто читати правильно: 100% протестованих застосунків мали ту чи іншу форму зламаного контролю доступу — це частка застосунків, а не частка інцидентів.

    Переїзд зафіксовано з двох боків. Каталог слабкостей показує його у власному записі: CWE-918 належав до категорії A10:2021 «Server-Side Request Forgery», а тепер належить до A01:2025 «Broken Access Control». SSRF не зник — він переїхав, тож відповідь «SSRF — це A10» без згадки року вже застаріла. Ще одна деталь каталогу корисна для пріоритизації: ordinality SSRF — Resultant, слабкість зазвичай виникає внаслідок присутності інших слабкостей, тож у розборі інциденту вона стоїть після причини, а не поруч із нею.

    Захист від SSRF: два випадки й два рівні

    OWASP розводить сценарії за однією ознакою — чи можливий . Якщо застосунок ходить лише до відомих і довірених застосунків, список дозволеного будується. Якщо ж він може звертатися до будь-якої зовнішньої IP чи домену — типовий приклад тут вебхуки, бо перелік адрес наперед невідомий і динамічно змінюється, — лишається deny-list, і джерело чесно називає межу: він не є непроникною стіною, це найкраще з доступного в цьому сценарії. Вимога до нього жорстка: фільтр мусить розпізнавати приватні діапазони, localhost і link-local адреси — і для IPv4, і для IPv6. Пріоритет незмінний: deny-list схильні до обходу, віддавати перевагу треба allow-list.

    На рівні застосунку перший захід — через allow-list, бо очікуваний формат даних здебільшого відомий наперед. Три вимоги, які й провалюються:

    • Повний URL від користувача не приймають узагалі — його важко валідувати, а парсером можна зловживати залежно від технології; якщо адреса потрібна, приймають лише валідну IP або доменне імʼя.
    • Слідування редиректам вимикають — інакше дозволена адреса з редиректом на заборонену проводить запит повз уже пройдену валідацію.
    • DNS-резолв — окремий вектор: ним атакувальник привʼязує легітимне доменне імʼя до внутрішньої IP-адреси.

    Рівень мережі обмежує застосунок дозволеними маршрутами, щоб він фізично не міг звернутися до довільної цілі; роблять на обох рівнях разом — це і є defense in depth. Автоматика допомагає частково: (сам метод — глава Статичне тестування і ревʼю), у безпековій рамці званий (Static Application Security Testing), аналізує код без виконання й знаходить деякі входження цієї слабкості. «Деякі» — модальність джерела, а не наше застереження: чистий звіт сканера відсутності класу не доводить.

    Небезпечне завантаження файлів

    Вимогу сформульовано як обовʼязок застосунку, а не користувача: він має вміти відбивати підроблені й шкідливі файли, щоб і сам він, і його користувачі лишалися в безпеці. Головне застереження стоїть до будь-якого чеклиста: срібної кулі у валідації користувацького вмісту немає — захист будується як defense in depth із кількох технік одночасно.

    Шкідливий файл експлуатує парсер або модуль обробки (серед прикладів — XXE), бʼє по доступності ZIP-бомбами, XML-бомбами (billion laughs) чи просто величезним розміром, перезаписує наявний файл або несе активний клієнтський вміст, небезпечний для інших користувачів, якщо файли публічні. Сама публічна доступність додає ще два ризики — розкриття чужих файлів і DoS на асиметрії, коли запити маленькі, а відповіді значно більші.

    Перелік заходів джерело подає одним абзацом: allow-list розширень (лише критичні для бізнес-функції); валідація вводу перед перевіркою розширення; недовіра до Content-Type; імʼя файлу, згенероване застосунком; ліміт розміру; лише авторизовані користувачі; зберігання на іншому сервері, а якщо неможливо — поза webroot. Туди ж входять антивірус або для вмісту й захист самої форми від CSRF.

    Ламається це зазвичай у трьох місцях:

    • Розширення. Валідація виконується після декодування імені й має витримувати відомі обходи: подвійне розширення .jpg.php обходить регулярку на \.jpg, а нульовий байт у .php%00.jpg відрізає .jpg, і новим розширенням стає .php. Блокування конкретних розширень саме собою — слабкий метод; канон вимагає allow-list типів і розширень, а виконувані серверні скрипти (asp, aspx, jsp, php, pl, cgi, js, shtml та інші з переліку) не приймати взагалі.
    • Content-Type. Заголовок задає користувач, підробити його тривіально — для безпеки він не годиться; лишається йому роль швидкої перевірки від ненавмисної помилки з типом.
    • Імʼя. Його генерує застосунок — випадковий рядок на кшталт UUID, і це названо обовʼязковим заходом. Якщо користувацьке імʼя потрібне бізнесу, воно валідується окремо під клієнтські вектори (активний вміст → XSS) і серверні (перезапис чи створення особливих файлів), а провідні й послідовні крапки обмежуються явно.

    Вміст і місце: для зображень надійний захід — перезапис зображення (image rewriting), який знищує вкладений у картинку шкідливий вміст; ZIP приймати не рекомендовано взагалі; зберігати краще на окремому хості з повним розділенням обовʼязків, інакше поза webroot із доступом лише адміністратора й правами за принципом . Пастка, яку легко проґавити: ліміт розміру рахується після розпакування — саме тому ZIP-бомба проходить крізь ліміт на розмір архіву. Доступ до самої функції — дві різні перевірки, і жодна не заміняє іншу: користувач має бути зареєстрованим або принаймні ідентифікованим і мати права на ці файли. А не є «файл завантажився»: джерело описує наслідки — виконання завантаженого, перезапис чужого файлу, XSS в іншого користувача.

    Path traversal: вихід за межі каталогу

    Path traversal — слабкість, за якої продукт будує шлях із зовнішнього вводу, шлях має вказувати на файл під обмежувальною батьківською директорією, але спецелементи в ньому не нейтралізовано — і шлях резолвиться поза цією директорією. Механізм: спецелементами .. і роздільниками / атакувальник виходить за межі обмеженого розташування; для вебсервера ця межа — web document root, фізична директорія, у якій сервер намагається замкнути файли користувачів.

    Форм дві, і в другої немає жодного ../: відносний traversal — послідовність ../, яку більшість сучасних ОС читає як батьківську директорію; абсолютний — підстановка абсолютного шляху на кшталт /usr/local/bin. Тобто «у пейлоаді немає ../» не означає «traversal немає». MITRE додає термінологічну тонкість: і «path traversal», і «directory traversal» описують атаку, а не саму слабкість; перелічує ті самі синоніми — dot-dot-slash, directory climbing, backtracking.

    Наслідки зачіпають усі три властивості: читання чужих файлів (а якщо прочитаний файл обслуговує механізм безпеки — механізм обходиться); запис, яким створюють або перезаписують критичні файли, що система сама виконує; і доступність, бо перезапис чи видалення таких файлів здатні зупинити продукт. Веб додає четверте — підключення скриптів із зовнішніх сайтів (remote file include).

    ../ розгортає сама ОС під час канонізації шляху: застосунок «нічого не робить», а відкривається інший файл; дефект не в конкатенації, а у відсутності перевірки параметра, який туди потрапляє. Для успіху потрібні дві умови разом — провалена валідація і достатні права застосунку на цільовий файл.

    Кодування — окремий вимір, і саме на ньому ламається більшість фільтрів. Перелік схем, які WSTG вимагає перебрати, починається з URL-кодування й подвійного URL-кодування: %2e%2e%2f і ..%2f — це той самий ../; нульовий байт %00 названо окремо як спосіб обійти контроль розширення; Unicode/UTF-8-кодування працює лише там, де система приймає надлишково довгі UTF-8-послідовності. Правило звідти пряме: типова помилка розробника — врахувати лише базове кодування, тож не спрацював рядок — міняй схему кодування, а не висновок.

    Так

    Ні

    Ввід із параметра

    Декодування

    Канонізація шляху:
    realpath і аналоги

    Шлях усередині
    дозволеної директорії?

    Файлова операція

    Відкинути ввід

    Валідація ДО декодування

    %2e%2e%2f проходить
    як нешкідливий текст

    Так

    Ні

    Ввід із параметра

    Декодування

    Канонізація шляху:
    realpath і аналоги

    Шлях усередині
    дозволеної директорії?

    Файлова операція

    Відкинути ввід

    Валідація ДО декодування

    %2e%2e%2f проходить
    як нешкідливий текст

    Захист. Базова стратегія — «accept known good»: список прийнятних значень, що строго відповідають специфікації; для імен файлів це allow-list символів, щонайбільше одна крапка в імені, виключені роздільники шляху, allow-list розширень. Порядок обовʼязковий: декодування й канонізація до внутрішнього представлення, і тільки потім валідація (подвійне декодування — окремий дефект). Правильний інструмент — вбудована канонізація шляху (realpath() і аналоги), яка знімає і .., і символьні посилання. «Вирізати небезпечні символи» — це deny-list, і він неповний: фільтр на / не рятує там, де роздільником працює й \, а рядок .../...// після одноразового вирізання складається назад у ../. Клієнтська перевірка не рахується. Найсильніший захід — не пускати шлях від користувача взагалі: мапа «фіксований ID → реальний файл», а шлях зберігання задає сервер; службові файли й бібліотеки лежать поза web document root.

    Дві межі методики. Тест залежить від платформи: просити /etc/passwd в IIS немає сенсу, тож негативний результат без знання системи нічого не доводить. Частина дефектів цього класу без доступу до коду не знаходиться взагалі — WSTG радить у шукати вектори грепом по інклюд-функціях і файлових операціях, окремо переглядаючи функції, що «лагодять» невалідний ввід замість відкидати; інструменти гайд називає поіменно — DotDotPwn, набори fuzz-рядків із WFuzz, OWASP , . Окремий випадок — traversal другого порядку: рядок кладеться в базу, а спрацьовує пізніше, коли параметр усередині інклюд-функції «виглядає внутрішнім і безпечним».

    XXE: зовнішні сутності XML

    XXE (XML eXternal Entities) — слабкість, за якої продукт обробляє XML-документ із сутностями, чиї URI резолвляться в документи поза задуманою сферою контролю, і вбудовує чужі документи у власний вивід. OWASP формулює те саме парою умов: XXE стається, коли недовірений XML із посиланням на зовнішню сутність обробляє слабко налаштований XML-парсер.

    Механізм закладений у самому форматі — тому це не «баг парсера», а його штатна можливість, залишена ввімкненою. Каталог слабкостей описує ланцюг так: XML-документ може містити DTD, DTD дозволяє оголосити сутність через підстановку у формі URI, а парсер має право сходити за цим URI й підставити вміст назад у документ.

    Наслідків три. Читання довільних файлів: сутність зі схемою file:// змушує застосунок прочитати локальний файл, а витік стається там, де застосунок віддає прочитане назад — зокрема в тексті повідомлення про помилку. Вихідні запити руками застосунку: схема http:// дає обхід обмежень файрвола, приховане сканування портів і зловживання довірою сервера до сусідів. в обслуговуванні: URI на величезний файл або на пристрій, що завжди віддає дані, плюс вкладені рекурсивні посилання на сутності. Матриця наслідків OWASP додає критичне для тестування: дозволене завантаження зовнішніх DTD дає (Blind XXE) — результату у видимій відповіді немає взагалі.

    Межа з SSRF: обидві слабкості породжують вихідні запити в неочікувані призначення, і вразливий до XXE застосунок експлуатують саме для того, щоб виконати SSRF-атаку. Але XXE буває й на клієнті або в контекстах, де ПЗ не виступає сервером, тож частина «Server» з абревіатури SSRF до такого випадку не завжди застосовна; класифікаційно XXE — Primary проти Resultant у SSRF.

    Захист конфігураційний, і питання до системи ставиться не «чи є XXE», а «які налаштування парсера». Найнадійніше — повністю вимкнути DTD, що заразом закриває DoS типу billion laughs; якщо не можна, окремо вимикають зовнішні сутності й зовнішні оголошення типу документа. Мінімальний чекліст харденінгу читається як готовий перелік перевірок: вимкнути DOCTYPE, зовнішні сутності, завантаження зовнішніх DTD і XInclude; увімкнути secure processing; обмежити розкриття сутностей; не брати застарілі парсери; ніколи не парсити недовірений XML із дефолтними налаштуваннями.

    Дефолти залежать від платформи, і це предмет перевірки: у Java більшість XML-парсерів мають XXE увімкненим за замовчуванням, а FEATURE_SECURE_PROCESSING поводиться по-різному в різних реалізаціях — від вичерпання ресурсів може допомогти, а від розкриття сутностей рятує не завжди; PHP 8.0 і новіші з дефолтним парсером (libxml2) блокують XXE самі. Версія рантайму змінює вердикт, тож результат перевірки привʼязується до неї; сторонні бібліотеки теж парсять XML і перевіряються окремо.

    Місце в мапі ризиків змінилося так само, як у SSRF: у редакції 2017 XXE мав власну категорію A4, а в редакції 2025 віднесений до A02 Security Misconfiguration, де CWE-611 названо серед провідних CWE категорії. Логіка переїзду видна з механізму — ламає не код, а налаштування; помʼякшення теж конфігураційне: багато парсерів можна налаштувати так, щоб розкриття зовнішніх сутностей було вимкнене.

    Валідація на сервері: allow-list проти deny-list

    Валідація вводу ( validation) — перевірка, що в обробку потрапляють лише коректно сформовані дані, виконувана якомога раніше, бажано одразу на прийомі від зовнішньої сторони. Межу OWASP називає сам: валідація вводу не є основним методом запобігання XSS чи SQL-інʼєкції. Для тем цієї глави ситуація дзеркальна — тут вона названа саме першим заходом.

    Рівнів два: синтаксичний (правильний синтаксис структурованих полів — номер, дата, символ валюти) і семантичний (коректність значень у бізнес-контексті: дата початку раніша за дату кінця, ціна в очікуваному діапазоні). Потрібні обидва, бо формально валідна дата може бути беззмістовною в сценарії. І недовіреним джерелом є не лише браузер: валідують дані з бекенд-фідів від постачальників, партнерів і вендорів.

    Allow-list описує рівно те, що дозволено, і все інше за визначенням заборонене; підхід доречний для всіх полів вводу від користувача, а найпростіша його форма — масив дозволених значень. Deny-list — перелік відомих небезпечних шаблонів, і позиція джерела однозначна: ловити «небезпечні» символи (', 1=1) — украй хибний підхід, бо такі фільтри тривіально обходяться, а на легітимних даних дають хибні спрацювання (класика — прізвище O'Brian, де апостроф законний). Роль, яку джерело за deny-list лишає, — додатковий шар, що доповнює, а не заміщає allow-list; винятком лишається вузький випадок, коли allow-list неможливий за природою функції.

    Валідацію реалізують на сервері, до того як дані потраплять у функції застосунку: будь-яку перевірку на JavaScript обходять вимкненим JS або вебпроксі. Рекомендований підхід — обидві: клієнтська для UX, серверна для безпеки. І деталь, яку варто нести в баг-репорт: якщо поле походить із фіксованого набору (випадний список, радіокнопки), невідповідність на сервері — подія високої критичності, яку логують як таку, бо вона свідчить про втручання в клієнтський код.

    // Playwright: та сама вимога повз UI має відхилятися сервером
    const res = await request.post('/api/orders', {
      data: { deliveryOption: 'FREE_OVERNIGHT' }, // варіанта немає у списку опцій
    });
    
    expect(res.ok()).toBeFalsy();

    Техніки складаються в готовий набір негативних перевірок: діапазон для чисел і дат, мінімальна й максимальна довжина рядків, дозволений набір символів. Для вільного тексту першим кроком іде нормалізація, а allow-list для Unicode будується за категоріями символів («літери», «десяткові цифри»), що покриває не лише латиницю. Порядок кроків обовʼязковий: ввід декодують і канонізують перед валідацією й не декодують двічі.

    Сусідні класи: відкритий редирект і небезпечна десеріалізація

    Відкритий редирект (open redirect). Неперевірені редиректи й форварди можливі там, де застосунок приймає недовірений ввід, здатний змусити його перенаправити запит на URL із цього вводу; змінивши адресу на шкідливий сайт, атакувальник розкручує фішинг і краде облікові дані. Ефективність — саме в довірі: імʼя сервера в підробленому посиланні збігається з оригінальним сайтом, тож користувач бачить знайомий домен і не здогадується про перенаправлення. Друга грань — обхід контролю доступу: підготовлений URL проходить перевірку й форвардить атакувальника до привілейованих функцій, тому для серверного форварду джерело вимагає перевіряти три речі — право користувача на цей URL, право на функції, які URL надає, і доречність самого запиту.

    Безпечним вважається редирект, чия адреса явно оголошена в коді й не піддається маніпуляції. Заходи подані за спаданням сили: не використовувати редиректи й форварди взагалі; не дозволяти URL як користувацький ввід для цілі; передавати коротке імʼя, ID або токен, який на сервері мапиться на повну адресу — хоч у цього кроку є власний ризик, названий відразу: перебором ID користувач дізнається всі можливі цілі. Якщо вводу не уникнути, значення перевіряють на валідність, доречність і право саме цього користувача, а санітизація робиться списком довірених адрес, побудованим як allow-list, а не як deny-list; запасний захід — проміжна сторінка з показаною ціллю, де перехід підтверджують кліком. Різницю з SSRF тримайте чіткою: тут перенаправляється запит користувача, і саме він не помічає підміни, а в SSRF запит робить сам застосунок; спільна в них лише проблема валідації URL, чию нетривіальність шпаргалка про редиректи визнає прямо, відсилаючи по деталі до шпаргалки про SSRF.

    Небезпечна десеріалізація (insecure deserialization). Серіалізація — перетворення обʼєкта у формат даних, який можна відновити пізніше; десеріалізація — зворотний хід. Дефект живе не в самій операції, а в рідних форматах мов: вони дають більше можливостей за JSON чи XML, зокрема кастомізацію самого процесу серіалізації, — і саме це обертають проти застосунку. Наслідком названо відмову в обслуговуванні, обхід контролю доступу або віддалене виконання коду.

    Канонічне питання до розробника одне: чи визначає тип обʼєкта сам потік даних. Перевірка типу після десеріалізації запізніла — у деяких типах код виконується просто під час неї, тож перевірку ставлять до відбудови обʼєкта. Найбільше зниження ризику дає відмова від рідних форматів на користь чистих даних; якщо перелік повідомлень відомий наперед, їх підписують і не десеріалізують без автентифікованого підпису. Аргумент «ми додали фільтр небезпечних класів» джерело знецінює наперед: нові класи-ґаджети знаходитимуть і далі. А дешева перевірка без доступу до коду — сигнатури в перехопленому трафіку: AC ED 00 05 у hex, префікс rO0 у , заголовок Content-Type: application/x-java-serialized-object; дані pickle у Base64 найімовірніше починаються з gASV.

    Типові помилки

    • «Ми валідуємо URL — SSRF закритий» → виглядає як захист, а насправді канон вимагає не приймати повний URL узагалі; до того ж редирект із дозволеної адреси й DNS-імʼя, привʼязане до внутрішньої IP, обходять уже пройдену перевірку.
    • «У пейлоаді немає ../ — traversal неможливий» → виглядає як негативний результат, а насправді абсолютний шлях дає той самий ефект без крапок, а %2e%2e%2f і ..%2f — це той самий ../ в іншому кодуванні.
    • «Файл завантажився зі статусом 200» → виглядає як пройдений тест, а насправді оракулом є наслідок: виконання завантаженого, перезапис чужого файлу, XSS в іншого користувача.
    • «Ліміт розміру стоїть» → виглядає як захист від бомб, а насправді рахувати треба розмір після розпакування — інакше ZIP-бомба проходить крізь ліміт на архів.
    • «Відповідь порожня — XXE немає» → виглядає як негативний результат, а насправді дозволене завантаження зовнішніх DTD дає сліпий XXE, у якого видимого результату не буває за побудовою.
    • «Фільтр небезпечних символів є» → виглядає як валідація, а насправді це deny-list: він обходиться й ламає легітимні дані на кшталт O'Brian, тоді як канон — allow-list.
    • «Сканер пройшов чисто» → виглядає як доказ, а насправді SAST знаходить лише деякі входження слабкості, а частина дефектів цього класу без доступу до коду не знаходиться взагалі.

    Підсумок

    • Спільний корінь усіх тем глави — недовірений рядок, який керує серверною дією. URL, імʼя файлу і XML різні за синтаксисом, але однакові за наслідком: дію виконує сервер, і вона успадковує його права та місце в мережі.
    • У редакції 2025 ні SSRF, ні XXE не мають власної категорії: SSRF влито в A01 Broken Access Control, XXE — в A02 Security Misconfiguration. Обидва переїзди зафіксовані і в списку, і в записах каталогу, тож категорію називайте з роком редакції.
    • Захист будується на сервері й за списком дозволеного. Повний URL від користувача не приймають, шлях від користувача не пускають у файлову операцію, розширення й типи задає allow-list; deny-list лишається додатковим шаром і стає основним лише там, де перелік дозволеного невідомий наперед.
    • Порядок кроків важить не менше за самі перевірки. Декодування й канонізація йдуть перед валідацією, ліміт розміру рахується після розпакування, перевірка типу при десеріалізації ставиться до відбудови обʼєкта.
    • Негативний результат тут слабкий за побудовою. Сліпий XXE не має видимої відповіді, traversal залежить від платформи, SAST знаходить лише частину входжень — тож «не відтворилося» без контексту системи не доводить нічого.

    Можливі питання

    • «Що таке SSRF і чим він небезпечний, якщо застосунок і так ходить у мережу?» — перевіряють, чи бачите ви суть: небезпечна не сама вихідна дія, а те, від чийого імені вона виконується. Сильна відповідь говорить про запит із довіреного сервера, що обходить контроль на кшталт файрвола, і називає типові цілі — внутрішні адмінки, localhost, сервіс метаданих.
    • «До якої категорії OWASP Top 10 належить SSRF?» — питання-датчик актуальності знань. Чекають згадку редакції: власна категорія A10 у 2021, а в 2025 — усередині A01 Broken Access Control.
    • «Як ви перевірятимете форму завантаження файлів?» — чекають не «завантажу .exe», а перелік вимірів: розширення й два класичні обходи, недовіра до Content-Type, імʼя й місце зберігання, ліміт після розпакування, права на саму функцію — і оракул за наслідком, а не за статусом відповіді.
    • «Фільтр вирізає ../. Цього досить?» — пастка на однослівне «так». Сильна відповідь називає абсолютні шляхи, , %00, рядок .../...//, який складається назад, і правильний порядок: декодувати й канонізувати, потім валідувати.
    • «Що таке XXE і чому його відносять до хибної конфігурації?» — на розуміння, що механізм штатний: DTD із зовнішньою сутністю, а парсер із увімкненим дефолтним резолвером сутностей її підтягує, тож питання не «чи є дефект у коді», а «як налаштований парсер» — і відповідь залежить від платформи й версії рантайму.
    • «Чим відкритий редирект відрізняється від SSRF?» — на точність меж: у першому перенаправляється запит користувача, у другому запит робить сам застосунок; спільна в них лише проблема валідації URL.

    Джерела

    SSRF: запит, який робить сам сервер

    SSRF у редакції 2025: чому це контроль доступу

    Захист від SSRF: два випадки й два рівні

    Небезпечне завантаження файлів

    • OWASP Cheat Sheet — File Upload — обовʼязок застосунку й відсутність срібної кулі, шкідливого файлу, перелік заходів, обходи розширення, недовіра до Content-Type, генероване імʼя, перезапис зображення, місце зберігання, ліміт після розпакування, дві перевірки доступу.
    • OWASP Cheat Sheet — Input Validation — allow-list типів і розширень, перелік виконуваних серверних скриптів, заборона керованого користувачем тексту в імені на диску.

    Path traversal: вихід за межі каталогу

    • CWE-22 — Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal') — означення слабкості, відносна й абсолютна форми, термінологічна межа, наслідки за трьома властивостями, канонізація силами ОС, «accept known good», порядок «декодувати → валідувати», межі deny-list і мапа замість шляху.
    • OWASP WSTG — 4.5.1 Testing Directory Traversal File Include (WSTG-ATHZ-01) — web document root як межа, синоніми, remote file include, дві умови успіху, схеми кодування й правило «міняй кодування», залежність від платформи, gray-box і межа , названий інструментарій, traversal другого порядку.
    • OWASP Cheat Sheet — Input Validation — шлях зберігання задає сервер, а не клієнт.

    XXE: зовнішні сутності XML

    Валідація на сервері: allow-list проти deny-list

    • OWASP Cheat Sheet — Input Validation — мета й раннє місце валідації, її межа щодо XSS і , синтаксичний і семантичний рівні, недовірені бекенд-фіди, означення allow-list і deny-list з обома вадами, клієнт проти сервера, логування невідповідності як події високої критичності, техніки й категорії Unicode.
    • CWE-22 — Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal') — порядок «декодувати й канонізувати перед валідацією», дублювання клієнтських перевірок на сервері, мапа «ID → обʼєкт».
    • OWASP — Server-Side Request Forgery Prevention Cheat Sheet — перевага allow-list і вузька умова, за якої беруть deny-list.

    Сусідні класи: відкритий редирект і небезпечна десеріалізація

    • OWASP — Unvalidated Redirects and Forwards Cheat Sheet — означення й механіка фішингу, форвард повз контроль доступу і три перевірки, ознака безпечного редиректу, ієрархія заходів із ризиком перелічування, список довірених адрес як allow-list, проміжна сторінка, відсилання до шпаргалки про SSRF.
    • OWASP — Server-Side Request Forgery Prevention Cheat Sheet — запит робить сам застосунок, а повний URL від користувача не приймають.
    • OWASP — Deserialization Cheat Sheet — означення серіалізації й десеріалізації, ризик рідних форматів, наслідки, правило про тип із потоку, перевірка до відбудови обʼєкта, підпис даних, приреченість deny-list, сигнатури в трафіку.

    Пояснення

    «Поясни» працює з власним API-ключем Anthropic: запит іде з вашого браузера прямо до Anthropic.

    Свій API-ключ (BYOK)

    Вставте власний ключ Anthropic — пояснення працюватиме на реальній моделі. Ключ зберігається лише у вашому браузері (localStorage), нікуди не надсилається, крім api.anthropic.com, і не логується.