隨著網民越來越習慣于網上購物,出現了越來越多的電商網站,在線交易平臺等。
其中肯定要涉及在線支付的流程,而這里面也有很多邏輯。
由于這里涉及到金錢,如果設計不當,很有可能造成0元購買商品等很嚴重的漏洞。
根據烏云上的案例,支付漏洞一般可以分為五類,如果發現其他的類型,歡迎補充:
這種漏洞應該是支付漏洞中最常見的。
開發人員往往會為了方便,直接在支付的關鍵步驟數據包中直接傳遞需要支付的金額。
而這種金額后端沒有做校驗,傳遞過程中也沒有做簽名,導致可以隨意篡改金額提交。
只需要抓包看到有金額的參數修改成任意即可。
我們來看一看烏云上的幾個案例:
WooYun: 佳域手機官方商城支付漏洞 (這個亮點是真的到貨了……)
WooYun: 京東商城購買商品時,可以修改商品金額,并且支付成功
WooYun: 京東團購訂單金額可在客戶端修改并提交網銀支付
WooYun: 網通營業廳客戶信息泄露、充值支付價格修改漏洞
這種案例也比較常見,產生的原因是開發人員沒有對購買的數量參數進行嚴格的限制。
這種同樣是數量的參數沒有做簽名,導致可隨意修改,經典的修改方式就是改成負數。
當購買的數量是一個負數時,總額的算法仍然是"購買數量x單價=總價"。
所以這樣就會導致有一個負數的需支付金額。
若支付成功,則可能導致購買到了一個負數數量的產品,也有可能返還相應的積分/金幣到你的賬戶上。
WooYun: 國美網上商城支付漏洞1元訂購Iphone 4S!
最后一個漏洞與其他不同的是把數量改成一個超大的數,而不是負數。
結果導致支付的金額可能超過一定數值而歸0。
購買成功后,重放其中請求,竟然可以使購買商品一直增加~
阿里云主機多次下訂單,會出現0元訂單情況,不知道程序員后端是如何寫的……
此案例金錢已經做了簽名認證,修改后不通過。
但是仍然有一個參數會對最后的金額產生影響而沒有一起做簽名導致問題產生。
其實修復方案很簡單,對傳遞的金錢,數量等對最后支付金額會產生影響的所有參數做簽名。
并且注意簽名算法不可被猜測到。
這樣攻擊者修改數據的時候驗證便不會通過。
同時注意對已經交易的訂單不可重復而造成重復重置的漏洞。
參考:http://zone.wooyun.org/content/878