Sertifikaatin spooffaus, ZAP ja välihenkilöpalvelin.
Owasp Top 10, 2021 ja PortSwigger Academyn hyökkäysprotokollien tiivistelmiä/silmäilyä.
Broken Access Control / Vuoden 2021 yleisin haavoittuvuus
- Nousi ensimmäiselle sijalle 94% testattujen sovellusten haavoittuvuuksissa. *Yleisiä ongelmia:
- Pääsyoikeuksien kiertäminen muokkaamalla URL:ia, sovelluksen tilaa tai HTML:ää.
- Viallinen CORS-konfiguraatio.
- Pääsy rajoitettuihin toimintoihin ilman autentikointia.
- Tiedostojen käsittely ilman kunnollisia tarkistuksia (path traversal).
- IDOR-haavoittuvuudet. Ehkäisykeinoina mm. nollatason luottamus, vähimpien oikeuksien periaate ja lokien seuranta
Insecure Direct Object References (IDOR)
- Hyökkääjä voi ohittaa pääsynvalvonnan ja käsitellä suoraan objekteja muuttamalla parametreja.
- Esimerkiksi tilinumeron vaihtaminen URL:ssa voi paljastaa muiden käyttäjien tietoja.
- Yleensä liittyy horisontaaliseen pääsynvalvontaan (samanarvoisten käyttäjien välillä).
- Voidaan estää käyttämällä epäsuoria viittauksia ja kunnollista pääsynhallintatarkistusta.
Server-Side Request Forgery (SSRF)
- Hyökkääjä pakottaa palvelimen tekemään HTTP-pyynnön hyökkääjän valitsemaan kohteeseen.
- Yleistymässä mikropaveluarkkitehtuurien ja pilvipalvelujen myötä.
- Mahdollistaa pääsyn metadata-palveluihin pilviympäristöissä (esim. AWS tai GCP).
- Voidaan ohittaa palomuureja ja päästä käsiksi sisäisiin resursseihin.
- Ehkäisykeinoina mm. verkkokerroksen suojaukset, URL-validointi ja soveltumattomat protokollat/portit estettävä.
Path Traversal
- Mahdollistaa pääsyn hakemistoihin ja tiedostoihin, joihin ei pitäisi päästä käsiksi.
- Käytetään "../" tai vastaavia sekvenssejä tiedostopolun ohjaamiseen.
- Hyökkääjät voivat kiertää perussuojauksia käyttämällä erilaisia koodaustekniikoita.
- Estämiskeinoina mm. käyttäjäsyötteen validointi ja tiedostopääsyn rajoittaminen turvalliseen hakemistorakenteeseen.
Cross-Site Scripting (XSS)
- Hyökkääjä lähettää haitallista JavaScript-koodia verkkosivulle, joka sitten suoritetaan uhrin selaimessa.
- Eri tyyppejä: reflected, stored ja DOM-based XSS
- Mahdollistaa mm. evästeiden varastamisen, istuntokaappaukset ja käyttäjän manipuloinnin.
- Estämiskeinoina mm. syötteiden validointi, escape-koodaus ja Content-Security-Policy (CSP).
Server-Side Template Injection (SSTI)
- Tapahtuu kun hyökkääjä pystyy sisällyttämään mallin omaa kieltä syntaksia palvelimen sisällä.
- Voi johtaa RCE-haavoittuvuuksiin (Remote Code Execution)
- Tunnistetaan yleensä testaamalla kielen omaa syntaksia (esim. ${7*7}) ja tarkkailemalla vastauksia.
- Ehkäisykeinona käyttäjäsyötteen erottaminen syntaksista ja käyttäjäsyötteen minimoiminen palvelimelle.
Kommentit
Yleinen yhteinen elementti tuntuu olevan käyttäjäsyötteen epäluottamuksessa. Kaikissa näissä haavoittuvuuksissa käyttäjän syöte on keskisessä asemassa, käsittelyssä ja validoinnissa.
Ehkä siis tietoturvan keskeisin pointti voisi olla jatkuva epäluottamus käyttäjän syötteisiin, sen huolellinen tarkastaminen ja puhdas minimointi. Silmien pyöritys ja ”oletko käynnistänyt sen jo uudelleen” on siis hyvä näkökulma ihmisiin ja tietokoneisiin.
Joo joo! Tämä on ihan oikea sertifikaatti (🤞)
Aloitetaan asentamalla Zap virtuaalikoneeseeni Kaliin.
sudo apt install zaproxy
Asennuksen jälkeen ZAP kysyy toimintamekanismistaan tälle sessiolle. Opettelen vasta käyttöä niin valitsen nykyisen toimivan ajan, oletus-nimet ja oletuslokaation.

