PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : مقاله امنيت :: ‌Sql injection



Rezash
October 21st, 2010, 23:55
سلام
در اين مقاله قصد دارم اطلاعات و تجربيات خودم و بهمراه ضميمه اي از چند آموزش كاربردي در زمينه تزريق به پايگاه داده رو بروي كاغذ(در اينجا مانيتور!)‌بيارم.
ما در برنامه هاي خودمون بسته به نياز Query ها متفاوتي رو داريم كه غالبا با توجه به مفهوم ديناميك بودن صفحات در يك سايت ديناميك ، كوئري هاي ما با توجه به مقادير ورودي كاربر تغيير مي كنند.
حال اگر ورودي هاي دريافتي از كاربران به صورت صحيح فيلتر نشوند و مستقيما در كوئري استفاده بشند برنامه رو با خطرات زيادي روبرو مي كنند !
خيلي سريع ميريم سر اصل مطلب
فرض كنيد براي يك فرم لوگين دو مقدار يوزر نيم و پسورد رو از كاربر به شكل زير دريافت مي كنيم


<?php
$user = $_POST['user'];
$pass = $_POST['pass'];
$result = mysql_query("SLECT * FROM `table` WHERE `user`='$user' AND `pass`='$pass'");
if(mysql_num_rows($result) > 0)
{
echo "Logged in";
}
Else
{
echo "Wrong Info";
}
?>

به نظر مياد كه همه چيز درست و صحيح هست و هيچ مشكلي در برنامه وجو نداره ، اما اين حرف تا زماني درست هست كه كاربر شيطنت نكنه !
فرض كنيم كاربر در فرم لوگين اطلاعات خودش رو به صورت زير وارد كند :


user : test
Pass : ' or '1'='1

نتيجه كوئري ما ميشود :

"SLECT * FROM `table` WHERE `user`=' test ' AND `pass`='' or '1'='1'"
ترجمه به فارسي : انتخاب كن ركوردهايي را از جدول با نام table كه مقدار فيلد user در آن ها test باشد و فيلد رمز عبور تهي باشد يا 1 برابر 1 باشد.
قطعا هممون مفهموم "يا" رو مي دونيم !و همينطور مي دونيم كه در منطق عدد يك با يك برابر هست...
پس ركوردهاي انتخابي ما هميشه يزرگتر از 0 هست و شرط لاگين بودن كاربر بر قرار ميشه...
مثال 2 : فرض كنيم در يك سايت پرسش و پاسخ سوالهاي محرمانه (!) ، در پايان كار يك كد رهگيري عددي به هر كاربر ارائه ميشه كه يك كاربر صرفا با داشتن كد رهگيري و شماره سوال ميتونه به پاسخ و وضعيت سوال خودش دسترسي داشته باشه
بنابراين كدي مشابه كد لوگين خواهيم داشت ...


<?php
$id = $_POST['id'];
$code = $_POST['code'];
$result = mysql_query("SLECT * FROM `questions` WHERE `id`='$id' AND `code`='$code'");
if(mysql_num_rows($result) > 0)
{
echo "Show Codes Informations";
}
else
{
echo "Wrong Info";
}
?>

ورودي هاي كاربر :




id : 123
code : ' or '1'='1

مجددا كوئري ما طبق حالت قبل ميشه و ركورد مورد نظر انتخاب ميشه.
در اينجا مثال ها دقيقا مثل هم بودند.هدف من از زدن مثال 2 وم اين بود كه اولين و مهمترين نكته رو در جلوگيري از نفوذ هاي مخرب بگيريم...
در مثال اخير كد رهگيري و شناسه سوال هر دو عدد بودند اما ورودي هاي كاربر ما چيزي جز عدد بودند. يعني اگر ورودي ها رو محدود به عدد كرده بوديم كاربر نمي تونست كاري از پيش ببره...
* هميشه در كوئري هامون فقط نوع داده مورد نياز رو بپذيريم.
در اينجا كافي بود من با يك شرط ساده از صحت عددي بودن دو مقدار ورودي اطمينان حاصل مي كردم.
مثال :



