sql >> Databasteknik >  >> RDS >> Sqlserver

Hur kan sanitet som undkommer enstaka citattecken besegras av SQL-injektion i SQL Server?

Det finns några fall där denna escape-funktion kommer att misslyckas. Det mest uppenbara är när ett enda citat inte används:

string table= "\"" + table.Replace("'", "''") + "\""
string var= "`" + var.Replace("'", "''") + "`"
string index= " " + index.Replace("'", "''") + " "
string query = "select * from `"+table+"` where name=\""+var+"\" or id="+index

I det här fallet kan du "bryta ut" genom att använda ett dubbelcitat, en back-tick. I det sista fallet finns det inget att "bryta sig ut" ur, så du kan bara skriva 1 union select password from users-- eller vilken sql-nyttolast som angriparen önskar.

Nästa tillstånd där denna escape-funktion kommer att misslyckas är om en understräng tas efter att strängen har escapets (och ja Jag har hittat sådana sårbarheter i naturen):

string userPassword= userPassword.Replace("'", "''")
string userName= userInput.Replace("'", "''")
userName = substr(userName,0,10)
string query = "select * from users where name='"+userName+"' and password='"+userPassword+"'";

I det här fallet är ett användarnamn abcdefgji' kommer att förvandlas till abcdefgji'' av escape-funktionen och sedan förvandlats tillbaka till abcdefgji' genom att ta delsträngen. Detta kan utnyttjas genom att ställa in lösenordsvärdet till valfri sql-sats, i det här fallet or 1=1-- skulle tolkas som sql och användarnamnet skulle tolkas som abcdefgji'' and password= . Den resulterande frågan är som följer:

select * from users where name='abcdefgji'' and password=' or 1=1-- 

T-SQL och andra avancerade sql-injektionstekniker har redan nämnts. Advanced SQL Injection In SQL Server Applications är ett bra papper och du bör läsa det om du inte redan har gjort det.

Det sista problemet är unicode-attacker. Denna klass av sårbarheter uppstår eftersom escape-funktionen inte är medveten om multi-byte-kodning, och detta kan användas av en angripare för att "konsumera" escape-tecknet. Att lägga till ett "N" till strängen hjälper inte, eftersom detta inte påverkar värdet på flerbytetecken senare i strängen. Den här typen av attack är dock mycket ovanlig eftersom databasen måste konfigureras för att acceptera GBK unicode-strängar (och jag är inte säker på att MS-SQL kan göra detta).

Andra ordningens kodinjektion är fortfarande möjligt, detta attackmönster skapas genom att lita på angriparkontrollerade datakällor. Escape används för att representera kontrolltecken som deras karaktär bokstavlig. Om utvecklaren glömmer att escape ett värde erhållet från en select och använder sedan detta värde i en annan fråga än bam angriparen kommer att ha ett bokstavligt enstaka citat till sitt förfogande.

Testa allt, lita på ingenting.



  1. Hur man genererar skript för att aktivera alla främmande nyckelbegränsningar i SQL Server Database - SQL Server / TSQL Tutorial Del 78

  2. Hur SUBTIME() fungerar i MariaDB

  3. Neo4j - Släpp en begränsning med Cypher

  4. Slå samman en tabell och en ändringslogg till en vy i PostgreSQL