Linux + Firefox 登陆网上银行--巧用Greasemonkey扩展

作者: 马路遥 maluyao at 163.com
关键字: Linux Firefox Greasemonkey 扩展 开发 extension 网上银行 建设银行 招商银行 交通银行
前言
  本文不是一篇Hacker教程。你必需使用自己的用户名和密码登陆银行,而不是猜测别人的。甚至如果你对Firefox扩展和JavaScript不甚熟悉的话。按本文的例子行动还会有很大风险。

  本文的作者拒绝对本文的正确性提供任何形式的担保,包括但不限于明示和暗示的。

  Greasemonkey是Firefox 的一种非常强大的扩展,能够在网也内容读入之后,页面显示在浏览器之前执行指定的JavaScript脚本。Greasemonkey 的下载地址。使用方法可以参考如何使用Greasemonkey。本文所介绍的方法,要首先要安装这个扩展。而且您要仔细查看使用说明,才能够理解本文所描述的方法。
  其实另外一个被广泛下载的扩展 Web Developer ,也能实现本文所描述的功能,但更为复杂。

  我们虽然能成功地以旁门左道登录网上银行,但这未必是最好的方法,笔者希望每位从本文得到帮助的读者,都能给你开户银行的webmaser发一封email,要求该行能够直接支持Firefox。如果对方能够修改网页界面支持Firefox,下次评选最佳网行银行的时候,您就可以考虑投他一票。本文附录中列出了部分银行网站webmaster的email地址。

概论

  经常有人说可以在计算机中完全使用Linux生活和工作,但实际上在中国大陆还不能做得到。拿本人来说,我有99.9%的时间都是使用Linux的。不论是写C或Shell程序,听音乐、看电影、在棋圣道场看棋谱,或是在Yahoo游戏打桥牌,都绝无问题甚至游刃有余。但仍然有一个重要的原因使我不能脱离Windows 系统,就是Linux无法登陆某些国内的网上银行。无论如何,我不能和钱过不去。
  最近,MS开始禁止盗版Windows进行网上自动更新,这对很多人无疑是一个打击,这更坚定了我抛弃Windows系统的决心。本人目前的职业是Linux教师,深深地热甃inux/FreeBSD一类的开源软件,非常希望能像理查德.斯托尔曼一样,完全用开源软件。如果有些做不到,就争取无限接近。开源软件的最大优点之一就是可以自己动手编写一些东西。笔者虽然不是程序员,但也能折腾两下。

  国内的银行现在用多如牛毛来形容,应该是一点都不过分的。下面的银行列表表格摘自 hao123网站

银行列表略,见pdf版本。

  很多银行本人根本没有帐号,所以并不关心。据说“洋”行的网站基本对所有浏览器都支持,包括IE 、Firefox、Opera、Safari等。但以前听说过一在英国发生的新闻,某用户在使用Lynx软件访问银行的时候,竟被怀疑是黑客,导致警察上门。所以说,外国的月亮确实圆一点,但也很有限。

  上表中我标出两个绿底的,北京银行和中国银行。前者可以很好地支持Firefox,后者据同事说可以支持Firefox。这里只能对他们的网站设计和人员表示敬意。
  三个蓝底的银行,招商银行、建设银行、交通银行我都有帐号,是不能直接使用FireFox的。其中招商银行和交通银行的登录页面上有ActiveX控件,不能被Firefox所支持。而建设银行的页面,有一个Firefox所无法使用的软键盘。工商银行我虽然没帐号,但知道也不兼容FireFox。

  随机挑选了几个大陆以外的银行,发现除了招商银行香港分行以外,都可以使用Firefox。”和国际接轨“的口号大家已经听烦了,从火车票的票价到大学生的学费都如此,下一个接轨的据说是北京的士的车费。但什么时候春风能吹到银行呢?

  网上银行登录页面的作用,在让客户提交正确的帐号、密码以及其他信息。只要我们能够正确的提交数据,无论页面采用ActiveX还是ActiveY技术,都不会影响我们使用。下面我们来具体分析一下各家银行页面的作用。
  能够提交数据的途径是修改登录页面。例如下列的html代码。

