从宽宏售票谈资安

作者/Shaolin

江蕙引退演唱会一票难求,隔岸观了两天火, 也忍不住想要当个键盘孝子。无奈运气不好一直连不上主机,『Service Unavailable』画面看腻了,只好看看暂存页面网页原始码,不看还好,一看我惊呆了!

宽宏售票资讯泄漏 (特别声明:此流程中并无任何攻击行为,该页面是正常购票流程中出现的网页)

结帐网页原始码当中竟然看到了疑似资料库密码 SqlPassWord 在表单里面!这件事从资安的角度来看,除了表面上泄漏了资料库密码之外,还有两个我想讲很久但苦无机会谈的资安议题,分别是金流串接常见的弱点以及骇客心理。借着宽宏售票网页泄漏密码这件事情,顺道与大家分享分享吧!

台湾网站的金流串接

在本篇的例子中,宽宏售票网页表单出现了疑似资料库密码,这状况就好像去银行缴款,柜台给你一把钥匙跟你说:『这是金库的钥匙,麻烦你到对面那个柜台把钥匙给服务员,请他帮你把钱放进金库里面』。

是不是有点多此一举,银行本来就会有一份钥匙,干嘛要请你(浏览器)帮忙转交?

如果今天坏人拿到了这把钥匙,是不是只要绕过保全的视线,就可以打开金库为所欲为?

▲Photo by StockMonkeys.com

类似的状况也满常发生在电子商务与第三方金流服务的串接上。

许多电子商务网站专注于商务,选择将付款步骤委托第三方金流服务处理,一般常见的流程是这样的:

电子商务订单成立,电子商务网站给你一张单子,上面写着:

1、『订单 123 号, 金额 456 元』,请你将单子转交给第三方金流服务网站并缴款。

2、金流服务网站依据你给它的单据收取 456 元,并且跟电子商务网站说:『订单 123 已成功缴款,款项 456 元』。

3、最后电子商务网站告诉你订单 123 号购买成功。

如果现在有一个恶意使用者,他做了以下恶搞:

在步骤一把电子商务网站给的单子修改成:

1、『订单 123 号,金额 20 元』(原价是 456 元)

2、金流服务商依据单据跟恶意使用者收取 20 元费用,并且告诉电子商务网站:『订单 123 已成功缴款,款项 20 元』

3、最后电子商务网站看到『订单 123 已成功缴款』的讯息,就告诉使用者说订单 123 购买成功。也就是恶意使用者只花取 20 元就购买到原价 456 元的产品。

(声明:为求精简,电子商务与金流服务串接流程有经过简化,有抓到精髓就好XD)

不管是宽宏售票出现密码栏位还是上例电子商务网站的金流串接,最大的问题在于他们都相信使用者会正常帮忙转交,即靠客户端的浏览器来转址传值。要知道,利用浏览器转址传值是不可靠的,一来,重要的资讯就会被客户知道,例如宽宏售票疑似泄漏资料库密码;二来中间的内容可以修改,例如修改订单金额。另外,可能有人会发现到,在恶意使用者的步骤三里面,电子商务网站竟然没有确认付款金额是否正确,没错,这是会发生的事情,在过去经验中,像这样没有比对付款金额的台湾系统比例还不少,这些疏忽都会造成企业很多成本损失,不可不注意。

台湾目前还满常见到这种根据使用者传来单据来收费的状况,导致单据可窜改造成企业损失,某部分原因可以归咎到早期第三方金流的范例都是这样写的,工程师也就直接延续这样的写法直到现在。以金流串接为例,比较好的处理方式有下面两种:

1、在单据上加入防伪标记,让恶意使用者无法轻易窜改单据。在技术作法有点类似 OAuth 在 Signing Request 时的作法,在请求中多送一组检查码,透过 one-way hash 的方式检查网址是否有被修改,目前大部分金流商都有提供相似解法。

2、单据不再给使用者转交,电子商务直接传单子『订单 123 号,金额 20 元』给金流服务网站,并请使用者直接去专属的金流商窗口缴费即可。在技术上就是将浏览器转址传值的动作全部变成伺服器对伺服器沟通处理掉。