Tämän jälkeen asennan FoxyProxy lisäosan Firefoxille (joka Kalin oletusselain). Periaatteessa me voisimme myös ohjata koko Firefoxin liikenne selaimen oman proxyn kautta, mutta foxyproxy antaa mahdollisuuden nopeasti vaihtaa proxyn ja normaalin liikenteen väliä.

Hyvä tarkastaa ZAP asetuksista, että mistä portista tämä ottaa kopin. Options -> network -> local servers. Oletuksena asetettu portti ’8080’.
Lisätään nämä foxyproxyn asetuksiin. Ja varmistetaan, että proxy on aktiivisena ZAP listauksesta kun foxy proxy on päällä.

Laitan Kalin apache2 palvelimen päälle. Minulla verkossa DNS ohjaus jo asetettu kali.koti ohjaamaan verkko tähän virtuaalikoneeseen, joten voin nopeasti varmistaa proxyn toimivuuden tällä kokonaisuudella.
sudo systemctl start apache2
Kun valmis
sudo systemctl stop apache2

Portswigger ja localhost
Ennen portswigger tehtäviä on hyvä lisätä vielä URL-patterns osiosta FoxyProxylle vain sivut mitä kuunnella. Meidän tavoite on vain katsoa portswigger sivustoa ja sen suhdetta localhostiin.
Eli lisätään Proxy by Patterns kohtaan villit kortit portswigger.com ja localhost sivustoille. Tällöin foxyproxyyn tulee uusi nappula ”Proxy by pattern”. Laitetaan vain se päälle.
Näin kokeilemalla vaikka hs.fi ZAP ei ota kiinni tuosta. Nyt voidaan seurata vain portswiggerin ja localhost välistä liikennettä.

Luodaan vielä oma sertifikaatti ja kuvat myös kulkemaan läpi
Ja vieläkin ennen tehtäviä - tarvitsemme oman CA sertfikaatin, että voimme seurata liikennettä salatuilta sivuilta (jota portswigger on).
Tools -> options - Server Certificates
Luodaan ’generate’ ja ’save’. Tallennetaan serttioma.cer

Lisäksi asetuksista display - ’Process images in HTTP request/responses laitetaan päälle.
Firefoxista Setting - Haku - Certificate manager ja import. Tästä merkataan oma, äsken luotettu sertifikaatti luotettavaksi.
Käynnistän vielä Firefoxin uudestaan. Ja toimii! Eli ainoastaan portswiggerin ja localhostin välinen data kulkee omien polkujeni kautta.

Portswigger ja tehtävät
Ensimmäinen ja toinen tehtävä ovat cross-site scripting (XSS) haasteita.
Eli voimme etsiä kohtia jossa voimme yrittää luoda omaa koodia/komentoja kohdista joissa on jotain.
Sivustolla on ensimmäisenä ’search’ funktio. Aloitetaan tutkiminen siitä.
Täytän ”testimestin” hakukenttään ja tarkkailen, että ZAP ei luo uusia HTML funktioita tästä. Tiedän otsikosta, että kyseessä on reflektoitua koodia, jolloin tämä on odotettava tapahtuma.
Kokeilenpa siis ajaa ihan yksinkertaisen ponnahdus-skriptin.
<script>alert(1)</script>
Ja ponnahdusikkuna tulee! Samalla saan vihreän tägin ’solved’ tehtävään.

Toisessa mallissa lähden heti etsimään jotain täytettävää.
Ensimmäisen postauksen kommenttiosio löytyy ja teen perinteisen test - test täytön. Tarkastan, että ZAP raportoi kaksi POST ja yhden GET komennon kommentin täytöstä. Näistä en osaa sen enempää sanoa, joten lähden vain kokeilemaan.
Lisään kommenttiini mysteerikuvan ja ponnahduksen vikatilassa.
<img src=x onerror=alert(1)>
Saan yhden POST ja neljä GET pakettia. Veikkaan, että nämä liittyvät lähinnä minun tehtäväni onnistumiseen.
XSS tuntuu olevan enemmänkin sellainen haavoittuvuus, jossa voi vain kokeilla ja katsoa mitä tuleman pitää.
Skripti lähti käyntiin palatessani lukemaan kommenttia.