<form method=post action="http://foo.com/cgi-bin/test.pl">
username: < input name=username type=text >
password: < input name=password type=password >
< input name=submit type=submit value="OK" >

  如果我们用浏览器访问该页面并在用户名和密码部分填写zhang3和123.并点击OK按钮,就会将数据提交给http://foo.com/cgi-bin/test.pl处理。甚至你可以直接在你的浏览器地址栏上直接输入http://foo.com/cgi-bin/test.pl?username=z3&password=123 ,效果通常相同。
  网上银行比这要复杂一些,因为很多银行存在一个图片”验证码“,这无法用直接提交的方式发送数据。必需登录银行指定的登录界面。
  刚开始研究这个问题的时候,笔者尝试通过建立一个FireFox的扩展的方式登录网上银行,在深入研究了XUL、DOM等文档后,成功地开发出了自己的扩展,但随后发现,利用现有的Greaemonkey扩展是个更简单的方案。
  Greasemonkey扩展既然可以运行Javascipt脚本,我们就能够利用脚本动态修改页面,使得其能够被Firefox显示并且能提交正确的数据。首先分析原因所在,其中最容易的就是建设银行。

建设银行
  
  建行网上银行的登陆入口

  此页面的问题在于,如果使用Windows+IE ,当试图输入密码时,会打开一个软键盘来输入,这有一定的安全性,但也就只能防止某些可以记录键盘输入的间谍软件而已,但使用Firefox,就根本不能输入密码。

 其部分代码如下(除去了一些定义外观的部分):

< td nowrap>证件号码:< /td> < td nowrap colspan=3> < input name="USERID" type="text" title="证件号码"> < /td>

< td nowrap>登录密码:< /td>
< td nowrap colspan=3> < input id="LOGPASS" name="LOGPASS" type="password" title="登录密码" readOnly onKeyDown="Calc.password.value=this.value" onChange="Calc.password.value=this.value" onclick= "password1=this;showkeyboard();this.readOnly=1;Calc.password.value=''">< /td> < /tr>

  核心问题就是在上述代码中readOnly属性,这使得我们不能够直接输入密码,而只能借助于前文所说的软键盘。
  我写了下面的脚本,用来重写一个标准的密码框来取代原有的部分,内容如下:

1.// ==UserScript==
2.// @namespace http://teenblog.org/tiantian
3.// @name ccb Assist
4.// @description ccb Assist
5.// @include https://ibsbjstar.ccb.com.cn/app/B2CMainPlat?CUSTYPE=0&TXCODE=CLOGIN
6.// ==/UserScript==
7.var passArea=document.getElementsByTagName("td")[104];
8.passArea.innerHTML='<input id="LOGPASS" name="LOGPASS" type="password" class="textlogin" size="20" minLength="6" maxLength="12" title="password">';
9.alertMessage='This page was modified by Greasemonkey extension.\nThe extension use a user defined JavaScript.\nThe Content of JavaScript is not related with Greasemonkey.\nBe care to use this.\nCopyright: GPL V2 \nAuthor: maluyao at 163.com\nKnow Bugs: \n Can not logout\n' ;
10.alert(alertMessage);

  前4行都是描述性的。第5行指出了本脚本针对的网页。
  第7行得到指定的和之间的内容,并在第8行中替换成我们自己的格式。第9行和第10行是弹出一个关于版权和警告信息的窗口,提醒用户注意。当然,最后这两行不是必需的。
  
  把此脚本命名为jianhang.user.js后,直接用Firefox打开。并安装。
  现在用Firefox打开建行的登录界面,就能输入卡号和密码了,正确输入数据并且提交后,进入了下个界面。
     在左上方能正确地看到本人的名字,下方显示的广东分行也是正确的(以前在广东开的户)。沉浸在喜悦当中的我,马上点右下的“不使用证书进入”。
  唉!!!!,只能说十分遗憾。建行网站的内部仍然不支持IE,还的另想办法。
办法就是继续研究html界面,并用适当的内容替换之。因为工作量的关系,笔者放弃了对建设银行的接续研究。
  中国银行的网上银行登录界面同样也有一个软键盘,但是用户可以选择使用或不使用之。从网站界面设计的方面评价,建设银行无疑是和中国银行有些差距了。国际话不能光在嘴上说。要落实在行动上。

