Napredna Sigurnost (Hardening)

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

📖 CSRF Napadi (Doslovno: "Falsifikovanje zahtjeva")

Anatomija Napada:

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!

🛡️ AntiForgeryToken (Rješenje protiv CSRF-a)

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 (Cross-Site Scripting)

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!

MVC Automatska Zaštita

Kada renderirate @Model.Opis MVC vrši HTML Enkodiranje prepoznajući i pretvarajući <script> unose u mrtvi tekst &lt;script&gt; da spriječi pokretanje.

UPOZORENJE Kod Formatskih Editora (TinyMCE)

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!

🛑 SQL Injection (Ubod SQL Komandi preko Textbox-a)

Kada Haker u polje "Ime Pretrage" upiše: ' DROP TABLE Korisnici;-- i baza to doslovno izvrši.

Entity Framework je Siguran ✅

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);

🛠️ Hardening Aplikacije (Sakrivanje Identiteta Servera)

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>

✅ Zaključak

  • ✅ Koristite obaveznu kombinaciju @Html.AntiForgeryToken() i [ValidateAntiForgeryToken] na baš svim Formama od potencijalno kritične važnosti (Krađa identiteta napadima).
  • ✅ Aplikacija automatski rješava XSS HTML enkodiranjem ulaza/izlaza na ekran ukoliko ne dozvoljavamo rich-text edirore! Ukoliko dozvoljavamo moramo uvezati Nuget Package: HtmlSanitizer
  • ✅ SQL Ranjivost na našem portalu ne postoji dok poslušno radimo primarne standardne obaveze Entity Frameworka koristeći LINQ upite.
  • ✅ Promjene Web.config Headera i kolačića osiguravaju portal dodatnim pasivnim "Hardening" filterima skrećući neobavezne hakerske skenere sa traga.