奇怪的支付网关

信息安全 xss 支付网关
2021-08-22 07:34:28

我有一个自由客户,希望我将支付网关集成到他们的 Woocommerce 网站中,但我越来越担心他们选择的提供商和整个项目。

问题

根据我的建议,客户选择了网关提供商。该提供商是我以前从未听说过的远东地区,称为 Payforasia。第一个警告标志是他们网站的英文和中文(我认为是中文)版本似乎无法正确加载图像。

我获得了网关 API 的 PDF 文档和一个简单的 PHP 演示。他们还让我登录到商家前端,这样我就可以监控我的测试交易。都还算正常。

我在我的本地主机上运行了演示并设法连接到支付网关,但得到了一个失败的错误响应。该错误未在文档中列出,实际上可能的错误列表从 0001 到 0067。我收到错误 0068。第二个警告标志。当我通过我的客户联系供应商时,要求提供最新的文档和有关错误的建议。有人告诉我,文档是最新的,并且由于国定假日,办公室关闭了一个多星期(!?!?!)。他们今天终于回复了我,说这个错误“可能”是因为他们没有将服务器 IP 列入白名单,他们现在已经解决了这个问题。我仍然得到同样的错误。

当我等待他们回复我时,我开始深入研究演示代码并重新阅读他们的文档,看看我是否遗漏了一些明显的东西。我在他们的文档中注意到了这一行:

csid String 100 是 通过 http://cm.js.dl.saferconnectdirect.com/csid.js获取值

从最初的测试开始,在等待他们结束为期一周的国庆假期时,我已经在我客户的网站上应用了 SSL,显然浏览器不会加载到 javascript 的不安全连接。此 URL 在演示中,但在它和演示表单标记之间的大量返回之后位于底部。另一面旗帜向我挥动。

在尝试了与协议无关的 url 和 HTTPS 后,结果发现csid.js无法通过安全连接使用。所以我将JS复制到服务器并修改了标记中的链接。这就是挥舞旗帜的真正开始精神的地方。

该脚本使用我的用户代理字符串、我的屏幕分辨率、原始服务器和散列数据填充 CSID 字段。更令人担忧的是,它还添加了一个看起来是跟踪图像或类似内容的 iframe。iframe 使用 wss:// 协议触发六个到 localhost 的奇怪连接。

来自 FireBug 的连接错误的图像

我承认此时我惊慌失措,来到这里寻求建议。JS 被缩小了,看起来里面有一个 PHP eval(),看起来像编码字符。我不知道如何解码,我不确定继续深入挖掘代码是否安全。

我的问题

我需要一些建议。

  1. 我是过度偏执还是我有真正的担忧?
  2. 网关提供商像这样混淆他们的代码是否正常?
  3. 我应该建议我的客户立即更换供应商吗?
  4. 我应该走开并记录下来体验吗?

对此的任何建议、建议或意见将不胜感激。抱歉,如果我的问题很冗长且有点冗长,我想获得尽可能多的背景知识。

更新

在所有优秀的建议之后,我只是想给大家一个快速的更新。

我向我的客户提出了很多我的担忧,但他并没有按照我预期的方式做出反应。我被指控故意拖后腿,发明问题,无能,并且收到的关于我的出身的专业性问题。我和我的客户之间的关系肯定已经结霜了。

他们坚持要我在站点上实现没有 SSL 的网关当我拒绝并邀请他们寻找另一位开发人员时,他们几乎立即退缩并变得更加亲切,尽管我还没有收到道歉。

从那以后,他们透露网关提供商将错误的 IP 列入白名单,这就是为什么我仍然收到神秘的 0068 错误。网关提供商试图将那个固定在我身上,直到我提供相反的 Skype 日志。我的客户不允许我直接与网关提供商交谈,因此 IP 地址在他们之间的某个时候出现了乱码。

关于不安全的 JavaScript,昨天晚些时候,我的客户突然向我提供了这个 URL https://online-safest.com/pub/csid.js他们没有提供任何进一步的文档,也没有提供此脚本的来源。我还没有测试过这个脚本。

我不确定我想继续这样做,所以我一直在拖拖拉拉。我今天需要考虑一下。明天我会接受一个答案,不幸的是我不能接受多个答案,即使我已经使用了几个的内容。

更新 2

