Er zijn een paar gevallen waarin deze ontsnappingsfunctie zal mislukken. Het meest voor de hand liggend is wanneer geen enkel aanhalingsteken wordt gebruikt:
string table= "\"" + table.Replace("'", "''") + "\""
string var= "`" + var.Replace("'", "''") + "`"
string index= " " + index.Replace("'", "''") + " "
string query = "select * from `"+table+"` where name=\""+var+"\" or id="+index
In dit geval kunt u "uitbreken" met een dubbel aanhalingsteken, een back-tick. In het laatste geval is er niets om uit te "breken", dus je kunt gewoon 1 union select password from users--
of welke sql-lading de aanvaller ook wenst.
De volgende voorwaarde waarbij deze escape-functie zal mislukken, is als een substring wordt genomen nadat de string is geëscaped (en ja Ik heb dergelijke kwetsbaarheden in het wild gevonden):
string userPassword= userPassword.Replace("'", "''")
string userName= userInput.Replace("'", "''")
userName = substr(userName,0,10)
string query = "select * from users where name='"+userName+"' and password='"+userPassword+"'";
In dit geval een gebruikersnaam van abcdefgji'
wordt omgezet in abcdefgji''
door de escape-functie en vervolgens teruggezet in abcdefgji'
door de substring te nemen. Dit kan worden misbruikt door de wachtwoordwaarde in te stellen op een sql-instructie, in dit geval or 1=1--
zou worden geïnterpreteerd als sql en de gebruikersnaam zou worden geïnterpreteerd als abcdefgji'' and password=
. De resulterende vraag is als volgt:
select * from users where name='abcdefgji'' and password=' or 1=1--
T-SQL en andere geavanceerde sql-injectietechnieken waren al genoemd. Geavanceerde SQL-injectie in SQL Server-toepassingen is een geweldig document en u zou het moeten lezen als u dat nog niet hebt gedaan.
Het laatste probleem zijn unicode-aanvallen. Deze klasse van kwetsbaarheden ontstaat omdat de escape-functie zich niet bewust is van multi-byte-codering, en dit kan door een aanvaller worden gebruikt om het escape-teken te "consumeren". Een "N" voor de string plaatsen helpt niet, omdat dit geen invloed heeft op de waarde van multi-byte tekens later in de string. Dit type aanval is echter zeer ongebruikelijk omdat de database moet worden geconfigureerd om GBK Unicode-strings te accepteren (en ik weet niet zeker of MS-SQL dit kan).
Second-Order code-injectie is nog steeds mogelijk, dit aanvalspatroon wordt gecreëerd door te vertrouwen op door de aanvaller gecontroleerde gegevensbronnen. Escaping wordt gebruikt om controletekens weer te geven als hun letterlijke karakter. Als de ontwikkelaar vergeet te ontsnappen aan een waarde die is verkregen uit een select
en gebruikt deze waarde vervolgens in een andere zoekopdracht dan bam de aanvaller heeft een letterlijk enkel aanhalingsteken tot zijn beschikking.
Alles testen, niets vertrouwen.