ACME Corporation
Klientu portāla un API drošības projekts
- Testa logs
- 23. marts – 16. aprīlis 2026
- Testa veids
- Gray-box tīmeklis un API
- Mērķi
- portal.acme.example · api.acme.example
- Standarti
- OWASP WSTG · PTES · OSSTMM
- Speciālisti
- 2 (sertificēti)
- Klasifikācija
- TLP:AMBER+STRICT
1Kopsavilkums vadībai
Konteksts
OffSeq veica ACME klientu portāla un tā publiskā API gray-box drošības novērtējumu. Testēšana apvienoja automatizētu skenēšanu ar manuālu ievainojamību izmantošanu; autentificētā daļa tika sasniegta, izmantojot pagaidu portāla akreditācijas datus, ko nodrošināja klients.
Galvenie atklājumi
- Kritiska, neautentificēta SQL injekcija pieteikšanās API ļauj pilnībā apiet autentifikāciju un iegūt lasīšanas piekļuvi lietotāju krātuvei.
- Piekļuves kontroles kļūda (IDOR) ļauj jebkuram autentificētam lietotājam lejupielādēt katra klienta rēķinus — masveida datu atklāšanas ceļš.
- Dziļumaizsardzības trūkumi: nav satura drošības politikas (CSP), HSTS zem viena gada un ražošanā joprojām lietots, ārpus dzīves cikla esošs React komplekts.
Prioritārie ieteikumi
- Parametrizējiet visu datubāzes piekļuvi un pievienojiet vismazāko privilēģiju DB kontus; izturieties pret SQL injekciju kā pret P1 incidentu.
- Ieviesiet objektu līmeņa autorizāciju katram API resursam un pārejiet uz neuzskaitāmiem identifikatoriem.
- Izvietojiet CSP (report-only → enforce), paaugstiniet HSTS līdz ≥ 1 gadam ar preload un plānojiet React migrāciju.
Īsumā
Tika identificēti seši atklājumi: viens (1) Kritisks, viens (1) Augsts, viens (1) Vidējs, divi (2) Zemi un viens (1) Informatīvs. Kritiskais un Augstais atklājums tieši sasaistās ar klientu PII un finanšu ierakstu masveida atklāšanu.
2Ievainojamību kopsavilkums
| Nopietnība | Atrasti | Pieņemami | Slēdziens |
|---|---|---|---|
| Kritisks | 1 | 0 | Nepieņemami |
| Augsts | 1 | ≤ 1 | Pieļaujamās robežās |
| Vidējs | 1 | ≤ 3 | Pieļaujamās robežās |
| Zems | 2 | ≤ 7 | Pieļaujamās robežās |
| Informatīvs | 1 | — | — |
Viens Kritisks atklājums pārsniedz pieņemamo slieksni, nosakot kopējo “nepieciešama novēršana” slēdzienu neatkarīgi no pārējām kategorijām.
3OWASP Top 10 (2025) pārklājums
- A01:2025 Bojāta piekļuves kontrole IDOR uz /v1/invoices Neatbilst
- A02:2025 Drošības konfigurācijas kļūdas Trūkst CSP, īss HSTS Neatbilst
- A03:2025 Programmatūras piegādes ķēdes kļūmes Ārpus dzīves cikla React 16.13.1 Neatbilst
- A04:2025 Kriptogrāfijas kļūmes Atbilst
- A05:2025 Injekcija SQL injekcija autentifikācijas API Neatbilst
- A06:2025 Nedrošs dizains Atbilst
- A07:2025 Autentifikācijas kļūmes Atbilst
- A08:2025 Programmatūras vai datu integritātes kļūmes Atbilst
- A09:2025 Žurnalēšanas un brīdināšanas kļūmes Ārpus šī projekta apjoma N/P
- A10:2025 Izņēmuma situāciju nepareiza apstrāde Atbilst
4Rekognoscēšana
Pasīvā rekognoscēšana kataloģizēja portāla publisko uzbrukuma virsmu. Trīs apakšdomēni atrisinās uz portāla avotu aiz CloudFlare; viens administratīvais resursdators atrisinās tieši, pilnībā apejot WAF.
| Resursdators | IP | Piezīme |
|---|---|---|
| portal.acme.example | 203.0.113.10 | Galvenais portāls · aiz CloudFlare |
| api.acme.example | 203.0.113.11 | Publiskais API |
| admin.acme.example | 203.0.113.12 | Tiešais avots — apiet WAF |
| status.acme.example | 203.0.113.13 | Statusa lapa · detalizēti būvējuma metadati |
- Statusa lapa publicē detalizētus būvējuma metadatus (git SHA, būvējuma datums).
- Divi staging apakšdomēni (stg-*) bija aktīvi testa loga laikā.
5Atklājumi
Seši reprezentatīvi atklājumi, sakārtoti pēc nopietnības. Katrs ir atkārtojams un sasaistīts ar labojumu.
Neviens atklājums neatbilst filtram.
- OS-01
Neautentificēta SQL injekcija portāla autentifikācijas API
Kritisks Atvērts A05:2025 CWE-899.8CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:HCVSS 3.1Pieteikšanās galapunkta lauks `email` tiek tieši savienots SQL vaicājumā bez parametrizācijas. Uz laiku balstīta akla injekcija apstiprina kļūdu un ļauj gan apiet autentifikāciju, gan patvaļīgi lasīt tabulu `users` — ieskaitot e-pasta adreses, lomas un bcrypt paroļu jaucējvērtības.
Skartie
- POST https://api.acme.example/v1/auth/login
Ietekme
Neautentificēts uzbrucējs var pieteikties kā jebkurš lietotājs (ieskaitot administratorus) un izvilkt visu klientu identitātes krātuvi. Tas ir viena pieprasījuma ceļš uz pilnu konta pārņemšanu un ziņojams personas datu pārkāpums saskaņā ar GDPR.
Tehniskā detaļa
5 sekunžu atbildes aizture uz zemāk redzamās slodzes, salīdzinot ar tūlītēju atbildi uz kontroles vaicājumu, apstiprina uz laiku balstītu aklu injekciju:
HTTP pieprasījums
POST /v1/auth/login HTTP/2 Host: api.acme.example Content-Type: application/json {"email":"x' OR (SELECT 1 FROM (SELECT SLEEP(5))a)-- -","password":"x"}HTTP atbilde
HTTP/2 200 content-type: application/json x-response-time: 5024ms {"token":"eyJhbG...","role":"admin"}Novēršana
Aizstājiet visus ar virkņu savienošanu veidotos vaicājumus ar parametrizētiem priekšapstrādātiem vaicājumiem. Palaidiet aplikāciju ar vismazāko privilēģiju datubāzes kontu, pievienojiet pozitīvas validācijas ievades filtru un izvietojiet WAF noteikumu kā kompensējošu kontroli, kamēr labojums tiek piegādāts. Nomainiet visus akreditācijas datus, kas varētu būt atklāti.
sqlmap identified the following injection point: Parameter: email (JSON) Type: time-based blind Title: MySQL >= 5.0.12 AND time-based blind (SLEEP) available databases [2]: acme_portal, information_schema Database: acme_portal Table: users [48,213 entries]sqlmap apstiprinājums (rediģēts) - OS-02
Bojāta piekļuves kontrole atklāj katra klienta rēķinus (IDOR)
Augsts Atvērts A01:2025 CWE-6398.1CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:NCVSS 3.1Rēķinu ieraksti tiek adresēti ar secīgu veselu skaitļu ID un pasniegti bez jebkādas īpašumtiesību pārbaudes. Jebkurš autentificēts lietotājs var palielināt identifikatoru, lai uzskaitītu un lejupielādētu citiem klientiem piederošus rēķinus, no kuriem katrs satur vārdus, adreses un maksājumu kopsavilkumus.
Skartie
- GET https://api.acme.example/v1/invoices/{id}
Ietekme
Viens zema privilēģiju konts var savākt visu klientu bāzes rēķinu vēsturi — liela mēroga personas un finanšu datu atklāšana un GDPR ziņojams pārkāpums.
HTTP pieprasījums
GET /v1/invoices/100245 HTTP/2 Host: api.acme.example Authorization: Bearer <attacker-session>HTTP atbilde
HTTP/2 200 content-type: application/pdf content-disposition: attachment; filename="invoice-100245.pdf" %PDF-1.7 (rēķins *citam* klientam)Novēršana
Ieviesiet objektu līmeņa autorizāciju katram pieprasījumam — pārbaudiet servera pusē, ka autentificētais subjekts ir pieprasītā resursa īpašnieks. Aizstājiet secīgos ID ar neuzskaitāmiem identifikatoriem (UUIDv4) un piemērojiet noklusēti-liegtu piekļuves kontroli.
for id in $(seq 100240 100260); do curl -s -o "inv-$id.pdf" -w "%{http_code}\n" \ -H "Authorization: Bearer $T" \ https://api.acme.example/v1/invoices/$id done # 21/21 atgrieza HTTP 200 — neviens nepiederēja testa kontam.Uzskaites cikls (mēroga pierādījums) - OS-03
Satura drošības politika (CSP) nav ieviesta
Vidējs Nepieciešama stiprināšana A02:2025 CWE-6934.0CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:L/A:NCVSS 3.1Aplikācija neatgriež `Content-Security-Policy` galveni nevienā lapā, kas novērota testēšanas laikā.
Skartie
- https://portal.acme.example/
- https://portal.acme.example/users/sign_in
- https://portal.acme.example/admin/*
Ietekme
Bez CSP pārlūks nevar ierobežot atstaroto vai uzglabāto XSS, trešo pušu skriptu ielādi no kompromitēta CDN vai datu izvilkšanu pēc veiksmīgas injekcijas. Tas noņem būtisku dziļumaizsardzības slāni.
HTTP atbilde
HTTP/2 200 content-type: text/html; charset=utf-8 strict-transport-security: max-age=15552000 x-frame-options: DENY x-content-type-options: nosniff (nav Content-Security-Policy galvenes)Novēršana
Izvietojiet stingru CSP, sākot ar pieteikšanās un administratora lapām, vispirms `Content-Security-Policy-Report-Only` režīmā, tad ieviešot piespiedu kārtā. Izvairieties no `unsafe-inline` skriptiem; izvēlieties nonces vai jaucējvērtības.
- OS-04
Novecojusi JavaScript bibliotēka — React 16.13.1
Zems Ieteicams atjauninājums A03:2025 CWE-1104Ražošanas komplekts piegādā React 16.13.1 (2020. gada marts), krietni pēc tā atbalstītā dzīves cikla. Lai gan tam nav zināmu tiešu CVE, ārpus dzīves cikla esoši ietvari mēdz vilkt līdzi vecākas tranzitīvas atkarības ar zināmām problēmām.
Skartie
- https://portal.acme.example/assets/application-90283b17.js
Ietekme
Neatbalstīta ietvara izmantošana palielina iespējamību, ka ražošanā nonāk neielāpota ievainojamība caur tranzitīvu atkarību.
Novēršana
Ieviesiet nepārtrauktu atkarību pārskati (Dependabot / Renovate), pievienojiet programmatūras sastāva analīzi (SCA) CI un plānojiet migrāciju uz React 18/19.
Atsauces
- OS-05
HSTS max-age ir zem viena gada
Zems Nepieciešama stiprināšana A02:2025 CWE-16Galvene `Strict-Transport-Security` tiek sūtīta ar `max-age=15552000` (180 dienas), kas ir zem viena gada minimuma, kas ieteicams HSTS preload.
Skartie
- https://portal.acme.example/
Ietekme
Īss `max-age` saīsina logu, kurā pārlūks atsakās no vienkārša HTTP, nedaudz paplašinot iespēju SSL-stripping uzbrukumam.
Novēršana
Iestatiet `Strict-Transport-Security: max-age=63072000; includeSubDomains; preload` un iesniedziet domēnu HSTS preload sarakstā.
Atsauces
- OS-06
Publiski pieejams rekursīvs DNS atrisinātājs
Informatīvs InformatīvsPortāla resursdators atbild uz rekursīviem DNS vaicājumiem par svešām zonām no neautorizētām avota adresēm (iestatīti RD+RA karodziņi).
Skartie
- 203.0.113.10:53
Ietekme
Atvērtos atrisinātājus var ļaunprātīgi izmantot kā pastiprinātājus atstarotos DDoS uzbrukumos pret trešajām pusēm. Nav tieša riska ACME datiem, reģistrēts pilnīguma labad.
Novēršana
Ierobežojiet UDP/TCP 53 perimetrā līdz autorizētiem klientiem vai atspējojiet rekursiju publiskajai saskarnei.
Uzbrukuma ceļš
Kā atklājumi sasaistās ielaušanā
Atsevišķi atklājumi nozīmē mazāk nekā tas, ko tie kopā ļauj sasniegt. Šī ir secība, ko mēs demonstrējām — no virsmas kartēšanas līdz masveida datu atklāšanai.
Rekognoscēšana
Kartēt virsmu
Kataloģizējām portālu, publisko API un administratora resursdatoru, kas atrisinās tieši — apejot CloudFlare WAF.
admin.acme.example atklāts
Sākotnējā piekļuve
Apiet autentifikāciju
Akla SQL injekcija pieteikšanās API atgriež derīgu administratora sesiju bez akreditācijas datiem.
Autentifikācijas apiešana · CVSS 9.8
Akreditācijas datu piekļuve
Izvilkt lietotāju krātuvi
Tā pati injekcija nolasa lietotāju tabulu — e-pastus, lomas un paroļu jaucējvērtības — tieši no datubāzes.
48k ierakstu atklāti
Bojāta piekļuves kontrole
Iziet cauri rēķiniem
Secīgi rēķinu ID bez īpašumtiesību pārbaudes ļauj jebkurai sesijai uzskaitīt un lejupielādēt katra klienta rēķinu.
Masveida PII / finanšu dati
Ietekme
Izvilkt masveidā
Apvienoti, tie dod viena pieprasījuma atspēriena punktu un automatizētu ceļu, lai nopludinātu klientu bāzi.
GDPR ziņojams pārkāpums
Demonstrētā ķēde · OS-01 → OS-02 · gray-box projekts, 2026. gada aprīlis
6Sociālā inženierija (pikšķerēšanas kampaņa)
Pret visiem ACME darbiniekiem tika veikta ar pretekstu balstīta portāla pieteikšanās pikšķerēšanas kampaņa. Galalapa klonēja korporatīvo pieteikšanās plūsmu; iesniegtie akreditācijas dati tika izmesti servera pusē.
22% akreditācijas datu iesniegšanas līmenis padara apziņas apmācību pamatotu un ieteicamu reizi ceturksnī, atkārtotos klikšķinātājus iesaistot mērķtiecīgā sekojošā darbā.
Reprezentatīvs izvilkums — pilns ziņojums aizņem 30–60+ lappuses