以上两种作法,将可以有效防止恶意使用者修改订单金额。此外,建议电子商务网站在收到金流回传的付款资讯后,能够比对收取款项与订单款项是否相符,如此双重检查,能大大避免恶意行为,减少企业处理恶意金流问题的成本。

谈骇客心理

很明显的,宽宏售票泄漏密码的状况是工程师的小疏漏。在不知道资料库确切位置的前提下,知道疑似资料库密码的东西确实也无法做什么,顶多就是了解了一家公司制定密码的策略。然而,看在骇客眼里,这点疏失会代表着一个网站面对资安的态度。连显而易见的问题都没有注意,那后端程式应该也有可能出现漏洞。一旦骇客决定要攻击这个网站,势必会搬出比平常还要多的资源去尝试,因为他们认为这个投资报酬率很高。

一般骇客基本上会不断的从所看到的网页资讯来调整自己攻击的强度,如果他们不断看到了奇怪的登入画面:

或是防火墙的登入画面

就很有可能会增加攻击的力道。上面这种登入页面就是就是一种常见的资讯泄漏,在今年台湾骇客年会的议程-「被遗忘的资讯泄漏」就提及了这类资讯泄漏在台湾是很普及的。注意,出现这样的页面并不意味着网站会有漏洞,只是网站容易因此多受到一些攻击。反之,如果一个网站前端页面写的干净漂亮,甚至连 HTTP 安全 header 这种小细节都会注意到,骇客可能就会认为这个网站写的很严谨,甚至连尝试的欲望都没有了。

一个经验丰富的骇客,通常光看首页就能够判断该网站是否可能存有漏洞,凭借的就是这些蛛丝马迹。为了不让自家网站常被路过的恶意使用者攻击,加强网页前端的呈现、网页原始码干净有架构、没有太多资讯泄漏,这些都是很好的防御方法。

结论

在使用最近热门的宽宏售票网站时,我们发现网页原始码存在一些疑似密码的资讯。从这件事情出发,我们分别延伸探讨了两个工程师应该注意的议题:

第一个议题提醒大家在开发的时候,重要的资讯千万不要透过客户端浏览器帮忙转送,记住客户端都是不可信的,多经一手就多一分风险。文中举出了台湾电商网站在金流串接时也常出现这样的问题,可能会造成订单金额被窜改等企业会有所损失的问题。

第二个议题从骇客的心理来谈资安,一个网站如果没有什么保护机制、轻易的泄漏网站资讯,非常容易挑起骇客想要尝试入侵的欲望;反之,若一个网站从前端到使用流程都非常注意细节,一般骇客较会兴致缺缺。严谨的前端呈现,就某种程度来说,也是一种对自身网站的保护。

希望开发者看到上面这两个议题有掌握到『别相信客户端』、『骇客会因网站前端写法不严谨而尝试去攻击』的重点,提升自家网站的安全度吧!

最后说个题外话,身为一个工程师,我认为资讯系统该带给世界的好处是节省大家的时间,而这次抢票却让无数人彻夜排队或守在电脑前不断的『连不上、买票、失败』循环。这也许能够赚到大量的新闻版面,最终票也能全部卖光,但想到台湾有数十万小时的生产力浪费在无意义的等待上,就觉得这个系统好失败。现在的技术已经可以负荷这样大规模的售票,今年 KKTIX 更是十秒就将 COSCUP 一千多张票售完!世界在进步,过去的技术也许就该让它留在过去。有人说:『真正幸福的人:不是抢到票,是可以像江蕙一样选择人生』,希望我也可以变成一个幸福的人,可以选择一个不塞车的售票系统。

●作者/Shaolin,Security Reseacher,喜爱资讯技术、喜欢跟别人走不一样的路。有一点点智障热血人,期望能利用资讯的力量对世界有所贡献,相关文章请见戴夫寇尔部落格(DEVCORE)。以上言论不代表本报立场。ET论坛欢迎网友参与,投稿请寄editor@ettoday.net