交通银行
  
  接下来我们看看交通银行,交通银行的[url=https://pbank.95559.com.cn/personbank/common_logon.jsp]登陆界面[/url]

  交行的登陆界面上用一个ActiveX控件输入密码,这在Linux + Firefox 的环境下是无法显示的。我们的办法是在登陆此界面后,用Firefox 的扩展来修改登陆界面上的内容。重新生成一个Firefox能够正确显示的表单(Form),交通银行的脚本如下:

1.// ==UserScript==
2.// @namespace http://teenblog.org/tiantian
3.// @name JiaoHang Assist
4.// @description JiaoHang Assist
5.// @include https://pbank.95559.com.cn/personbank/common_logon.jsp
6.// ==/UserScript==
7.var addformhead=document.getElementsByTagName('td')[31];
8.alertMessage='This page was modified by Greasemonkey extension.\nThe extension use a user defined JavaScript.\nThe Content of JavaScript is not related with Greasemonkey.\nBe care to use this.\nPlease input Card Number on "Card Number"\nPlease input your password on "PassWord"\nPlease Input adding code below "Picture Code"\nCopyright: GPL V2 \nAuthor: maluyao at 163.com\nKnow Bugs: \n Can not logout\n JIE JI Card Only\n' ;
9.addformhead.innerHTML='' +
10. '\n <input type="hidden" name="netType" value="0"/> '+
11. '\n <input type="hidden" name="language" value="zh_CN"/> '+
12. '\n <input type="hidden" name="userType" value="02"/> '+
13. '\nCard Number '+
14. '\n\nPassWord ' +
15. '\nPicture Code' +
16. '\n '+
17.
18. ''+
19. '';
20.alert(alertMessage);


  第8行和第18行定义和显示了一个对话框,内容是对使用本脚本的客户机的一个警告信息,不是必要的。第9-19行中我们增加了一个新的表单,能够提交正确的数据。  虽然界面目前被改的很丑陋,但能够工作。输入正确的数据后,可以进入网上银行,查看自己帐号的情况。

风险分析

  从上面的例子里可以看出,Firefox的扩展功能十分的强大。可以直接对页面进行修改。但这里也存在相当大的风险。
  比如如果某页面存在一个表单,定义如下:

1.< form method=post action="http://good.com/cgi-bin/test.pl" >
2.用户名: < input id="username" name=username type=text >
3.密 码:< input id="password" name=password type=text >
4.< input name=submit type=submit value=”提交">
5.

  这段内容原本会将数据提交到good.com上的test.pl处理,但如果恶意代码将其改为:

1.< form method=post action="http://bad.com/cgi-bin/test.pl">
2.用户名:< input id="username" name=username type=text >
3.密 码:< input id="password" name=password type=text >
4.< input name=submit type=submit value=”提交">
5.

  这会导致原本应该发送给good.com的数据被发送给bad.com。风险极大。

招商银行

  相比于上面两个银行,招商银行的难度要高一些。招商银行使用的ActiveX控件,能够使得卡号和密码在提交前就被ActiveX所加密,密文具有一定的随机性。然后再提交数据。笔者认为这并不是必要的,但毫无疑问,这种机制加大了我工作的难度。
  
  如果能分析出这个加密算法并用JavaScript实现,招商银行的问题也就解决了。从密码学的原理来说,已知明文和密文,分析出算法并不是件非常困难的事情。但这需要时间。这个问题的详细内容,请参考: http://bbs.chinaunix.net/viewthread.php?tid=749579&extra=page%3D2 。

  目前笔者还没有分析出算法,但使用某种技巧,笔者能针对任意帐号和密码在自己的电脑上生成密文。这样虽然未知加密算法。但可以先得到自己帐号密码的密文内容,然后通过修改网页的方式提交出去。当然,这种方式暂时只能自学自用,不便公开。事实上,因为招行的网站有很多”桢“(Frame)。修改起来过于麻烦。目前的计划是不久以后注销掉招商银行的帐号。

  据说工商银行的ActiveX也有类似的机制,因为没有工行帐号,就不准备进一步研究了。但相信也可以通过和招商银行类似的方式解决。

风险提示和后记

  
  对于一般的用户,特别要注意不要安装来路不明的扩展和脚本,这其中的风险几乎相当于自己给自己安装一个木马。因为除了JavaScript语言开发以外,Firefox的扩展还可以使用Java、C/C++等语言开发,能够实现非常底层的功能,甚至格式化你的硬盘。

  感谢笔者现在的雇主—,没有给安排给我太多的工作任务,使得能够有足够的时间和精力,深入研究自由软件的各种技术,回报自由软件社区。

定稿于2006年5月7日

附录:
部分不支持FireFox的银行及其webmaster 的email地址:
中国工商银行 webmaster@icbc.com.cn
中国农业银行 95599bj@abchina.com
交通银行   95559@bankcomm.com
中国建设银行 首页上未标明
招商银行   首页上未标明

Comments

建行用了新的网银系统了,发现一个问题啊
直接登录网银的密码键盘无法显示, 但是通过支付宝充值过来的充值页面却可以显示密码键盘? 虽然不能用,但是好歹可以点键盘输入,就这样可以无痛充值了:)

Wow! That's a really neat anrews!

现在建行在linux到能直接进入了 但是进入后里面的操作界面一团糟 根本用不了
不知大大能否出个脚本修正一下亚

randomness