كيف التحايل على الحظر المفروض على الرسائل API من خلال وثائق فكونتاكتي

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

كيف بدأ كل شيء


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

ولكن بمجرد ظهور "الأمر" ، ومنذ تلك اللحظة توقف تنفيذ مثل هذه الطلبات الصغيرة لتصبح مهمة تافهة:

صورة

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

دعونا ننكب على العمل


لذا ، بدأت بالتفويض. مسلحًا بـ https sniffer و Firefox ، تمكنت من متابعة جميع "خطوات" التفويض والحصول على ملفات تعريف الارتباط النهائية. من الآن فصاعدًا ، بقي فقط فهم كيفية إجراء الاستعلامات. تم العثور على أن معظم البيانات يتم تلقيها عن طريق طلب POST من https://vk.com/wkview.php ، فقط المعلمات لمواقف مختلفة تتغير في كل مرة. تمكنت من كتابة وظائف لضخ جميع أنواع الاستثمارات على الإطلاق ، لكننا لن ندخل في تفاصيل ذلك ، لأنه في لحظة واحدة تغير كل شيء بشكل كبير.
رابط للملف لتلقي ملفات تعريف الارتباط الخاصة بالتفويض (قمت بكتابته فقط من أجل المصادقة الثنائية لأنه يكلف معظم الناس)

اكتشاف غير متوقع


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

صورة

لا ، أنت تفهمني بشكل صحيح ، لست أول فقط انظر إلى هذه الفرصة. لقد استخدمتها عدة مرات مع طرق أخرى ، ولكن لا يمكنني حتى أن أعتقد أن وظيفة "طلب عينة" ستبقى مع طرق قسم الرسائل. والأقوى كانت مفاجأة لي عندما قمت بتخريب حركة المرور. كانت هذه مجرد طلبات API عادية ، فقط على الموقع ، والتي لها أسماء معلمات مختلفة قليلاً في نموذج الويب ولديها نوع من معرف التجزئة.

صورة

في بضع دقائق ، أدركت أن معرف التجزئة هو مجرد سلسلة تقع في سمة تجزئة البيانات لعلامة الزر ، وبعد بضع دقائق كنت أحاول بالفعل بجد تنفيذ محاكاة "طلبات الاختبار" ولم أكن أعتقد تمامًا أنه سيعمل. بعد كل شيء ، من المؤكد أن هذه الطلبات لديها نوع من الحد على الرقم أو شيء من هذا القبيل. ولكن ما أدهشني عندما تمكن هذا النص المكتوب في 30 سطرًا (دون احتساب استلام ملفات تعريف الارتباط) ، الذي كتب على ركبتي ، من ضخ نصف ألف صورة من ملحقات الحوار في 4 دقائق.

صورة

أطبق الكود المستخدم
import requests, pickle, re, json

with open('cookies_vk_auth.pickle', 'rb') as handle:
    cookies_final = pickle.load(handle)

session = requests.Session()
peer_id = int(input('  :  '))

response = session.get(f'https://vk.com/dev/messages.getHistoryAttachments', cookies=cookies_final)
hash_data =  re.findall(r'data-hash="(\S*)"', response.text)[0]

session = requests.Session()
response = session.post(f'https://vk.com/dev',
            data=f'act=a_run_method&al=1&hash={hash_data}&method=messages.getHistoryAttachments&param_count=20&param_max_forwards_level=45&param_media_type=photo&param_peer_id={peer_id}&param_photo_sizes=0&param_preserve_order=0&param_v=5.103', cookies=cookies_final)

count=20

for i in range(200):
    response_json = json.loads(json.loads(response.text[4:])['payload'][1][0])['response']['items']

    for photo in response_json:
        ph = photo['attachment']['photo']['sizes'][-1]['url']
        r = session.get(ph, timeout=10)
        
        if r.status_code == 200:
            with open(f'D://dev/'+str(ph.split('/')[-1]), 'wb') as f:
                f.write(r.content)

    m_id = photo['message_id']
    response = session.post(f'https://vk.com/dev',
            data=f'act=a_run_method&al=1&hash={hash_data}&method=messages.getHistoryAttachments&param_count=20&param_start_from={m_id}&param_max_forwards_level=45&param_media_type=photo&param_peer_id={peer_id}&param_photo_sizes=0&param_preserve_order=0&param_v=5.103', cookies=cookies_final)


لقد تأثرت كثيرًا بأنني قررت في هذه المرحلة أن أهدأ وأحاول تنفيذ طريقة أخرى (فجأة كنت مخطئًا للتو). لقد انتهيت من طريقة التاريخ وكانت النتيجة مماثلة. فقط اضطررت إلى تعيين تأخير 0.1 ثانية حتى لا يعطي الخادم خطأ حول عدد كبير جدًا من الطلبات. (إذا كرر شخص ما ، يرجى تذكر أنه عند تغيير الطريقة ، ستحتاج أيضًا إلى تغيير عنوان url إلى الوثائق ، من أين تأتي بيانات التجزئة). أي أن هذه الطريقة جعلت من الممكن حقًا الوصول إلى قسم الرسائل من خلال الوثائق الرسمية ، باستخدام كلمة المرور وتسجيل دخول المستخدم فقط. من أجل الموثوقية ، حاولت القيام بنفس الخطوات في حساب آخر وحصلت على نفس النتيجة.

كي تختصر


لذلك ، أعتقد أن الجميع قد أدركوا بالفعل أن هذا يعد خرقًا في حماية بياناتنا الشخصية ، التي ظلت معلقة في الوثائق لمدة عام وليس من المعروف عدد الأشخاص الذين استخدموها بالفعل. علاوة على ذلك ، هذه الفجوة كبيرة للغاية ، ويجب سدها قريبًا. ولكي أثبت مرة أخرى أن هذا لا ينبغي أن يعمل بهذه الطريقة ، سأقتبس من مطوري VK أنفسهم:
إذا كنت تخطط لبدء تطوير برنامج مراسلة ، فبعد 15 فبراير 2019 ، ستحتاج إلى الحصول على حق الوصول التجريبي في الدعم ، والذي يتضمن عمل طرق قسم الرسائل باستخدام مفاتيح مديري تطبيقك المستقل.

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

رأيي الشخصي


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

ملاحظة
, ) , .

All Articles