• 开发ActiveX控件调用另一个ActiveX系列0——身份证识别仪驱动的问题


     

    程序员要从0下表开始,这篇是介绍这个系列的背景的,没有兴趣的人可以直接跳过。


    为什么要开发ActiveX控件

    由于工作需要,我们开发了一个网站,使用了一款身份证识别仪的网页ActiveX(OCX)插件。但是我发现现在市面上各种识别仪的ActiveX插件都有一个共同的问题,都是可以被仿冒伪造,好多厂家为了适应性,采用了同一个ClassID,实现同样的接口来读取信息。

    我们的网站是要给到下线使用的,他们有些就会安装一些身份证读取软件,来通过实现一个同样接口同样ClassID的ActiveX,达到身份证读取欺诈的目的。例如clsid:10946843-7507-44FE-ACE8-2B3483D179B7

    <form id="form1" runat="server">    
        <OBJECT classid="clsid:10946843-7507-44FE-ACE8-2B3483D179B7"
          id="CVR_IDCard" name="CVR_IDCard" width="0" height="0" >
    </OBJECT>
    
                <script language="javascript" type ="text/javascript">
                        
    
    function Button1_onclick() {
                        var CVR_IDCard = document.getElementById("CVR_IDCard");                    
                        var strReadResult = CVR_IDCard.ReadCard();
                        if(strReadResult == "0")
                        {
    ClearForm();
                                                  document.all['Name'].value = CVR_IDCard.Name;  
                              document.all['Sex'].value = CVR_IDCard.Sex;    
                              document.all['Nation'].value = CVR_IDCard.Nation;

    既然欺诈的ActiveX这么猖獗,而身份证识别仪必须采用ActiveX控件的方式读取外设,所以我们需要开发自己的安全的ActiveX控件。

    PS:一开始我们也觉得从技术上是无法完全防范的,从业务规范上的防范会更有效,甚至说安装个摄像头防止下面乱来都会有效。不过既然这里是技术博客,我们还是从技术层面做点探讨


    为什么要从ActiveX调用另一个ActiveX

    既然身份证厂家提供了ActiveX(也就是OCX形式的控件),有的甚至会卖大包提供SDK包,也就是下面DLL的调用说明

    华视电子识别仪驱动目录↓

    image

    南京艺数识别仪驱动目录↓

    image

    如果我的ActiveX调用他们的DLL,当然技术上是简单,但是因为识别仪厂家的驱动是不同的,而且DLL的接口也不尽相同,有的甚至不会提供接口文档,就会造成通用性很差。

    如果我的ActiveX调用他们的ActiveX,因为大家提供给网页端都有同样的接口,所以通过ActiveX调用ActiveX会更加简单和通用。为了增加安全性,我们的ActiveX不会通过网页进行中转,而是在内存中直接调用识别仪厂家的ActiveX。

    var CVR_IDCard = document.getElementById("CVR_IDCard");                    
    var strReadResult = CVR_IDCard.ReadCard();
    if(strReadResult == "0")
    {
    
    document.all['Name'].value = CVR_IDCard.Name;  
    document.all['Sex'].value = CVR_IDCard.Sex;    
    document.all['Nation'].value = CVR_IDCard.Nation;

    识别仪厂家的ActiveX控件有什么问题?

    问题多了去了!!!我简单分析了BS加载识别仪数据的过程,有多个漏洞点可以想办法绕过。

    image

    1:可以通过通信截取的,例如用Fiddler等工具拦截通信,修改读取的信息

    2:直接在浏览器通信前用js脚本修改数据

    3:修改注册表,将ActiveX控件的指向自己写的一个伪造控件,服务器就分不清是真控件读取的还是伪造控件读取的

    4:大部分识别仪厂家的ActiveX控件都是基于公安部发布的几个动态链接库,如termb.dll、sdtapi.dll等,这些dll的接口都是无校验的。写一个伪造的termb.dll替换官方的dll,就可以范围伪造的信息。

    5:从dll读取usb端口应该还有文章可做,只是过于底层没有深入研究

    还没算系统钩子、反编译破解等高级方法,当然我也不是安全方面的专家,至少将1、2、3等门槛较低的问题修复也就差不多了,为了达到这个目的,我们的做法是开发一个ActiveX来调用识别仪厂家的ActiveX控件,并作安全处理(至于中间的安全做法和防护方法,不在本系列讨论内容)。

  • 相关阅读:
    ACdream群赛(4) B Double Kings
    ACdream群赛(4)总结
    250E Mad Joe
    ZOJ Monthly, November 2012 I Search in the Wiki
    251C Number Transformation
    253D Table with Letters 2
    Codeforces Round #153 (Div. 2) 总结
    ACdream群赛(4) D Draw a Mess
    ZOJ Monthly, November 2012 G Gao The Sequence
    在vs2005/c++中捕获浮点数异常
  • 原文地址:https://www.cnblogs.com/anic/p/5014462.html
Copyright © 2020-2023  润新知