SQL -inspuiting
SQL-inspuiting
SQL-inspuiting is 'n kode-inspuitingstegniek wat u databasis kan vernietig.
SQL-inspuiting is een van die mees algemene webkrakertegnieke.
SQL-inspuiting is die plasing van kwaadwillige kode in SQL-stellings, via webbladinvoer.
SQL in webblaaie
SQL-inspuiting vind gewoonlik plaas wanneer jy 'n gebruiker vir invoer vra, soos hul gebruikersnaam/gebruiker-ID, en in plaas van 'n naam/id, gee die gebruiker vir jou 'n SQL-stelling wat jy onwetend op jou databasis sal laat loop.
Kyk na die volgende voorbeeld wat 'n
SELECT
stelling skep deur 'n veranderlike (txtUserId) by 'n uitgesoekte string te voeg. Die veranderlike word van gebruikersinvoer (getRequestString) gehaal:
Voorbeeld
txtUserId = getRequestString("UserId");
txtSQL = "SELECT *
FROM Users WHERE UserId = " + txtUserId;
Die res van hierdie hoofstuk beskryf die potensiële gevare van die gebruik van gebruikersinvoer in SQL-stellings.
SQL-inspuiting gebaseer op 1=1 is altyd waar
Kyk weer na die voorbeeld hierbo. Die oorspronklike doel van die kode was om 'n SQL-stelling te skep om 'n gebruiker te kies, met 'n gegewe gebruiker-ID.
As daar niks is wat 'n gebruiker verhoed om "verkeerde" invoer in te voer nie, kan die gebruiker een of ander "slim" invoer soos volg invoer:
Gebruiker-ID:
Dan sal die SQL-stelling soos volg lyk:
SELECT * FROM Users WHERE UserId = 105 OR 1=1;
Die SQL hierbo is geldig en sal ALLE rye van die "Gebruikers"-tabel terugstuur, aangesien OF 1=1 altyd WAAR is.
Lyk die voorbeeld hierbo gevaarlik? Wat as die "Gebruikers"-tabel name en wagwoorde bevat?
Die SQL-stelling hierbo is baie dieselfde as hierdie:
SELECT UserId, Name, Password
FROM Users WHERE UserId = 105 or 1=1;
'n Hacker kan toegang kry tot al die gebruikersname en wagwoorde in 'n databasis deur eenvoudig 105 OF 1=1 in die invoerveld in te voeg.
SQL-inspuiting gebaseer op ""="" is altyd waar
Hier is 'n voorbeeld van 'n gebruikersaanmelding op 'n webwerf:
Gebruikersnaam:
Wagwoord:
Voorbeeld
uName = getRequestString("username");
uPass = getRequestString("userpassword");
sql = 'SELECT * FROM Users WHERE Name ="' + uName + '" AND Pass ="' + uPass +
'"'
Resultaat
SELECT * FROM Users WHERE Name ="John Doe" AND Pass ="myPass"
'n Hacker kan dalk toegang tot gebruikername en wagwoorde in 'n databasis kry deur eenvoudig " OF ""=" in die gebruikersnaam of wagwoord tekskassie in te voeg:
Gebruikersnaam:
Wagwoord:
Die kode by die bediener sal 'n geldige SQL-stelling soos hierdie skep:
Resultaat
SELECT * FROM Users WHERE Name ="" or ""="" AND Pass ="" or ""=""
Die SQL hierbo is geldig en sal alle rye van die "Gebruikers"-tabel terugstuur, aangesien OF ""="" altyd WAAR is.
SQL-inspuiting gebaseer op batched SQL-stellings
Die meeste databasisse ondersteun batched SQL-stelling.
'n Bondel SQL-stellings is 'n groep van twee of meer SQL-stellings, geskei deur kommapunte.
Die SQL-stelling hieronder sal alle rye van die "Gebruikers"-tabel terugstuur, en dan die "Verskaffers"-tabel uitvee.
Voorbeeld
SELECT * FROM Users; DROP TABLE Suppliers
Kyk na die volgende voorbeeld:
Voorbeeld
txtUserId = getRequestString("UserId");
txtSQL = "SELECT *
FROM Users WHERE UserId = " + txtUserId;
En die volgende insette:
Gebruiker ID:
Die geldige SQL-stelling sal soos volg lyk:
Resultaat
SELECT * FROM Users WHERE
UserId = 105; DROP TABLE Suppliers;
Gebruik SQL-parameters vir beskerming
Om 'n webwerf teen SQL-inspuiting te beskerm, kan jy SQL-parameters gebruik.
SQL-parameters is waardes wat op 'n beheerde wyse by 'n SQL-navraag gevoeg word tydens uitvoering.
ASP.NET Razor Voorbeeld
txtUserId = getRequestString("UserId");
txtSQL = "SELECT *
FROM Users WHERE UserId = @0";
db.Execute(txtSQL,txtUserId);
Let daarop dat parameters in die SQL-stelling deur 'n @-merker voorgestel word.
Die SQL-enjin kontroleer elke parameter om te verseker dat dit korrek is vir sy kolom en letterlik behandel word, en nie as deel van die SQL wat uitgevoer moet word nie.
Nog 'n voorbeeld
txtNam = getRequestString("CustomerName");
txtAdd = getRequestString("Address");
txtCit = getRequestString("City");
txtSQL = "INSERT INTO Customers (CustomerName,Address,City) Values(@0,@1,@2)";
db.Execute(txtSQL,txtNam,txtAdd,txtCit);
Voorbeelde
Die volgende voorbeelde wys hoe om geparameteriseerde navrae in sommige algemene webtale te bou.
KIES VERKLARING IN ASP.NET:
txtUserId = getRequestString("UserId");
sql = "SELECT * FROM Customers WHERE CustomerId = @0";
command = new SqlCommand(sql);
command.Parameters.AddWithValue("@0",txtUserId);
command.ExecuteReader();
VOEG IN VERKLARING IN ASP.NET IN:
txtNam = getRequestString("CustomerName");
txtAdd = getRequestString("Address");
txtCit = getRequestString("City");
txtSQL = "INSERT INTO Customers (CustomerName,Address,City) Values(@0,@1,@2)";
command = new SqlCommand(txtSQL);
command.Parameters.AddWithValue("@0",txtNam);
command.Parameters.AddWithValue("@1",txtAdd);
command.Parameters.AddWithValue("@2",txtCit);
command.ExecuteNonQuery();
VOEG IN VERKLARING IN PHP IN:
$stmt = $dbh->prepare("INSERT INTO Customers (CustomerName,Address,City)
VALUES (:nam, :add, :cit)");
$stmt->bindParam(':nam', $txtNam);
$stmt->bindParam(':add', $txtAdd);
$stmt->bindParam(':cit', $txtCit);
$stmt->execute();