MIGS哈希算法漏洞


随着信用卡和互联网的出现,购物变得更加容易,并且正如他们所说的,更加安全。 只需点击几下,您所需的产品就已经在回家的路上。 但是,并非所有系统都是理想的,或者没有理想的系统。 您总是会发现某种错误,这是一个漏洞,攻击者可以利用它来做自己的肮脏事。 今天,我想提请您注意一个非常有才华的程序员Yohanes Nugroho的研究,他谈到了MIGS系统中的漏洞。

本文是漏洞研究人员Yohanes Nugroho自己的文字的翻译。 祝你玩得愉快。

MIGS哈希算法漏洞

去年,我发现MIGS(万事达卡Internet网关服务)使用的基于MD5的哈希算法出错。 它允许您更改事务的大小。 该公司奖励我发现了这个问题。 同年,MIGS转向使用HMAC-SHA256,但存在一些漏洞。

什么是MIGS?

当您在网站上付款时,其所有者通常将其系统连接到中间付款网关(过渡到另一个页面)。 然后,该支付网关连接到特定国家/地区中可用的多个支付系统。 对于信用卡,许多网关都连接到其他网关(其中一个是MIGS),后者与许多银行合作以提供3DSecure。

如何运作?

如果使用MIGS,则付款顺序通常如下所示:

  1. 您在网站上选择一种产品。
  2. 输入您的信用卡号。
  3. 对卡号,支付大小和其他参数进行签名,然后返回到浏览器,该浏览器将自动生成一个POST请求到中间支付网关。
  4. 该网关将信息转换为MIGS支持的格式,使用MIGS密钥进行签名并将其返回给浏览器。 之后,浏览器向MIGS服务器本身生成另一个POST请求。
  5. 如果未启用3DSecure,则跳过此步骤。 否则,MIGS会将请求转移到发行卡的银行。 银行请求OTP并生成HTML,HTML为MIGS服务器生成POST请求。
  6. MIGS将签名的数据返回到浏览器,并为中间支付网关创建POST请求。
  7. 中间支付网关对数据和签名的验证。 如果数据不正确,则会生成错误页面。
  8. 基于MIGS响应,支付网关将支付状态发送给卖方。

MD5哈希算法中的漏洞

这个错误很简单。 哈希方法使用以下公式:

MD5(秘密+数据)

但是,哈希扩展没有漏洞(已执行一些检查来防止这种情况)。 数据以这种方式形成:对所有以vpc_开头的请求参数进行排序,然后以无分隔的方式连接值。 例如,我们有以下数据:

姓名:乔
数量:10000
卡:1234567890123456

vpc_Name =乔&Vpc_Amount = 10000&vpc_Card = 1234567890123456

应用排序:

vpc_Amount = 10000
vpc_Card = 1234567890123456
vpc_Name =乔

我们连接值:

100001234567890123456Joe

请注意是否更改了参数:

vpc_Name =乔&Vpc_Amount = 1&vpc_Card = 1234567890123456&vpc_B = 0000

应用排序:

vpc_Amount = 1
vpc_B = 0000
vpc_Card = 1234567890123456
vpc_Name =乔

我们连接值:

100001234567890123456Joe

该MD5值将相同。 也就是说,实际上,当数据传输到MIGS时,我们可以在付款金额之后添加一个附加参数以删除最后一位,或者在其之前添加-删除第一位。 您可以为MacBook支付2美元而不是2000美元。

中间网关和商家可以通过始终检查MIGS返回的付款金额是否与请求的金额匹配来避免此漏洞。

万事达卡奖励我识别出此错误的费用为8500美元。

HMAC-SHA256哈希漏洞

如果我们将不正确的值注入中间支付网关,则新的HMAC-SHA256具有一个可以利用的漏洞。 我在其中一个付款网关(融合付款)上检查了此错误。 他们为此支付了我500美元的奖金。 此漏洞还可能影响连接到MIGS的其他支付网关。

