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