雖然遲了一天,但還是祝各位小夥伴端午安康。
最近因爲端午節到來,物業舉辦了一個網頁小遊戲,得分最高的前 N 名可以拿到獎品。
閒來無事的我參加了一下,發現自己實在是太菜了,總是玩不過別人,於是轉變思路,研究看看這個小遊戲是如何提交分數的。
抓包
通過 Charles 進行抓包,發現遊戲結束時會調用 commit
接口提交分數。那這就好辦了,因爲我們可以利用 Postman 僞造請求,從而達到 “不戰而勝”。
如果想了解如何抓包,可以在評論區留言,有需要的話再寫一篇抓包教程。
接口分析
抓包知道哪個接口還遠遠不夠,因爲接口最重要的還是請求參數,所以我們需要弄清楚每個參數的代表的意思,一般可以參數名可以猜出來。
特殊參數
一個特殊的參數 sign
,這個參數是簽名的意思,由其他參數計算得到,作用是防止請求參數被篡改。因爲參數發生變化,計算出來的簽名也是不同的。服務端經過相同的計算,可以校驗參數與簽名是否匹配。
因爲 sign
是計算得到的,我們僞造請求同樣需要計算 sign
,那麼就要知道簽名算法,如何知道?我們只能通過網頁源碼查看。
現在的網頁源碼大部分都是經過打包工具壓縮混淆,我們想要閱讀是一件比較困難的事情。但是我們只需要看提交分數的部分即可,如何快速定位代碼位置?答案是通過搜索字符串來定位。
打包工具混淆代碼只能修改變量名,而字符串是不能被混淆的,我們通過字符串搜索就可以稍微快速找到對應位置的代碼。比如通過接口名 'commit'
、參數名 'sign'
進行搜索,查看簽名算法的邏輯。
請求頭
很多人僞造請求,都不注意請求頭的參數。例如 User-Agent
用戶代理,即用戶使用的瀏覽器標識、Cookie
一般會攜帶用戶信息,用於區分用戶。
既然要僞造請求,那就要僞造的真實一點,將抓包中顯示的請求頭都複製到 Postman 中(Content-Length
除外)。
發起請求
一切都準備就緒,那麼就可以開始利用 Postman 發起請求。因爲涉及簽名計算,我們可以利用 Postman 提供的 Pre-requset Script 編寫請求前的計算邏輯,並將計算結果寫入環境變量中,然後再使用 {{}}
進行取值。
將 sign
保存到環境變量中
pm.environment.set('sign', sign);
變量的使用
到這裏就可以發起請求了,從而達到 “不戰而勝” 的效果。當然了,這種做法破壞了遊戲的公平性,是不可取的。不過我們可以從中吸取經驗,多思考問題,提升自身的技能。
思考
換位思考一下,假如這個小遊戲是我們自己開發的,那麼請你思考這幾個問題。
- 我們的應用該如何提高安全性,如何防止源碼被輕易解讀?
- 我們如何去發現識別這類僞造請求?
歡迎評論區留言討論,也可以 wx 搜索 fe_develop6
一起在羣裏學習討論。最後別忘了關注我,點贊來一波哦~
注意事項
- 該方法並不適用所有遊戲,請自行分辨;
- 本文僅供學習,如產生不良後果,本文概不負責;
- 轉載請標明出處 技術人玩小遊戲,如何“不戰而勝” @前端develop。