在新版本中,添加了字段之间的定界符(&),字段名(不仅是值),当然还添加了HMAC-SHA256。 对于与之前相同的数据,哈希线如下所示:

Vpc_Amount = 10000&vpc_Card = 1234567890123456&vpc_Name = Joe

我们什么也做不了;该计划中的一切都井井有条。 但是,如果值包含字符&或=或其他字符怎么办?

阅读《 MiGS虚拟支付客户集成参考》文档后,我发现:

“注意:出于哈希目的,所有名称/值对中的值都不得包含URL字符”

我专注于NOT 。 这意味着如果我们具有以下字段:

数量= 100
卡= 1234
CVV = 555

哈希将如下所示:HMAC(金额= 100&卡= 1234&CVV = 555)

如果字段是这样的(使用&和=):

数量= 100&卡= 1234
CVV = 555

哈希看起来像这样:HMAC(金额= 100&卡= 1234&CVV = 555)

以同样的方式。 但是到目前为止,还不是这样的问题。

当然,我认为官方文档中可能存在问题,也许仍应使用URL字符。 但是我检查了MIGS服务器的行为,一切都与文档中的一样。 也许他们不想使用其他编码(例如+而不是%20)。

看来应该没有问题,MIGS会检查不正确的值并给出错误信息(例如,错误的付款金额将被拒绝)。

但是我注意到,在某些支付网关中,它们没有在服务器端检查输入的数据,而是仅签名并将所有内容重定向到MIGS。 在客户端测试JavaScript,在服务器端对数据签名,然后让MIGS决定卡号是否正确,CVV是否应由3或4位数字组成,卡是否正确到期等等,这要容易得多。 逻辑是这样的:MIGS将仔细检查数据并使其更好。

在Fusion Payments,我发现是这样的:他们允许您输入任意长度的CVV代码(仅在JavaScript中进行验证),然后签署请求并将其发送给MIGS。

利用

要利用此漏洞,我们需要创建一个字符串,该字符串将是正确的请求,并从MIGS服务器获得正确的响应。 我们不需要与MIGS服务器进行通信,我们只需要使客户端签署正确的数据即可。

基本要求:

vpc_AccessCode = 9E33F6D7&vpc_Amount = 25&vpc_Card = Visa&vpc_CardExp = 1717&vpc_CardNum = 4599777788889999&vpc_CardSecurityCode = 999&vpc_OrderInfo = vdchecfurecurecururecurecurecure

服务器的基本响应将是这样的:

vpc_Message =已批准&vpc_OrderInfo = ORDERINFO&vpc_ReceiptNo = 722819658213&vpc_TransactionNo = 2000834062&vpc_TxnResponseCode = 0&vpc_SecureHash = THEHASH&vpc_Secure25Shecpe2525ecpe2525

对于Fusion Payment,该漏洞利用是通过实现vpc_CardSecurityCode(CVV)来实现的

vpc_AccessCode = 9E33F6D7&vpc_Amount = 25&vpc_Card =签证和vpc_CardExp = 1717&vpc_CardNum = 4599777788889999&vpc_CardSecurityCode = 999%26vpc_Message%3DApproved%26vpc_OrderInfo%3DORDERINFO%26vpc_ReceiptNo%3D722819658213%26vpc_TransactionNo%3D2000834062%26vpc_TxnResponseCode%3D0%26vpc_Z%物3Da&vpc_OrderInfo =订单信息&vpc_SecureHash = THEHASH&vpc_SecureHashType = SHA256

客户/支付网关为此行生成正确的哈希。

现在我们可以将此数据输入到客户端本身(无需以任何方式与MIGS服务器进行交互),但是我们将对其进行一些更改,以便客户端识别必要的变量(大多数客户端仅检查vpc_TxnResponseCode和vpc_TransactionNo):

