接口測試除了功能,還有安全

開發以為開發好了,測試以為測好了,然後錢還是被“合理”盜走了。

最近有各種拼手氣紅包小程序比較火,諸如包你答、包你拼、包你說等等。很多小程序都是匆匆上線,接口層面設計存在有很大的安全隱患問題,往往容易被人所利用刷紅包,刷提現等資金問題。用戶一旦發現資金被盜,那這個小程序基本是要廢了。

下面根據實際案例,給大家講講我是怎麼找到一個拼手氣紅包類小程序的漏洞的。當然,目的是為了學習,不是幹壞事。如果你是測試,那你可以在你自家產品上測試是否類似漏洞,如果你是開發,可以查看下代碼避免出現有類似漏洞的接口設計。

下面是一個你畫我猜的小程序,發起方可以畫一幅畫,然後塞紅包,分享給好友猜,猜中的人就可以獲得拼手氣紅包。

接口測試除了功能,還有安全

↑↑好友通過分享進入↑↑

1、搶你紅包沒商量

第一步,抓包,通過抓包可以查看進入圖畫頁所請求的接口返回數據:

https://api..cn/index.php/api/draw_guess/wechat/Query_group_draw_info?t=1514290355&v=afabde532d9a8a4969663fc52870ad54&user_id=U20171123062035992245&draw_group_id=2418599&page=1***

{ "c": "0", "m": "", "d": { "is_redpack": "0", "ques_id": "997", "draw_url": "https://..", "img_url": "https://..", "ques_user_id": "U201709171243335621796", "draw_group_id": 2418599, "prompt": "2\\u4e2a\\u5b57\\uff0c\\u4e50\\u5668", "ques_user_avatar": "https://..", "ques_user_nickname": "\\u854eKkkkkk", "num_up": 0, "num_down": 0, "right_cot": 35, "all_cot": 36, "num_page": "1", "num_reward": "0", "is_sub_anwer": 0, "anwer": "鋼琴", "is_up": 0, "is_down": 0, "group_info": [{ "user_id": "U2017122611464418462", "anwer": "\\u731c\\u5bf9\\u4e86", "avatar": "https://..", "t": "20\\u5206\\u949f\\u524d", "nickname": "xuan \\u00b7 dog", "redpack_get": "0", "redpack_money": "0", "correct": "1" }], "redpack_money": "0", "redpack_num": "0", "redpack_num_send": "0", "redpack_type": "0", "rand_recommend": "3798417", "act": "", "pk_info": "", "pk_id": "" }}

注:返回數據中的"group_info"值以及圖片地址是簡化處理過的。

從返回數據中結合頁面信息,很多字段都可以大概猜測是什麼意思,如:answer(答案)

,由於這個關鍵值的暴露,我們就可以輕而易舉知道畫裡面的答案,然後就可以做到無論畫了什麼亂七八糟的東西,我都可以回答正確,順利拿到紅包,如啥都沒畫我就猜中了:

接口測試除了功能,還有安全

這個時候,再深入研究下就會發現,接口請求參數中有個關鍵的字段 draw_group_id(畫id),而且值是純數字,自己嘗試連續創作幾幅畫之後,發現這個字段的值是按+1規律增長的,那豈不是可以任意回答任何一篇畫了?接著寫了個腳本循環就會得出下面的情況:

接口測試除了功能,還有安全

熱心的我把這個bug反饋給了開發者,開發者修復為:如果沒有回答對,接口返回信息中的 answer 為空,所以你現在去試的話,會發現 answer 字段接口信息為空。

2、換個身份獲取答案

很多人以為上面的bug已經修復了,其實這個bug是沒有發現修乾淨的,怎麼說呢?大家再深入想下,這幅圖回答者不知道答案,總得有人是要有權限知道答案,在頁面顯示的吧?猜測是兩類可能可能有權要知道,一類是已經回答正確的回答者,一類是畫的創建者,顯然從畫的創建者權限入手找bug是比較合理的,畢竟一幅畫一定有創建者,但不一定有正確回答者。

我們重新回到接口返回信息中尋找關鍵字段,會發現有個 ques_user_id ,可以斷定這個就是創建者的用戶id,抱著試一試的心理,我將請求接口中的user_id的值更換為ques_user_id的值,結果發現,真的返回答案了。又可以繼續刷紅包了,表示很無奈呀。

https://api..cn/index.php/api/draw_guess/wechat/Query_group_draw_info?t=1514290355&v=afabde532d9a8a4969663fc52870ad54&user_id=U201709171243335621796&draw_group_id=2418599&page=1***

此時,再細細想一下,發現一個可怕的問題,這麼說,這個小程序是完全沒有身份態一說呀,一個user_id走天下,所以接下來我又做了進一步的嘗試來證明我的想法,就是接下來要說的另外一個bug。

3、轉你錢沒商量

這個小程序跟錢相關的地方還有個讚賞功能,就是你欣賞一幅畫,可以對畫的創建者進行打賞,優先使用存在小程序上的餘額(免密)。這個時候我嘗試了一下查詢餘額接口,居然沒有做任何限制可以查詢,嘗試了讚賞接口發現只需要轉賬人id、接收者id、讚賞金額,三個關鍵參數就可以直接轉賬了,重點的是user_id也是有規律有序的,我嘗試遍歷了一下其他人賬戶餘額:

接口測試除了功能,還有安全

當然,我遍歷只是查詢餘額而已,沒有真正把其他賬號的錢轉到個人賬號上,畢竟這對這個小程序的生態破壞太厲害了,不是bug這麼簡單了,我是通過把自己的讚賞其他用戶的形式來驗證自己的想法的:

接口測試除了功能,還有安全

事實證明,真的可以直接轉!!!非常熱心的我再次向開發者反饋這個問題之後,開發者默默的修復了這個問題,加上了身份態校驗,也就是請求參數中的 t、v 這兩個參數,其實這兩個參數一開始就有的,我也不知道為什麼一開始沒有生效,難道遺漏了?

總結

  • 不該知道別知道:其實就是接口數據不要返回不該返回的信息,一開始設計時接口設計沒有關心權限問題。例如上面大answer字段,只要調用畫信息接口就會返回所有信息,導致回答者能直接知道答案。

  • 加密:與錢相關的接口最好是加密處理,雖然一樣可能被破解,還是可以起到一定的門檻作用的。


程序爬蟲獲取國內外測試資源分享給自學愛好者。

關注後回覆測試資料,打包資料下載。

自學聯盟愛好者QQ群:330374464


分享到:


相關文章: