Modul 7 - Lekcija 3
Odbrana od OWASP Top 10 prijetnji - CSRF, XSS, SQLi i učvršćivanje aplikacije
⏱️ Trajanje: ~4 časa | 📚 Nivo: Napredni | 🎯 Praktični primjeri: 6
Zamislite da ste prijavljeni u aplikaciju Ministarstva Finansija i u vasem pregledniku se cuva aktivan Auth Cookie.
Zatim, u drugom prozoru preglednika otvorite opasan i zlonamjerni portal. Ta stranica sadrži
sakrivenu <form> koja sama odradi auto-Submit na adresu servera vaseg
Ministarstva: /Budzet/PrebaciSredstva?Iznos=1000&Racun=HAKER
Browser će u tom trenutku, ne znajući da je napad, automatski uzeti vaš prijavni kolačić i poslati navedeni API Zahtjev sa vašim identitetom! Server Ministarstva misli da ste VI uradili prijenos!
Rješenje: Sinhronizovani Par ključeva! Server prilikom učitavanje forme kreira specifičan "Hidden Input" ključ i isti upiše u poseban Browser Cookie. Prilikom slanja forme haker na susjednoj stranici ne može znati unikatni Token kojeg generišemo.
@using (Html.BeginForm("OdobriTransfer", "Budzet", FormMethod.Post))
{
// Generiše skriveno polje i sinhronizuje cookie !
@Html.AntiForgeryToken()
<input type="hidden" name="BudzetId" value="123" />
<button type="submit" class="btn btn-danger">Odobri Prenos Sredstava</button>
}
// KORAK 2: Iznuđivanje Zastite Iznad Kontrolera (Obavezno)
[HttpPost]
[Authorize(Roles = "Ministar")]
[ValidateAntiForgeryToken] // Server ce ovdje odbiti Hakerski paket u startu sa HTTP ERROR jer nema Hidden Input tajnu na sebi!
public ActionResult OdobriTransfer(int BudzetId)
{
return View("Uspjesno");
}
XSS se oslanja na ranjivost dozvoljavanja korisnicima da unesu Javascript unutar Input Polja. Ukoliko vi kao Službenik taj unos otvorite poslije na Ekranu, on će u vašem PCu izvršiti ubačeni ukradeni JS kod i ukrasti Session i Tokene vama pa poslati u Rusiju!
Kada renderirate @Model.Opis MVC vrši HTML Enkodiranje prepoznajući
i pretvarajući <script> unose u mrtvi tekst
<script> da spriječi pokretanje.
Kada želite dozvoliti ljudima da kreiraju Bold/Italic objave - morate koristiti
@Html.Raw()
koji ubija sigurnost i omogućava XSS. U ovim specifičnim slučajevima iznad kontrolera koristi se
[ValidateInput(false)]
i biblioteka HtmlSanitizer u C# Kodu koja ručno obriše svaku
<script> riječ prije spremanja na bazu!
Kada Haker u polje "Ime Pretrage" upiše: ' DROP TABLE Korisnici;-- i baza to doslovno
izvrši.
Za sve normalne operacije (EF LINQ C# metodologija npr:
db.Korisnici.Where(k => k.Ime == unos)) mi smo apsolutno pod zaštitom
Parametriziranih upita
u pozadini. EF Nikada ne obavlja "ljepljenje" (konkatenaciju) sql stringova i pretvara SQL
Injection u beskoristan plain tekst string pri ubacivanju u kolonu!
// KRISTIČNO - SQL INJECTION RANJIV UKOLIKO KORISTITE DIRECT RAW SQL (IZBJEGAVATI!!!)
var user = db.Database.SqlQuery<Korisnik>($"SELECT * FROM Korisnik WHERE Ime = '{unos}'");
// PRAVILNO RJEŠENJE AKO JE NEIZBJEŽNO POSLATI CUSTOM RAW SQL (Parametri):
var user = db.Database.SqlQuery<Korisnik>("SELECT * FROM Korisnik WHERE Ime = @p0", unos);
Po defaultu ASP.NET i ISS daju "Reklamne" prostrane informacije hakerima prilikom svakog odgovora. U
Web.config datoteci trebamo ukloniti ove znakove.
<system.web>
<!-- Sakriva klasične Error Code Greške (Full Text stack) od napadača -->
<customErrors mode="On" defaultRedirect="~/Error" />
<!-- Kolačići da putuju Mrežom Samo preko HTTPS enkriptovane linije -->
<httpCookies httpOnlyCookies="true" requireSSL="true" />
<!-- Isključivanje prikaza ASP.NET verzije u Headers F12 Network Tabu -->
<httpRuntime enableVersionHeader="false" />
</system.web>
<system.webServer>
<httpProtocol>
<customHeaders>
<!-- Sakrivanje imena Servera (IIS) -->
<remove name="X-Powered-By" />
<remove name="Server" />
</customHeaders>
</httpProtocol>
</system.webServer>
@Html.AntiForgeryToken() i
[ValidateAntiForgeryToken] na baš svim Formama od potencijalno kritične važnosti
(Krađa identiteta napadima).HtmlSanitizer