vpc_AccessCode = 9E33F6D7%26vpc_Amount%3D25%26vpc_Card%3DVisa%26vpc_CardExp%3D1717%26vpc_CardNum%3D4599777788889999%26vpc_CardSecurityCode%3D999&vpc_Message =批准&vpc_OrderInfo =订单信息&vpc_ReceiptNo = 722819658213&vpc_TransactionNo = 2000834062&vpc_TxnResponseCode = 0&vpc_Z =一%26vpc_OrderInfo%3DORDERINFO&vpc_SecureHash = THEHASH&vpc_SecureHashType = SHA256

注意事项:

散列将与以前的数据相同。
客户端将忽略vpc_AccessCode及其值。
假定事务正确,客户端将处理vpc_TxnResponseCode等。

可以说这是MIGS客户端错误,但是万事达卡使用的哈希方法允许存在此错误。 如果对值进行了编码,则此漏洞将不存在。

MIGS的回复

万事达卡未对HMAC-SHA256中的此错误做出响应。 我联系了以前联系过的有关先前漏洞的几个人。 没有答案。 甚至以“我们测试它”的样式退订。 如果要与我联系,他们有我的Facebook(因为有关MD5的信件)。

显然有人假装他们没有看到我的报告,但我在信上加了密码。 万事达卡IP地址至少有3个视图。 同时,由于您需要有意识地输入密码,因此这些点击不是未经阅读的随机点击。 我每周给他们写信。

我的期望是,他们将警告连接到系统的每个人,以检查和过滤嵌入式数据。

支付网关中的空白

另外,我想说:尽管支付网关处理金钱,但它们并不像看起来那样安全。 在我的渗透测试(渗透测试)期间,我在几个中间网关的支付协议中发现了几个漏洞。 不幸的是,我无法透露细节(如果我说“最细”,则属于保密协议)。

我也发现实现错误。 例如,哈希扩展攻击,XML,签名验证错误等。 我在Fusion Payments中发现的最简单的错误之一。 我发现的第一个错误是:他们甚至不检查MIGS的签名。 这意味着我们可以简单地修改MIGS返回的数据并将事务标记为成功。 这仅意味着更改一个字符:从F(不成功)更改为0(成功)。

也就是说,实际上,我们可以输入任何卡号,从MIGS收到错误的回复,将其更改,然后突然付款就可以成功了。 这是一家预算为2000万美元的公司,我从他们那里得到了400美元。 这不是唯一一个存在此类漏洞的支付网关,在笔试期间,我在其他网关中发现了这一漏洞。 尽管奖励很小,但Fusion Payments是我目前联系的唯一付款网关,在奖励程序中很明显地发现了bug。 他们对我的消息做出了快速回应,并迅速修复了他们的错误。

结论

支付网关并不像您想象的那样安全。 如此低的报酬(在某些情况下,我获得了$ 0),我不知道有多少人已经利用了支付网关中的这些漏洞。

译者的话

我想从我自己的角度对研究作者的结论说几句话。 首先,这项研究是对卖方的警告和警告,因为发现的漏洞使卖方成为入侵者的受害者。 但是还有许多其他可能对客户有害的错误(持卡人,支付系统的用户等)。 在未经验证的网站上输入您的个人帐单信息时,请务必小心。 更妙的是,您可以使用一张单独的银行卡,上面有您在Internet上进行购买所需的金额。

您是否在支付系统中遇到任何错误,或者您甚至是此类错误的受害者? 在评论中分享有关如何保护自己的经验,观点和提示。 祝您有美好的一天并安全购物。

作为广告。 促销! 直到现在为止,在荷兰和美国带有VPS(KVM)的配置-E5-2650v4(6核)/ 10GB DDR4 / 240GB SSD或4TB HDD / 1Gbps 10TB-$ 29 ),最多可以免费使用VPS(KVM)4个月。 /月及以上,提供RAID1和RAID10选件) ,这是专用服务器的完整模拟,订购1-12个月的产品时, 此处的操作条款在此处,现有订户可获得2个月的奖励!

如何建立建筑物的基础设施。 使用价格为9000欧元的Dell R730xd E5-2650 v4服务器的上等课程?

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


All Articles