SQL injection napadi

Uvod

SQL Injection (SQLi) je jedan od najčešćih napada na veb aplikaciju koji se koristi za neovlašćeni pristup bazama podataka. Ovaj napad može imati ozbiljne posledice po bezbednost podataka i integritet sistema.

Klasični SQLi

Klasični SQL Injection napadi često se dešavaju kada napadač ubrizga zlonamerni SQL kod putem nesanitiziranog input polja u aplikaciji koja komunicira sa bazom podataka. Na primer, ukoliko aplikacija ima input polje za pretragu korisnika, napadač može da ubaci SQL kod koji može izmeniti, obrisati ili dobiti pristup podacima iz baze za koje nema prava pristupa.

public bool AuthenticateUser(string username, string password) {

string query = “SELECT * FROM Users WHERE Username='” + username + “‘ AND Password='” + password + “‘”;

SqlCommand command = new SqlCommand(query, connection);

SqlDataReader reader = command.ExecuteReader();

return reader.HasRows;

 

Zlonamerni korisnik može kao username uneti bilo koji postojeći username a za password polje utilizovati sledeći SQL kod kako bi exploatisao ovu ranjivost:

‘ OR ‘1‘=’1‘ –

Shodno tome, konačni izgled upita je sledeći:

SELECT * FROM Users WHERE Username=”admin” AND Password=” OR ‘1‘=’1‘ –’

Rezultat ove operacije je logovanje na aplikaciju bez poznavanja adekvatne username-password kombinacije!

Union SQLi

Ovaj tip SQL injection-a uključuje ubacivanje SQL UNION statement-a u originalni SQL upit kako bi se kombinovali rezultati dva ili više SELECT upita u jedan rezultujući skup. Ova tehnika omogućava napadačima da izvuku podatke iz drugih tabela unutar baze podataka do kojih obično ne bi imali pristup.

public void ListProductsFromCategory(string categoryId) {

string query = “SELECT Naziv, Opis FROM Proizvodi WHERE KategorijaID = “ + categoryId;

SqlCommand command = new SqlCommand(query, connection);

connection.Open();

SqlDataReader reader = command.ExecuteReader();

 

while (reader.Read()) {

Console.WriteLine($“Naziv: {reader[“Naziv“]}, Opis: {reader[“Opis“]}”);

}

}

 

Unosom ovog SQL-a kao categoryId možemo eksploatisati ovu ranjivost:

1 UNION SELECT korisnickoime, lozinka FROM Korisnici—

Konačan izgled upita je sledeći:

SELECT Naziv, Opis FROM Proizvodi WHERE KategorijaID = 1 UNION SELECT korisnickoime, lozinka FROM Korisnici

Ovaj upit kombinuje rezultate originalnog upita sa rezultatima ubačenog upita, što omogućava da se korisnička imena i lozinke iz tabele Korisnici izvuku. — se koristi da bi se komentarisao ostatak originalnog upita.

Mitigacija

Da biste sprečili ovakav tip napada, uvek koristite parametrizovane upite ili uskladištene procedure za dinamičko kreiranje SQL upita, i izbegavajte direktno nadovezivanje korisničkog unosa na vaš „zakucani“ SQL.

public bool AuthenticateUser(string username, string password)

{

string query = “SELECT * FROM Users WHERE Username=@Username AND Password=@Password”;

SqlCommand command = new SqlCommand(query, connection);

command.Parameters.AddWithValue(“@Username”, username);

command.Parameters.AddWithValue(“@Password”, password);

SqlDataReader reader = command.ExecuteReader();

return reader.HasRows;

}