阿里月餅門事件的技術原理?

當事人說使用了腳本。有人能解釋一下怎麼實現的嗎,是把頁面在本地的腳本替換為自己的腳本了嗎,然後讓頁面按自己意願執行指令?


腳本技術的原理其實非常簡單,我這種技術盲以前用excel都會寫一些自動執行腳本的宏,但要給完全沒接觸過的人講清楚,用技術來解釋也是白搭。

簡單說,其實就是一種自動化。比如老式的洗衣機,洗滌——脫水——漂洗——脫水——漂洗——脫水,要操作三次,而自動式的洗衣機只需要操作一次,剩下自動幫你完成。

搶票、搶購之類的腳本,無非是在自動基礎上加了一個監控。想像一個超市,準點開賣,賣完即止,你在附近溜達,一會兒就進去看看,免得錯失機會。顯然,這麼做很累,於是有人發明了一個機器人,在你出去溜達的時候,他時刻盯著貨架,一旦發現上貨就立刻打電話叫你:「快來,可以買了!」

行為過程和行為意圖要拆開來看。從結果上看,是否有牟利的想法,是否利用技術作弊,是否需要開除,這些都已經討論爛了。但平心而論,腳本這件事,真的是程序員習慣。我在經常用excel的那兩年(過去很久了)里,看到任何錄入、計算、製表的行為都想將其自動化。有一次在某個圖書館裡,看見前台在機械地選取、複製、編輯、粘貼,然後過去操作了一下,十秒鐘完事,然而對方絲毫沒有感激的意思,大意是說,帶來的是無聊空虛的一天,何苦呢?所以世界觀不同,理解也會不同。