只是最后的更新。我为我的客户完成了这个项目,但我担心我与他们的关系现在受到不可挽回的损害。他们坚持让我在没有任何测试的情况下启用网关,除了一个测试事务通过的事实。我已经告诉他们,他们遇到的任何上线后问题都需要寻找另一个开发人员,因为他们在没有测试的情况下上线并且丧失了我的正常支持期。

你可能会争辩说,我将代码发布到野外是不道德的,这对最终用户来说可能是错误的和危险的,但是我没有其他方法可以轻松退出合同。我已授予他们对包含源代码的私有 GIT 存储库的完全访问权限,该源代码包含我与客户之间所有记录在案的交互。任何未来的开发人员都应该能够查看它并从那里做出决定。

我进一步发现他们实际上已经将工作分包给了我。总而言之,这是一个我很高兴摆脱的项目。

4个回答
  1. 我是过度偏执还是我有真正的担忧?

你有一个真正的担忧。这有些不对劲。

  1. 网关提供商像这样混淆他们的代码是否正常?

混淆本身并不是不正常的。然而,当他们试图打开与 RDP、VNC 和其他端口的 localhost 连接时,这不是混淆,这是完全不恰当和恶意的。

  1. 我应该建议我的客户立即更换供应商吗?

我会建议您的客户,为集成提供的代码似乎是恶意的,您不能假设供应商是 a) 合法的或 b) 能够保护他们的业务(以及扩展,您的客户的)。此外,供应商似乎没有正确集成到安全的采购环境中(http:only js 链接),即使是合法的,这也让人质疑他们的适当性。

根据@JaimeCastells 对该问题的评论,http://www.visa.com/splisting/searchGrsp.do 中没有列出“payforasia”服务提供商这可能意味着他们以该名称开展业务,但以不同的名称获得认证,或者这可能意味着他们是“2 级服务提供商”。坦率地说,这些选项都不能让人放心。

  1. 我应该走开并记录下来体验吗?

如果客户想继续与该供应商合作,我肯定会考虑离开。你不能让客户做正确的事,但你可以选择不做为他们做错事的人。

Javascript分析

混淆 Javascript 的意图似乎很重要。我试图解开 Javascript 中发生的事情,我将在本节中链接到可读的部分去混淆副本。

总的来说,我的印象是,这些脚本中使用的混淆程度超过了商业上合理的程度,因此变得可疑。我可以得出的关于它的作用的推断数量有限,这与正常的支付处理并不相符。由于缺乏更好的信息,我认为这是恶意 javascript。

如果您想探索相同的问题,这里是我正在查看的文件。这些文件已通过Online Javascript Beautifier运行 ,我还使用Online Javascript Editor来挑选脚本的部分功能。您可以看到,即使应用了基本的去混淆,仍然有很多混淆 - check.js 充满了由代码处理的整数数组,并且可能是更多的文本或要执行的代码。

至少涉及四个脚本:

例如,很明显,OP 看到的连接尝试的五个端口被硬连线到 check.js 中:

td_0a = ['REF:63333', 'VNC:5900', 'VNC:5901', 'VNC:5902', 'VNC:5903', 'RDP:3389'];

我会继续戳他们,可能会粘贴一些副本,但我认为此时不信任这段代码是合理的。

