Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL-Injections mit einfachen Anführungszeichen ersetzen und ganze Zahlen validieren

Wenn dies ein Legacy-Projekt ist, das auf diese Weise codiert ist, ist mir derzeit keine Möglichkeit bekannt, dass es anfällig für SQL-Injection sein kann, solange jede Zeichenfolge auf diese Weise behandelt wird und die Abfragen einfach sind, obwohl dies nicht optimal ist diejenigen, wie Sie gezeigt haben.

Mehr Gewissheit kann ich aber nicht sagen. Ohne die Verwendung parametrisierter Abfragen besteht immer die Möglichkeit, dass es eine Schwachstelle gibt, die Sie noch nicht berücksichtigt haben.

Das manuelle Maskieren der Anführungszeichen ist fehleranfällig und kann manchmal auf eine Weise fehlschlagen, die im Voraus nur schwer vorhersehbar ist. Zum Beispiel mit der folgenden Tabelle

CREATE TABLE myTable(title VARCHAR(100))
INSERT INTO myTable VALUES('Foo')

Und gespeicherte Prozedur mit dynamischem SQL, aufgebaut mit String-Verkettung

CREATE PROC UpdateMyTable
@newtitle NVARCHAR(100)
AS
/*
Double up any single quotes
*/
SET @newtitle = REPLACE(@newtitle, '''','''''')

DECLARE @UpdateStatement VARCHAR(MAX)

SET @UpdateStatement = 'UPDATE myTable SET title='''  + @newtitle + ''''

EXEC(@UpdateStatement)

Sie können Folgendes versuchen

Normales Update

EXEC UpdateMyTable N'Foo'
SELECT * FROM myTable /*Returns "Foo"*/

SQL-Injection-Versuch vereitelt

EXEC UpdateMyTable N''';DROP TABLE myTable--'
SELECT * FROM myTable  /*Returns "';DROP TABLE myTable--"*/

Der SQL-Injection-Versuch ist erfolgreich und löscht die Tabelle

EXEC UpdateMyTable N'ʼ;DROP TABLE myTable--'
SELECT * FROM myTable  /*Returns "Invalid object name 'myTable'."*/

Das Problem hier ist, dass die dritte Abfrage U+02BC anstelle des Standard-Apostrophs und dann wird die Zeichenfolge einem varchar(max) zugewiesen nachdem die Sanierung erfolgt ist, wodurch dies stillschweigend in ein reguläres Apostroph umgewandelt wird.

Bis ich die Antwort hier gelesen habe Das Problem wäre mir nie in den Sinn gekommen.