<?php
$id = $_POST['id'];
$code = $_POST['code'];
If(!is_numeric($id) OR !is_numeric($code))
die('Salam pesaram ! inja sql injection kar nemide ! ');
$result = mysql_query("SLECT * FROM `questions` WHERE `id`='$id' AND `code`='$code'");
if(mysql_num_rows($result) > 0)
{
Echo "Show Codes Informations";
}
Else
{
Echo "Wrong Info";
}
?>

===
استفاده از Sql Injection هميشه به اين سادگي نيست و بعضا نياز به مهارت هاي خاص و آشنايي كافي با دستورات Sql دارد.
علامت -- به معناي كامنت (توضيحات) هست و دستورات خط جاري ، بعد از اين علامت به عنوان توضيحات در نظر گرفته ميشند.
براي مثال ما در اينجا قصد داريم از روي يك كوئري تعداد ستون هاي يك جدول رو بدست بياريم.يا نام جداول رو حدث بزنيم.
مثالي رو كه ميزنم دقت كنيد :


SELECT * FROM table WHERE test = '$input';
وردي :

'x' AND 1=(SELECT COUNT(*) FROM table); --'
نتيجه :

SELECT * FROM table WHERE test = 'x' AND 1=(SELECT COUNT(*) FROM table); --';
در اين مثال ما مي تونيم با تغيير عدد 1 از تعداد ستون ها ، و با تغيير table به صورت حدسي از جداول موجود در يك ديتابيس مطلع بشيم.
از اونجا كه اين مقاله براي امنيت هست و نه آموزش هك از پرداختن به جزييات هك كردن خودداري كردم و مي كنم و فقط يك توضيح كاملا ابتدايي رو در اين زمينه خدمتتون عرض كردم.
خطرات زياد تري از يك لوگين كردن ساده و بيرون كشيدن نام جداول وجود داره، به طوري كه با كمي فراهم سازي پيش زمينه براي نفوذ شما به هكر اختيارت تام در DROP كرد يا INSERT و UPDATE كردن يا دانلود تمام محتويات ديتابيس خودتون رو خواهيد داد.
* اگر فرصت كنم يك سايت دمو و مشكل دار براي تست عملي روش هاي مختلف SQL INKECTION بالا ميارم (دومين كه زياد دارم، هاست رايگان سي پنلم فراوان ! :D ) و يك آموزش مختصر تصويري هم تهيه مي كنم.
*اين مقاله ادامه دارد -- اين فقط مقدمه بود !
لطفا از ارسال پست هاي اسپم خودداري كنيد تا ادامه مطلب رو در اولين فرصت بنويسم و ارسال كنم.
سعي مي كنم ادامه رو تصويري تر و عملي تر دنبال كنيم.
سپاس

Woshka
October 22nd, 2010, 02:02
منبع
کتاب
packt publishing mode security

Rezash
October 22nd, 2010, 12:20
منبع
کتاب
packt publishing mode security
معرفي منبع بود يا منبع اين نوشته !؟
اگر منبع نوشته بود بايد بگم خودم نوشتم + كمك از چند منبع آنلاين كه در آخر آموزش لينك هاي دقيقشون رو مي ذارم و در اول هم اشاره كردم :

در اين مقاله قصد دارم اطلاعات و تجربيات خودم و بهمراه ضميمه اي از چند آموزش كاربردي
نمونه انجمن هاي رايت كليك،آشيانه،ترفندستان و منبع اصلي چند سايت خارجي هست.
حالا اگه لينك دانلود اين كتاب رو داشتيد بذاريد لطفا شايد بدرد آموزشمون بخوره.
سپاس

xersis
June 13th, 2011, 23:32
رضای عزیز ، اگه مقدوره ادامه بدید

tthost
June 14th, 2011, 00:30
خیلی حرفه ای هست
مشتاق ادامه آموزش