程序員要從0下表開始,這篇是介紹這個系列的背景的,沒有興趣的人能夠直接跳過。javascript
因爲工做須要,咱們開發了一個網站,使用了一款身份證識別儀的網頁ActiveX(OCX)插件。可是我發現如今市面上各類識別儀的ActiveX插件都有一個共同的問題,都是能夠被仿冒僞造,好多廠家爲了適應性,採用了同一個ClassID,實現一樣的接口來讀取信息。java
咱們的網站是要給到下線使用的,他們有些就會安裝一些身份證讀取軟件,來經過實現一個一樣接口一樣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控件。api
PS:一開始咱們也以爲從技術上是沒法徹底防範的,從業務規範上的防範會更有效,甚至說安裝個攝像頭防止下面亂來都會有效。不過既然這裏是技術博客,咱們仍是從技術層面作點探討瀏覽器
既然身份證廠家提供了ActiveX(也就是OCX形式的控件),有的甚至會賣大包提供SDK包,也就是下面DLL的調用說明安全
華視電子識別儀驅動目錄↓服務器
南京藝數識別儀驅動目錄↓工具
若是個人ActiveX調用他們的DLL,固然技術上是簡單,可是由於識別儀廠家的驅動是不一樣的,並且DLL的接口也不盡相同,有的甚至不會提供接口文檔,就會形成通用性不好。網站
若是個人ActiveX調用他們的ActiveX,由於你們提供給網頁端都有一樣的接口,因此經過ActiveX調用ActiveX會更加簡單和通用。爲了增長安全性,咱們的ActiveX不會經過網頁進行中轉,而是在內存中直接調用識別儀廠家的ActiveX。spa
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;
問題多了去了!!!我簡單分析了BS加載識別儀數據的過程,有多個漏洞點能夠想辦法繞過。
1:能夠經過通訊截取的,例如用Fiddler等工具攔截通訊,修改讀取的信息
2:直接在瀏覽器通訊前用js腳本修改數據
3:修改註冊表,將ActiveX控件的指向本身寫的一個僞造控件,服務器就分不清是真控件讀取的仍是僞造控件讀取的
4:大部分識別儀廠家的ActiveX控件都是基於公安部發布的幾個動態連接庫,如termb.dll、sdtapi.dll等,這些dll的接口都是無校驗的。寫一個僞造的termb.dll替換官方的dll,就能夠範圍僞造的信息。
5:從dll讀取usb端口應該還有文章可作,只是過於底層沒有深刻研究
還沒算系統鉤子、反編譯破解等高級方法,固然我也不是安全方面的專家,至少將一、二、3等門檻較低的問題修復也就差很少了,爲了達到這個目的,咱們的作法是開發一個ActiveX來調用識別儀廠家的ActiveX控件,並做安全處理(至於中間的安全作法和防禦方法,不在本系列討論內容)。