云網(wǎng)在線支付漏洞初探(圖)
理解這個(gè)漏洞呢,首先要了解一下在線支付的流程,這里引用一下云網(wǎng)官方的流程圖:
正常的在線支付過程呢,是從第一步到第六步!
而這個(gè)漏洞所出現(xiàn)的地方就是在第二步,然后繞過了第三步和第四步、第五步,而直接把返回信息提交給了支付成功返回頁面!
我們?cè)趧?dòng)畫里也只是看到了!它只有一個(gè)提交頁面和網(wǎng)站上的一個(gè)支付成功頁面,根本沒有通過網(wǎng)關(guān)進(jìn)行支付操作,所以錢也就沒進(jìn)入到銀行里,這里也就不存在什么影響銀行安全什么了,純粹是騙人的了!
為什么會(huì)這樣呢!問題出在云網(wǎng)提供給商戶的支付接口文件上,讓我們來看看這兩個(gè)云網(wǎng)提供給商戶的接口文件:
〈%
’*******************************************
’文件名:SendOrder.asp
’主要功能:該示范程序主要完成將商戶訂單信息提交至云網(wǎng)支付網(wǎng)關(guān)的功能
’版本:v1.6(Build2005-05-24)
’描述:假設(shè)商戶的訂單系統(tǒng)都已完成,本頁面主要是幫助商戶按照云網(wǎng)支付網(wǎng)關(guān)要求的格式將訂單信息提交至云網(wǎng)支付@網(wǎng)的支付接口,進(jìn)行支付操作
’版權(quán)所有:北京云網(wǎng)無限網(wǎng)絡(luò)技術(shù)有限公司
’*******************************************
’---訂單信息---
Dim c_mid ’商戶編號(hào),在申請(qǐng)商戶成功后即可獲得,可以在申請(qǐng)商戶成功的郵件中獲取該編號(hào)
Dim c_order ’商戶網(wǎng)站生成的訂單號(hào),不能重復(fù)
Dim c_name ’商戶訂單中的收貨人姓名
Dim c_address ’商戶訂單中的收貨人地址
Dim c_tel ’商戶訂單中的收貨人電話
Dim c_post ’商戶訂單中的收貨人郵編
Dim c_email ’商戶訂單中的收貨人Email
Dim c_orderamount ’商戶訂單總金額
Dim c_ymd ’商戶訂單的產(chǎn)生日期,格式為"yyyymmdd",如20050102
Dim c_moneytype ’支付幣種,0為人民幣
Dim c_retflag ’商戶訂單支付成功后是否需要返回商戶指定的文件,0:不用返回 1:需要返回
Dim c_paygate ’如果在商戶網(wǎng)站選擇銀行則設(shè)置該值,具體值可參見《云網(wǎng)支付@網(wǎng)技術(shù)接口手冊(cè)》附錄一;如果來云網(wǎng)支付@網(wǎng)選擇銀行此項(xiàng)為空值。
Dim c_returl ’如果c_retflag為1時(shí),該值代表支付成功后返回的文件的路徑
Dim c_memo1 ’商戶需要在支付結(jié)果通知中轉(zhuǎn)發(fā)的商戶參數(shù)一
Dim c_memo2 ’商戶需要在支付結(jié)果通知中轉(zhuǎn)發(fā)的商戶參數(shù)二
Dim c_signstr ’商戶對(duì)訂單信息進(jìn)行MD5簽名后的字符串
Dim c_pass ’支付密鑰,請(qǐng)登錄商戶管理后臺(tái),在帳戶信息-〉基本信息-〉安全信息中的支付密鑰項(xiàng)
Dim notifytype ’0普通通知方式/1服務(wù)器通知方式,空值為普通通知方式
Dim c_language ’對(duì)啟用了國(guó)際卡支付時(shí),可使用該值定義消費(fèi)者在銀行支付時(shí)的頁面語種,值為:0銀行頁面顯示為中文/1銀行頁面顯示為英文
c_mid = "000103"
c_order = "12345"
c_name = "張三"
c_address = "北京市朝陽區(qū)XX"
c_tel = "010-12345678"
c_post = "100001"
c_email = "zhangsan@test.com"
c_orderamount = "0.01"
c_ymd = "20050102"
c_moneytype = "0"
c_retflag = "1"
c_paygate = ""
c_returl = "http://www.xxx.com/xxx/xxx.asp" ’該地址為商戶接收云網(wǎng)支付結(jié)果通知的頁面,請(qǐng)?zhí)峤煌暾募?br /> c_memo1 = "ABCDE"
c_memo2 = "12345"
c_pass = "Test"
notifytype = "0"
c_language = "0"
srcStr = c_mid & c_order & c_orderamount & c_ymd & c_moneytype & c_retflag &
c_returl & c_paygate & c_memo1 & c_memo2 & notifytype & c_language & c_pass
’說明:如果您想指定支付方式(c_paygate)的值時(shí),需要先讓用戶選擇支付方式,然后再根據(jù)用戶選擇的結(jié)果在這里進(jìn)行MD5加密,也就是說,此時(shí),本頁面應(yīng)該拆分為兩個(gè)頁面,分為兩個(gè)步驟完成。
’---對(duì)訂單信息進(jìn)行MD5加密
c_signstr = MD5(srcStr) %〉 〈table width="85%" border="0" align="center" cellpadding="0" cellspacing="0"〉 〈tr〉 〈td align="center"〉 〈form name="payForm1" action="https://www.cncard.net/purchase/getorder.asp" method="POST"〉 〈input type="hidden" name="c_mid" value="〈%=c_mid%〉"〉 〈input type="hidden" name="c_order" value="〈%=c_order%〉"〉 〈input type="hidden" name="c_name" value="〈%=c_name%〉"〉 〈input type="hidden" name="c_address" value="〈%=c_address%〉"〉 〈input type="hidden" name="c_tel" value="〈%=c_tel%〉"〉 〈input type="hidden" name="c_post" value="〈%=c_post%〉"〉 〈input type="hidden" name="c_email" value="〈%=c_email%〉"〉 〈input type="hidden" name="c_orderamount" value="〈%=c_orderamount%〉"〉 〈input type="hidden" name="c_ymd" value="〈%=c_ymd%〉"〉 〈input type="hidden" name="c_moneytype" value="〈%=c_moneytype%〉"〉 〈input type="hidden" name="c_retflag" value="〈%=c_retflag%〉"〉 〈input type="hidden" name="c_paygate" value="〈%=c_paygate%〉"〉 〈input type="hidden" name="c_returl" value="〈%=c_returl%〉"〉 〈input type="hidden" name="c_memo1" value="〈%=c_memo1%〉"〉 〈input type="hidden" name="c_memo2" value="〈%=c_memo2%〉"〉 〈input type="hidden" name="c_language" value="〈%=c_language%〉"〉 〈input type="hidden" name="notifytype" value="〈%=notifytype%〉"〉 〈input type="hidden" name="c_signstr" value="〈%=c_signstr%〉"〉 〈input type="submit" name="submit" value="點(diǎn)擊 -〉 云網(wǎng)支付@網(wǎng)"〉 〈/form〉 〈/td〉 〈/tr〉 〈/table〉 |
這個(gè)是向云網(wǎng)網(wǎng)關(guān)提交訂單信息的頁面中的一些關(guān)鍵的代碼!注意下他這個(gè)變量:c_signstr,
以及他的生成方式,是訂單的幾個(gè)信息連接后再md5加密后生成驗(yàn)證簽名的!而這個(gè)簽名是一個(gè)關(guān)鍵
但是從下面的提交表單可以看到,他們都是以明文的方式來提交的!當(dāng)然要用明文了,如果加密的話,在后面就該出問題了!
下面我們來看訂單成功后獲取銀行返回的成功信息的頁面代碼:
〈%
’*******************************************
’文件名:GetPayNotIFy.asp
’主要功能:該示范程序主要完成接收云網(wǎng)支付網(wǎng)關(guān)支付通知信息,驗(yàn)證信息有效性,判斷支付結(jié)果功能
’版本:v1.6(Build2005-05-24)
’說明:
’ 1.本頁面請(qǐng)不要使用諸如response.redirect等頁面轉(zhuǎn)向的語句
’ 2.請(qǐng)直接將訂單處理結(jié)果以HTML代碼的形式輸出在本頁,云網(wǎng)支付網(wǎng)關(guān)會(huì)采用技術(shù)手段獲取您的輸出結(jié)果
’ 3.本頁面如果含有圖片、樣式或鏈接,請(qǐng)將路徑或地址包括域名,
’版權(quán)所有:北京云網(wǎng)無限網(wǎng)絡(luò)技術(shù)有限公司
’*******************************************
’---獲取云網(wǎng)支付網(wǎng)關(guān)向商戶發(fā)送的支付通知信息(以下簡(jiǎn)稱為通知信息)
c_mid = request("c_mid") ’商戶編號(hào),在申請(qǐng)商戶成功后即可獲得,可以在申請(qǐng)商戶成功的郵件中獲取該編號(hào)
c_order = request("c_order") ’商戶提供的訂單號(hào)
c_orderamount = request("c_orderamount") ’商戶提供的訂單總金額,以元為單位,小數(shù)點(diǎn)后保留兩位,如:13.05
c_ymd = request("c_ymd") ’商戶傳輸過來的訂單產(chǎn)生日期,格式為"yyyymmdd",如20050102
c_transnum = request("c_transnum") ’云網(wǎng)支付網(wǎng)關(guān)提供的該筆訂單的交易流水號(hào),供日后查詢、核對(duì)使用;
c_succmark = request("c_succmark") ’交易成功標(biāo)志,Y-成功 N-失敗
c_moneytype = request("c_moneytype") ’支付幣種,0為人民幣
c_cause = request("c_cause") ’如果訂單支付失敗,則該值代表失敗原因
c_memo1 = request("c_memo1") ’商戶提供的需要在支付結(jié)果通知中轉(zhuǎn)發(fā)的商戶參數(shù)一
c_memo2 = request("c_memo2") ’商戶提供的需要在支付結(jié)果通知中轉(zhuǎn)發(fā)的商戶參數(shù)二
c_signstr = request("c_signstr") ’云網(wǎng)支付網(wǎng)關(guān)對(duì)已上信息進(jìn)行MD5加密后的字符串
’---校驗(yàn)信息完整性---
IF c_mid="" or c_order="" or c_orderamount="" or c_ymd="" or c_moneytype="" or
c_transnum="" or c_succmark="" or c_signstr="" THEN
response.write "支付信息有誤"
response.end
END IF
’---將獲得的通知信息拼成字符串,作為準(zhǔn)備進(jìn)行MD5加密的源串,需要注意的是,在拼串時(shí),先后順序不能改變
Dim c_pass ’商戶的支付密鑰,登錄商戶管理后臺(tái)(https://www.cncard.net/admin/),在管理首頁可找到該值
c_pass = "Test"
srcStr = c_mid & c_order & c_orderamount & c_ymd & c_transnum & c_succmark
& c_moneytype & c_memo1 & c_memo2 & c_pass
’---對(duì)支付通知信息進(jìn)行MD5加密
r_signstr = MD5(srcStr)
’---校驗(yàn)商戶網(wǎng)站對(duì)通知信息的MD5加密的結(jié)果和云網(wǎng)支付網(wǎng)關(guān)提供的MD5加密結(jié)果是否一致
IF r_signstr〈〉c_signstr THEN
response.write "簽名驗(yàn)證失敗"
response.end
END IF
’---校驗(yàn)商戶編號(hào)
Dim MerchantID ’商戶自己的編號(hào)
IF MerchantID〈〉c_mid THEN
response.write "提交的商戶編號(hào)有誤"
response.end
END IF
’---校驗(yàn)商戶訂單系統(tǒng)中是否有通知信息返回的訂單信息
Dim conn ’商戶系統(tǒng)的數(shù)據(jù)鏈接
sql="select top 1 數(shù)據(jù)列 from 商戶的訂單表 where 商戶訂單號(hào)="& c_order
set rs=server.CreateObject("adodb.recordset")
rs.open sql,conn
IF rs.eof THEN
response.write "未找到該訂單信息"
response.end
END IF
’---校驗(yàn)商戶訂單系統(tǒng)中記錄的訂單金額和云網(wǎng)支付網(wǎng)關(guān)通知信息中的金額是否一致
Dim r_orderamount ’商戶自己系統(tǒng)記錄的訂單金額
r_orderamount=rs("訂單金額") ’商戶從自己訂單系統(tǒng)獲取該值
IF ccur(r_orderamount)〈〉ccur(c_orderamount) THEN
response.write "支付金額有誤"
response.end
END IF
’---校驗(yàn)商戶訂單系統(tǒng)中記錄的訂單生成日期和云網(wǎng)支付網(wǎng)關(guān)通知信息中的訂單生成日期是否一致
Dim r_ymd ’商戶自己系統(tǒng)記錄的訂單生成日期
r_ymd=rs("訂單生成日期") ’商戶從自己訂單系統(tǒng)獲取該值
IF r_ymd〈〉c_ymd THEN
response.write "訂單時(shí)間有誤"
response.end
END IF
’---校驗(yàn)商戶系統(tǒng)中記錄的需要在支付結(jié)果通知中轉(zhuǎn)發(fā)的參數(shù)和云網(wǎng)支付網(wǎng)關(guān)通知信息中提供的參數(shù)是否一致
Dim r_memo1 ’商戶自己系統(tǒng)記錄的需要在支付結(jié)果通知中轉(zhuǎn)發(fā)的參數(shù)一
r_memo1 = rs("轉(zhuǎn)發(fā)參數(shù)一")
Dim r_memo2 ’商戶自己系統(tǒng)記錄的需要在支付結(jié)果通知中轉(zhuǎn)發(fā)的參二
r_memo2 = rs("轉(zhuǎn)發(fā)參數(shù)二")
IF r_memo1〈〉c_memo1 or r_memo2〈〉c_memo2 THEN
response.write "參數(shù)提交有誤"
response.end
END IF
’---校驗(yàn)返回的支付結(jié)果的格式是否正確
IF c_succmark〈〉"Y" and c_succmark〈〉"N" THEN
response.write "參數(shù)提交有誤"
response.end
END IF
’---根據(jù)返回的支付結(jié)果,商戶進(jìn)行自己的發(fā)貨等操作
IF c_succmark="Y" THEN
’根據(jù)商戶自己商務(wù)規(guī)則,進(jìn)行發(fā)貨等系列操作
END IF
%〉
我們可以看到他的驗(yàn)證簽名的方式,是將銀行反饋過來的信息鏈接后和在提交頁面提交的信息,
先看簽名是如何驗(yàn)證的:
’---將獲得的通知信息拼成字符串,作為準(zhǔn)備進(jìn)行MD5加密的源串,需要注意的是,在拼串時(shí),先后順序不能改變
Dim c_pass ’商戶的支付密鑰,登錄商戶管理后臺(tái)(https://www.cncard.net/admin/),在管理首頁可找到該值
c_pass = "Test"
srcStr = c_mid & c_order & c_orderamount & c_ymd & c_transnum
& c_succmark & c_moneytype & c_memo1 & c_memo2 & c_pass
’---對(duì)支付通知信息進(jìn)行MD5加密
r_signstr = MD5(srcStr)
’---校驗(yàn)商戶網(wǎng)站對(duì)通知信息的MD5加密的結(jié)果和云網(wǎng)支付網(wǎng)關(guān)提供的MD5加密結(jié)果是否一致
IF r_signstr〈〉c_signstr THEN
response.write "簽名驗(yàn)證失敗"
response.end
END IF
是通過提交的這些信息加密后來驗(yàn)證的,而商戶的支付密鑰,我們可以在提交頁面獲取到!而這里他程序需要添加上去的!
我們就不需要了,我們需要的只是讓r_signstr等于c_signstr 就可以搞定它了!欺騙方法我就不說了!
至于其他的欺騙,不存在加密了,全部明文的了!很容易就過去了!
ps:這個(gè)作者當(dāng)時(shí)還發(fā)了一個(gè)別的也是在線支付漏洞的動(dòng)畫,我看都沒有看就刪了.你信這個(gè)動(dòng)畫嗎?反正我是不信!
相關(guān)文章
推薦:二次發(fā)現(xiàn)桃源網(wǎng)絡(luò)硬盤漏洞
推薦:二次發(fā)現(xiàn)桃源網(wǎng)絡(luò)硬盤漏洞...2007-01-01PHP博客程序C-blog2.0漏洞測(cè)試大揭密(圖)
PHP博客程序C-blog2.0漏洞測(cè)試大揭密(圖)...2007-01-01關(guān)于9行代碼導(dǎo)致系統(tǒng)崩潰的分析整理
關(guān)于9行代碼導(dǎo)致系統(tǒng)崩潰的分析整理...2007-01-01