Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Injections z zamianą pojedynczego cudzysłowu i walidacją liczb całkowitych

Jeśli jest to przestarzały projekt, który jest zakodowany w ten sposób, to, chociaż nie jest optymalny, nie jestem obecnie świadomy w żaden sposób, że może być podatny na wstrzyknięcie SQL, o ile każdy ciąg jest traktowany w ten sposób, a zapytania są po prostu proste te, jak pokazałeś.

Nie mogę jednak stwierdzić większej pewności niż to. Bez użycia sparametryzowanych zapytań zawsze istnieje możliwość, że istnieje jakaś podatność, której jeszcze nie brałeś pod uwagę.

Ręczne unikanie cytatów jest podatne na błędy i czasami może zakończyć się niepowodzeniem w sposób trudny do przewidzenia z góry. Na przykład z poniższą tabelą

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

I procedura składowana przy użyciu dynamicznego SQL zbudowanego z konkatenacją ciągów

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)

Możesz wypróbować następujące

Normalna aktualizacja

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

Próba wstrzyknięcia SQL udaremniona

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

Próba wstrzyknięcia SQL kończy się pomyślnie i opuszcza tabelę

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

Problem polega na tym, że trzecie zapytanie przechodzi U+02BC zamiast standardowego apostrofu, a następnie ciąg jest przypisany do varchar(max) po wykonaniu warunków sanitarnych, które po cichu zamieniają to w zwykły apostrof.

Dopóki nie przeczytam odpowiedź tutaj ten problem nigdy by mi nie przyszło do głowy.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Unikaj tych 4 typowych błędów DBA

  2. Zwracanie wartości z instrukcji INSERT w SQL Server 2008

  3. Jak ograniczyć niezalogowanym/nieautoryzowanym użytkownikom możliwość przeglądania stron internetowych w ASP.NET?

  4. Napraw komunikat 8116 „Argument typ danych varchar jest nieprawidłowy dla argumentu 1 funkcji session_context” w programie SQL Server

  5. Geografia i geometria SQL 2008 — z której korzystać?