自動化腳本上癮會是怎樣?以前看過一個英國軟體公司CEO寫的日誌(Now that"s what I call a Hacker),說他們那有位程序員從來不離開電腦,一直到他離開公司,才發現真相——他只要發現有任何工作會佔用他 90 秒以上的時間,他就會寫腳本讓程序自動執行。這些工作包括:

跟老婆發消息要晚點回家:

腳本會自動從一組字元串裡面隨機抽取一些理由(努力工作中、有個新功能得趕出來、有人又把系統搞砸了)。而這個腳本會觸發的情境,是只要在晚上 9 點之後有他的帳號登錄公司伺服器,消息就會自動由腳本控制發送。

自動修復客戶資料庫:

(看來是用來對付一個可能常常會跟他說系統出錯的客戶。)

程序會掃描他的收件夾,如果檢查到有這位客戶所發送過來的郵件,並且郵件的包含有 「幫助」、「麻煩」、「對不起」 這類的關鍵字,腳本就會自動把客戶的資料庫恢復到最新的備份。更貼心的是,他還設計了自動回復:「沒問題,我把問題修好了,下次小心點就好。」

編不上班的借口:

與跟老婆發消息說要晚點回家的原理一樣,只是換成是沒來上班的借口。如果早上 8:45 還沒登錄公司伺服器,就會觸髮腳本,自動發消息給公司主管。隨機選擇的借口一堆:食物中毒、家中水管壞了、身體不舒服...諸如此類。

自動泡咖啡:

腳本會等待17秒之後進入咖啡機,讓它泡一杯拿鐵,然後再等24秒之後讓它倒咖啡,為什麼是這個時間?因為24秒剛好是他從桌子走到咖啡機旁邊的時間。然而,最大的問題是:沒有一個同事知道公司的咖啡機已經被他搞到可以聯網了……

這是他的 GitHub,命名方式很不文雅,請不要學習。不過,我真心覺得這種生活方式對於程序員來說實在太好理解了,你覺得呢?


我不是阿里的,不知道他們的網頁是咋樣的,這裡只是提出一個可能的寫法而已。

據說驗證碼是寫在 JavaScript 裡面的,所以我們就有了以下的代碼。

搶月餅的部分大概可以用這樣的代碼完成:

setInterval(()=&>{ //設置定時器
var submit = $("#submit"); //獲取「搶」的按鈕
if(submit.prop("value") == "搶"){ //檢測按鍵的值是不是「搶」
captcha = true; //跳過驗證碼
getMoonCake.click(); //模擬點擊
}
},250); //250 毫秒

意思就是說每 250 毫秒檢測一下是否可以搶了,可以就去搶。

實際上如果他們是這麼寫的話就沒事了:

(function(){
var interv = setInterval(function(){ //設置定時器
var times = 0; //計數器
return function() {
if(times &>= 3){ //設置最大次數
clearInterval(interv); //清除定時器
return;
}
var submit = $("#submit"); //獲取「搶」的按鈕
if(submit.prop("value") == "搶"){ //檢測按鍵的值是不是「搶」字
//根據網頁的寫法不一樣也可能
//有其他實現方法
times += 1;
captcha = true; //跳過驗證碼
getMoonCake.click(); //模擬點擊
}
}
}(),250); //250 毫秒
})();

腳本如上,打開瀏覽器按 F12 後放進 console 執行就可以。以上代碼沒有入侵伺服器、修改網頁。只是在自己的瀏覽器上運行一段腳本自動檢測、提交「搶」的請求而已。

如果把 version 2 模擬點擊的代碼換成列印 times 變數在 Chrome 執行則會變成這樣:

不懂 JavaScript 的人可以看 // 後的注釋。


不會編程的人你怎麼解釋也沒有用;會編程的人知道這個事件後就知道它的原理。

首先你要知道,你按f12瀏覽器就會出現調試窗口,裡面有很多開發者工具,可以給網頁注入代碼。

控制台可以注入js腳本。

下面你如果懂js這根本就不是問題。

代碼別人都放過了,這是給程序員看的,小白看了也是白看。

總結思路就是

1.獲取目標按鈕dom。

2.然後用setInterval設置每幾秒觸發一次事件

3.if語句做判斷。用text()獲取按鈕的value 當它的文本變成秒殺,就瘋狂用trigger 模擬點擊事件。這個函數可以模擬人工點擊。

我好奇的是它怎麼繞過驗證碼的?不過我想既然可以入職阿里這都不是什麼難以辦到的代碼。


不用替換,可以在頁面當前上下文中執行自定義腳本,打開chrome的開發者工具控制台就能直接敲js代碼


如果讓人來做,那麼成功搶到月餅的流程是:

點擊 --&> 輸入驗證碼 --&> 付款,由於要手動停下來輸入驗證碼,等你輸完的時候,月餅已經被搶光了,不會出現連續點擊搶到多個月餅的情況。

這次由於網頁的問題,腳本能直接繞過驗證碼。成功搶到月餅的流程是:

點擊 N次 --&> 付款 ,有的搶了3個,有的搶了16個,還有的搶了一百多個。

爭議在於繞過驗證碼,算不算利用漏洞?我認為算的。開發在寫搶購網頁的時候犯了個低級錯誤,把驗證碼寫在網頁源碼中。寫腳本的諸君利用這個錯誤,跳過人眼識別並輸入驗證碼的環節

驗證碼(CAPTCHA)是「Completely Automated Public Turing test to tell Computers and Humans Apart」(全自動區分計算機和人類的圖靈測試)的縮寫,是一種區分用戶是計算機還是人的公共全自動程序。


哦,原來這麼大新聞就是個定時器整出來的嘛.....


請問:如果用UC搶票搶本次月餅,HR除了開除我,是不是還要開除整個開發UC搶票軟體的部門?


頁面不用刷新就可以改變submit的value?刷新了定時器就沒用了吧?難道說那個提交按鈕是頁面js刷新的?


大概是

大夥上山取柴,都是靠手,你花點力氣弄了把斧頭,然後狂砍,滿載而歸;

大夥點滑鼠搶月餅,你花點時間寫了個腳本,瘋狂點滑鼠,滿載而歸;

再這事件中,原理只要明白一點就好了,就是寫個腳本幫我點滑鼠,我不想浪費時間自己去點。


你點擊網頁上的一個按鈕的時候,它是調用了一個函數過程,輔助腳本通過修改本地網頁的執行代碼,在其中插入自動化代碼,比如符合一定條件時自動調用這個過程(和你點擊按鈕是等效的)。這個條件可能來自定時檢測,並根據按鈕名稱、是否可用等條件判斷。所以,驗證碼的最主要作用就是防止程序化執行。當然,發送的代碼最終是否有效,仍受伺服器檢驗。月餅事件中,頁面驗證碼可以被繞過,這處理的五人,是因為極短時間重複或多次執行腳本,導致下單數量超過活動規則限制,被以「技術手段作弊」勸退。如果下單數量沒超規則限制,從表現是無法區分人工點擊、機械手操作滑鼠、按鈕精靈點擊或自動代碼執行的。


月餅門的原理和遊戲外掛一個樣,是程序員用代碼解放自己雙手的正義舉動。

舉個例子,有一個日本手機遊戲叫做《碧藍幻想》。大概長成這樣:

這個遊戲和魔獸世界一樣,也有所謂的副本,需要組隊才能打得過。不幸的是,這個遊戲沒有組隊系統,而是提供了「在微博上組隊」的功能,點一下就會發一條類似這樣的信息:

要想組隊的玩家,就得去微博上尋找隊友,然後把參戰ID複製到遊戲裡面。

那麼,你想要組隊,你就得在微博上搜索別人發的組隊信息,看看Boss等級、三圍、隊伍配置是否匹配。這個過程非常麻煩,你需要點開一大堆微博,挨個篩選。

有一個程序員(@walfieee)不堪忍受懶惰的開發商,於是自己用Binding.scala幫《碧藍幻想》做了個組隊系統。

這樣大家就可以解放雙手,批量刷副本啦。你也想做遊戲外掛嗎?快來學習 Binding.scala 吧!


推薦閱讀:

哪裡可以找到 Kali Linux 的教程?
如何融入黑客圈子?
如何看待嗶哩嗶哩 1 月 27 日被攻擊事件?
如何號召廣大草根站長反scanv.com這種類型的網站?
有哪些靠譜的伺服器安全軟體?

TAG:黑客Hacker | 阿里月餅事件 |