File path traversal
Seuraavat tehtävät ovat tiedostojen kautta etsittäviä reikiä. Itse en näistä tiedä mitään, mutta ymmärrän funktion. Eli tavoite on päästä käsiksi johonkin kun meillä oikeus ensin yhdessä tiedostossa.
Nyt tavoitteena on päästä /etc/passwd kansioon.
Ensimmäisenä arvauksena on vain kopioida ensimmäisen kuvan sijainti ja lähteä siitä
Saan URL osoitteen joka päättyy ”filename=22.jpg”. Kokeilen korvata tätä ”filename=/../../../../../etc/passwd”. Arviolta omassa järjestelmässä siinä on ainakin viisi-kuusi hyppyä.

Vastaukseksi saan ettei selain osaa lukea tiedostoa. Nyt olisin voinut curlilla hakea tiedoston tai firefoxista tallentaa tuon erikseen, mutta seuraavaan.
Seuraavassa demossa tein tismalleen saman alun, mutta en lähtenyt pidemmälle metsään marjastamaan. Kokeilen eri määrillä ../../ osoitteita, mutta ihan vain ’filename=/etc/passwd’ johtaa maaliin.
Ajan vielä osoitteen suoraan CURLilla hakuun.

Tähän asti olen selvinnyt vain ymmärtämällä miten File path traversal toimii. En ole vielä joutunut tutkimaan suuremmin.
Kokeilen aikani erilaisia tekniikoita ja yritän tutkia ZAP koppeja, mutta mikään ei toimi. Hetken haen googlesta vaihtoehtoja ja törmään Path Traversal Cheatsheet github sivuun.
Tuolla suositellaan myös kokeilemaan URL vaihtoa hexamuotoon. Tämä on pidempi mutta kokeiltava kokonaisuus. Käytän Mistral-small24b tekoälyä ollaman kautta auttamaan luomaan viiden-kuuden-seitsemän ja kahdeksan hypyn hex kokonaisuuden tiedostoon.
Ja olla kuin ollakin kahdeksan hypyn kokonaisuus toimi!
/image?filename=%2E%2E%2E%2E%2F%2F%2E%2E%2E%2E%2F%2F%2E%2E%2E%2E%2F%2Fetc%2Fpasswd

IDOR
Tässä tehtävässä on tarkoitus löytää Carloksen käyttäjätiedot staattisesta osoitteesta.
Aloitan tutustumalla sivuun ja heti silmääni tarttuu ’Live Chat’. Huomaan myös ’View transcript’. Kirjoitan ’Hello’ ja lataan keskustelun.
Keskustelu latautuu tiedostolla 2 txt nimellä. Kopioin sivuston ja katson löytyykö mitään 1 txt tiedostolla. Lataan tiedoston suoraan vaihtamalla vain ”1.txt” loppuun.
Tästä löytyy keskustelu jossa yksi salasana. Kokeilen kirjautua tällä sisään Carloksen nimellä.

Tehtävä valmis!
SSRF
Tehtävässä on tarkoitus poistaa käyttäjä ’Carlos’.
Aloitan jälleen surffaamalla sivulla. Jotenkin minun pitää yrittää saada päästyä firman admin paneeliin.
Yritän ensimmäisenä ’my account’ jolloin URL tulee ’/login’. Vaihdan tilalle ’/admin’.
Saan vastaukseksi: ’Admin interface only available if logged in as an administrator, or if requested from loopback ’

Eli minun pitää saada jostain loopback localhostista kiinni. Tutkin heti sivun GET pyyntöjä.
Tutkin sivuja eri puolilta ja huomaan, että ’Check stock’ lähettää POST komennon jossa stockApi rajapinta.

Uudelleen lähetän tämän POST komennon loopbackina /admin osoitteeseen.
Tästä saan ’200’ hyväksynnän ja avaan tämän uuteen ikkunaan. En kuitenkaan pysty suoraan poistamaan Carlosta tällä.
Lähettämäni GET komento on muodossa ... ’GET .../admin/delete?username=carlos’ Eli muokkaan aikaisempaa StockApi Post pyyntöä lisäämällä loppuun tämän.
stockApi=http://127.0.0.1/admin/delete?username=carlos

Tämä onnistui!
SSTI (Haastava)
Tehtävä Kaikki näistä ovat jo olleet minulle haastavia. Työkalut ovat uusia, mutta innolla lähden seuraavaakin katsomaan.
Minulla on omat tunnukset (content-manager:C0nt3ntM4n4g3r) ja tavoitteena on ajaa toimiva syntaksi sivumoottorin kieltä rikkomaan ja päästämään sivuinformaatioon.
My account osiosta kirjaudun ja tämä pyytää sähköpostia. Lähetän sähköpostini ja tutkin GET komentoa antaisiko se jotain lisätietoa. Tämä kuitenkin turhaa, minun silmääni ei tartu mitään.
Tuotteissa pääsen muokkaamaan ’Edit template’ tekstin osuutta ja tämä näyttää, että tuotesivut on tehty jollain koodipohjalla.

