Néhányan úgy gondolják, hogy a tárolt eljárások használata egyúttal biztonságot is jelent az adatbázist használó alkalmazások számára. Ezt a tévhitet eloszlatandó, lássuk hogyan lehet kihasználni az SQL Server automatikus adatcsonkolási tulajdonságát egy rosszul megírt tárolt eljárás esetében!
Tegyük fel, hogy a programozó a QUOTENAME vagy a REPLACE T-SQL függvényt használja az aposztrófok/idézőjelek kicserélésére (ezzel próbálva megakadályozni egy SQL Injection támadást) mielőtt a felhasználótól érkező fix (pontosabban maximalizált) szélességű adatokat beszúrná a megfelelő táblába.
A használt eljárás nézzen ki mondjuk így:
ALTER PROCEDURE sp_setPassword
@username varchar(25),
@old varchar(25),
@new varchar(25)
AS
DECLARE @quoted_username varchar(25)
DECLARE @quoted_oldpw varchar(25)
DECLARE @quoted_newpw varchar(25)
DECLARE @command varchar(250)
-- a változók csak 25 karaktert képesek tárolni
-- megj.: a quotename() 52 karaktert ad vissza
-- ha az összes karakter aposztróf!
SET @quoted_username = QUOTENAME(@username, '''')
SET @quoted_oldpw = QUOTENAME(@old, '''')
SET @quoted_newpw = QUOTENAME(@new, '''')
SET @command= 'update Users set password=' + @quoted_newpw +
' where username=' + @quoted_username +
' AND password = ' + @quoted_oldpw
EXEC (@command)
GO
Mi van akkor, ha a felhasználó által megadott jelszó éppen 24 karakter hoszzú:
ajelszo24karakterhosszuu ?
Mivel az SQL Server 2004 SP1 és 2005 SP4 csendben levágja az adat végét, ha az már nem fér be a megfelelő bufferbe, a @quoted_username vátozo értéke
'ajelszo24karakterhosszuu lesz!
Ezek után a lefuttatott kérés így fog kinézni:
update users set password='ajleszo24karakterhosszuu where username=' <Ide jöhet az SQL Injection>
Készült
Ronald posztja alapján, az
eredeti cikket Bala Neerumalla írta.