今天碰巧遇到一個不安全的投票系統,被我抓到幾個漏洞惡搞,順便做一下筆記免得自己以後也犯了這個錯誤。
下圖是一個幼稚園的「親子臉」比賽,總投票人數已經超過 70 萬人,第一名還有 50 萬票,如果這是真的,我看他以後可以準備去選總統了。
錯誤一:沒有鎖 IP
嚴謹的網路投票系統,至少會對已投票的 IP 進行封鎖,雖然 ADSL 用戶斷線重新連線後可以取得新的 IP,但是可以減少做票的可能性。這個投票系統是使用 cookies 當作以投票的依據,但是 cookies 可以刪除,甚至我可以讓瀏覽器不儲存 cookies,這樣不是很容易做票嗎?
嚴謹的網路投票系統,至少會對已投票的 IP 進行封鎖,雖然 ADSL 用戶斷線重新連線後可以取得新的 IP,但是可以減少做票的可能性。這個投票系統是使用 cookies 當作以投票的依據,但是 cookies 可以刪除,甚至我可以讓瀏覽器不儲存 cookies,這樣不是很容易做票嗎?
錯誤二:後端沒有做驗證
其實在網頁上面已經用 JavaScript 寫好一人只能選二票的規則,但是我可以把網頁另存新檔以後在改寫,把 JavaScript 全部修掉讓表單資料直接送出,很容易做到。
因為前端做了檢查後端就直接處理資料,實在是很粗心大意。因為如此,我可以用 JMeter 直接把資料用 POST 的方式送出去讓他處理,另外我發現更好玩的事情:他用無限迴圈處理資料直到結束才跳出迴圈,所以我可以一次送出超過投票選項數量的資料,明明只有 23 個選項,我一次送出 500 個結果,他照樣新增進資料庫裡一點都不懷疑。
大家應該知道 JMeter 是什麼東西,用了以後的結果就是:他的伺服器性能每秒能處理 250 query 左右,還算不錯。 :P