Tämä minulle vieras ja kysyn Mistral-small:24b tekoälyltä apua asiasta. Mistralin vastaus: ”viittaa todennäköisesti Jinja2, Twig, Handlebars tai Mustache -tyyppiseen mallinnemoottoriin”. Kaikki minulle näistä vieraita. Mutta kokeillaan.
Lisään pohjaan {{7*7}}{{settings}} jotta näkisin mitä antaa vastaukseksi.
Tämä kuitenkin rikkoo moottorin,

Errorista saan kuitenkin tietoon, että kyseessä ”/usr/local/lib/python2.7/dist-packages/django/template/base.py” Django.
Tämä sivu jää error tilaan, koska en pääse mihinkään. Otan toisen tuotteen ja lähden muokkaamaan.
Käyn Djangon dokumentaatiota läpi. Kysyn myös Mistral/Gemma combolta lähemmin Djangosta. Silmään tarttuu dokumentaatiosta, että Django toimii secret key periaatteella ja tätähän me etsitäänkin. Olen tätä yrittänyt avata toista tuntia ja en jotenkin ymmärtänyt ollenkaan.
Kysyn Mistralilta/Gemmalta yleistä tapaa tehdä tätä ja ensimmäinen ehdotus on ”{{ settings.SECRET_KEY }}”.
Tällä ratkaisen tehtävän. Tylsää! Combon ehdotuksista löytyi mielenkiintoisempia ratkaisuja jossa python koodilla yritetään kaivaa syvemmältä avainta, mutta tässä tehtävässä tämä oli saatavilla suoraan.

Kommentit
Tämä oli minun ensimmäinen askeleeni ja hyvin raapaiseva tutustuminen järjestelmän avaamisen ja kalasteluun. Kuten aina alkuvaiheessa - tämä vei aikaa PALJON enemmän kuin kuvittelin. Mutta viimeisissä pääsin jo tutkivaan ajatusmaailmaan ja tuntui, että nautin tutkimisesta.
Jostain on aloitettava. Viimeisissä päädyin asentamaan Zapin suoraan omalle raudalle Mac OS pohjalle ja tein oman wrapperin selaimelle verkottamaan tämän. Nopeutti kokonaisuutta huomattavasti. Asensin myös Mitmproxyn, mutta jostain syystä en saanut sertfikaattia toimimaan firefoxin kanssa.
Siitä lisää myöhemmin.
Lähteet
https://owasp.org/Top10/A01_2021-Broken_Access_Control/ https://owasp.org/Top10/A10_2021-Server-Side_Request_Forgery_%28SSRF%29/ https://portswigger.net/web-security/access-control/idor https://portswigger.net/web-security/file-path-traversal https://portswigger.net/web-security/ssrf https://portswigger.net/web-security/cross-site-scripting https://portswigger.net/web-security/server-side-template-injection
Tehtävät https://portswigger.net/web-security/cross-site-scripting/reflected/lab-html-context-nothing-encoded https://portswigger.net/web-security/cross-site-scripting/stored/lab-html-context-nothing-encoded https://portswigger.net/web-security/server-side-template-injection/exploiting/lab-server-side-template-injection-with-information-disclosure-via-user-supplied-objects https://portswigger.net/web-security/access-control/lab-insecure-direct-object-references https://portswigger.net/web-security/file-path-traversal/lab-sequences-stripped-non-recursively https://portswigger.net/web-security/file-path-traversal/lab-absolute-path-bypass https://portswigger.net/web-security/file-path-traversal/lab-simple
https://www.mozilla.org/fi/firefox/new/ https://getfoxyproxy.org
Tehtävien analysoinnissa, ZAP lokien ja jopa ratkaisuissa käytetty apuna Gemma3:27b ja Mistral-Small:24b tekoälymalleja omassa lokaalissa koneessa. Ollama toiminut suorana kääntäjänä ja välissä käytetty WilmerAI tulkitsemaan mallien välistä dataa.
http://ollama.com/ https://ollama.com/library/mistral-small:24b https://ollama.com/library/gemma3:27b https://github.com/SomeOddCodeGuy/WilmerAI
Marked toimii md muuntimena sivulla. https://github.com/markedjs/marked
Sivuston kuvat optimoitu https://optimage.app
Käytetty aika Tehtävät 8h Kirjoitus ja dokumentointi 1h Yhteensä 9h
// 9.4.2025 muokkaus. Tein raportin loppuun ja kieliasun puhdistusta.*