关于那个混淆的 javascript 的更多信息:他们正在使用 packer,一种非常著名的 javascript 压缩方法。这是解压后的js(你也可以在这里自己解压:http: //dean.edwards.name/unpacker/):

var a = "";
try {
    var z = document.createElement('canvas');
    var A = z.getContext('2d');
    var B = 'http://security.tencent.com/';
    A.textBaseline = "top";
    A.font = "14px 'Arial'";
    A.textBaseline = "tencent";
    A.fillStyle = "#f60";
    A.fillRect(125, 1, 62, 20);
    A.fillStyle = "#069";
    A.fillText(B, 2, 15);
    A.fillStyle = "rgba(102, 204, 0, 0.7)";
    A.fillText(B, 4, 17);
    var C = z.toDataURL();
    C = C.replace("data:image/png;base64,", "");
    var D = atob(C).slice(-16, -12);
    a = b(D)
} catch (err) {};

function b(z) {
    var A, B, C = '',
        D;
    z += '';
    for (A = 0, B = z.length; A < B; A++) {
        D = z.charCodeAt(A).toString(16);
        C += D.length < 2 ? '0' + n : D
    };
    return C
};

function c(z, A) {
    var B = 180;
    var C = new Date();
    C.setTime(C.getTime() + B * 24 * 60 * 60 * 1000);
    document.cookie = z + "=" + escape(A) + ";expires=" + C.toGMTString()
};

function d(z) {
    var A, B = new RegExp("(^| )" + z + "=([^;]*)(;|$)");
    if (A = document.cookie.match(B)) return unescape(A[2]);
    else return null
};

function e() {
    var z = "";
    for (var A = 1; A <= 32; A++) {
        var B = Math.floor(Math.random() * 16.0).toString(16);
        z += B
    };
    z += new Date().getTime();
    return z.toUpperCase()
};
var f = "";
f = d("ccpspay");
if (f == null || f == '') {
    f = c("ccpspay", e());
    f = d("ccpspay")
} else {
    f += "OLD"
};
var g = "vduzzz8d";
var h = e();
var i = "";
i = navigator.systemLanguage || window.navigator.systemLanguage || navigator.language;
var j = "";
j = navigator.browserLanguage || window.navigator.browserLanguage || navigator.language;
var k = "";
k = navigator.appCodeName || window.navigator.appCodeName;
var l = "";
l = navigator.appMinorVersion || window.navigator.appMinorVersion;
var m = "";
m = navigator.appName || window.navigator.appName;
var n = "";
n = navigator.appVersion || window.navigator.appVersion;
var o = "";
o = navigator.cookieEnabled || window.navigator.cookieEnabled;
var p = "";
p = f;
var q = "";
q = a;
var r = "";
r = navigator.platform || window.navigator.platform;
var s = "";
s = navigator.userAgent || window.navigator.userAgent;
var t = "";
t = navigator.userLanguage || window.navigator.userLanguage;
var u = "";
u = String(window.screen.fontSmoothingEnabled);
var v = "";
v = String(window.screen.width + "x" + window.screen.height);
var w = "";
w = String(window.screen.colorDepth);
var x = new Array;
x[0] = i;
x[1] = j;
x[2] = k;
x[3] = l;
x[4] = m;
x[5] = n;
x[6] = o;
x[7] = p;
x[8] = q;
x[9] = r;
x[10] = s;
x[11] = t;
x[12] = u;
x[13] = v;
x[14] = w;
x[15] = new Date().getTimezoneOffset() / 60 * -1;
x[16] = window.location.host;
x[17] = h;
var y = x.join("&@");
document.getElementById("csid").value = y.toUpperCase();
document.write("<script type='text/javascript' src='https://h.online-metrix.net/fp/tags.js?org_id=" + g + "&session_id=" + h + "&pageid=1'></script>");
document.write("<noscript><iframe style='width: 100px; height: 100px; border: 0; position: absolute; top: -5000px;' src='https://h.online-metrix.net/tags?org_id=" + g + "&session_id=" + h + "&pageid=1'></iframe></noscript>");

虽然它们可能是合法的支付网关(我不知道,但对我来说它们看起来很阴暗),但它们充满了跟踪工具。您可能至少要警告客户这一点。

您正在分析的 Javascript 代码的行为不寻常,但作为反欺诈系统的一部分似乎是合理的。

此脚本用于评估客户端计算机的欺诈风险。作为此评估的一部分,它正在检查机器是否可以配置为开放式 Web 代理——这就是脚本试图在各种端口上打开 WebSocket 到 localhost 的原因。我以前没有见过这种特殊的技术,但我认为它实际上相当聪明。:) 它通过让客户端机器扫描自身来避免执行侵入性外部端口扫描!

我自己并没有完全分析脚本,但是根据您链接的脚本中的一些关键字,该脚本似乎也在从浏览器中收集各种识别信息,例如浏览器版本、系统语言和各种配置选项。同样,这对于反欺诈评估是合理的,并且该供应商使用这些方法并不罕见。

我只从另一个角度回答一个问题:

我是过度偏执还是我有真正的担忧?

仅由于他们的网站,您就有真正的担忧。

http://www.payforasia.com/

图片未加载的原因是 AdBlock(见下图)。

他们的图像来源在一个单独的服务器上:

(probably don't want to look at it, to be safe)
http://www.payforasia.com.img.800cdn.com/images/logo.jpg  

800cdn.com 在恶意软件域列表中:

https://easylist-downloads.adblockplus.org/malwaredomains_full.txt

公司是中国人,中文版块说是在深圳。

在此处输入图像描述