從團購網的漏洞看網站安全性問題
自從9月份在同事推薦下在某團購網買了一份火鍋的套餐后,就迷上了,幾乎每天必去瀏覽一遍,看看有什么又便宜又好吃的。元旦期間當然也不例外,1號那天上午,看到了XXX團購網的“VIP會員0元領紅包”活動,0元?我最喜歡了,雖然參與過很多次0元抽獎的活動,一次也沒中,但是人總是有一種信念相信自己的運氣的。于是果斷進去注冊,點擊購買,進入了購物車再點擊確認訂單,恩?怎么alert這么一句“本活動只限VIP會員參與”?我第一反應是去看頁面源代碼(由于該活動已經結束,進不去購買頁面了,所以在這里我只好用偽代碼來表示):
function btn_click(){
ajax獲取當前用戶的類型
如果不是VIP,alert("本活動僅限VIP會員參與");
否則 form1.submit();
}
然后我在地址欄敲入:javascript:form1.submit(); 回車! 進入付款頁面了,再點擊確定,恩?購買成功!我獲得了5元紅包!
太給力了!!!我又新注冊一個賬號,重復上面的步驟,也成功獲得了5元紅包。馬上給客服留言說明此BUG,不過到今天還沒回復我,呵呵。這個漏洞的關鍵點是開發人員忘記了在form1.submit()的后臺代碼中判斷當前用戶是否VIP會員,只依賴于javascript的驗證。
前臺的驗證頂啥用啊,完全可以繞過去,后臺的驗證才最重要!!有了上午的收獲,1號晚上我就繼續找別的團購網的漏洞,果然被我找到一個更嚴重的。該團購網也舉行了一個元旦抽獎砸金蛋活動,也是免費參與,購買后發現得邀請好友參與活動才有砸金蛋的機會,邀請一個好友就多一個機會,如圖:
我一點擊金蛋就alert一句“沒有抽獎機會了快去邀請好友吧!”,恩,又是javascript?看看代碼先:
這便是金蛋的點擊事件,其中有一個用AJAX去訪問的頁面lottery1.php,而要傳過去的chance變量應該就是當前用戶擁有的砸蛋機會。我試著直接訪問lottery1.php?chance=1,返回error字符串,lottery1.php?chance=0也返回error,lottery1.php?chance=-1,也返回error,難道沒效果么?我刷新了一下砸金蛋的頁面,哇!!
我傳了-1過去導致溢出了?我試著砸了幾個,每次都成功獲得代金卷!!太給力了。接著試著用代金卷去下單,也能成功減免掉幾塊錢,不過一張訂單只能用一個代金卷,呵呵(當然測試用的訂單我最后取消掉了,本人還沒那么邪惡,哇咔咔)馬上聯系客服,居然下班了,QQ不在線,電話打不通,只好留了個言。
接下來干嘛呢?砸蛋唄!42億的金蛋呢,寫了段JS自動砸!截止現在一共有3588個金蛋被砸開,其中至少有2000多個是我砸的,哇咔咔得到了一大堆的代金卷:
整整185頁,呵呵,蠻壯觀的!!!到了2號,我重新查看該團購網的代碼時,發現了一個更嚴重的問題:
JS中有這么個方法
乍一看是跟錢有關的吧,傳入用戶ID和錢的數目,試試有什么效果。用戶ID怎么獲得呢?別急,頁面上有:
這個96204就是我當前帳戶的ID了,訪問了一下,返回“線下充值成功”,哇,這么給力?充值頁面都不加權限驗證的?查看了一下帳戶余額,果然充值成功了:
哥有2萬余額了,哇咔咔!!這個漏洞太致命了,立馬給客服留言。剛留完言,他們的開發人員給我打電話了,和我討論砸金蛋的漏洞問題,正好將剛發現的漏洞一起告訴他。開發人員就是命苦啊,元旦期間,晚上10點多了,他還要改代碼。
改完他說老板可能送點禮品給我,好期待啊,呵呵。最后他把我的帳戶余額清零了,我在心里呼喊:不~要~啊,我的2萬元啊~~~~~~~~
總結一下:前臺的驗證都是不靠譜的,后臺必要都要驗證一遍;管理頁面一定要加訪問權限;傳遞到后臺的數據一定要進行合法性驗證;不必要傳遞的參數就不傳,比如那個砸蛋,我就想不明白為什么要把當前用戶擁有的砸蛋機會傳遞到
后臺,直接從數據庫中讀取不行么?用戶ID不要以明文出現。另外還要防范XSS跨站腳本攻擊(一般用判斷主機頭的方式)