首次與官方工程師一同討論網頁漏洞

1 minute read

在發現某體育中心的漏洞,並回報給相關單位後,遭到對方消極處理。於是我只好轉而使用校務建言系統對相關單位施加壓力,在歷經多次的寄信回報,官方終於願意正面回應我,甚至還邀請負責的工程師與我商討漏洞的細節!

這倒是讓我蠻驚訝的,本來以為只要在信中詳細寫出 reproduce 的方法就好,現在要我對工程師現場 demo 還真的有點緊張啊…

Adversary

先說在前面,這次不一樣,我並不是刻意在挖相關網站的漏洞,而是因為我在使用借用場地服務的時候,發現其他人似乎利用了 bug 或漏洞,直接繞過驗證,把我的場地借走!

一開始雖然火大,但還是用白道的作法,乖乖寄檢舉信給官方請他們將他停權,不過官方因為是人工處理,所以效率不彰,他們後來也不太想認真處理這個問題。

這位同學在帳號被停權後,很聰明的馬上換了一個人頭捲土重來,然後再被停權、再換一個人頭…….

好吧,既然如此,只好來走黑的方法了,先來稍微研究一下這個網站:

Lots of Bugs

Client-side Validation Only

俗話說知己知彼、百戰百勝,先來研究一下它怎麼借的吧。這個系統是這樣,它只會讓使用者借用七天內的場地,七天後的必須要等到隔天才能借,但因為網頁設計因素,它只有做前端的時間驗證…… 所以只要稍微觀察一下 URL 的 query 字串,就可以推算出七天後的場地借用 URL,然後順利的搶走場地。

後來進一步確認後發現,它其實 server-side 有做檢查,不過網站的時間跟 database 的時間好像有誤差,會導致時間計算錯誤…… 反正就是有 bug 的意思。

Information Exposure Through Error Pages

這個網站是用 ASP.NET 寫的,但他的 error page 似乎忘記關了,只要在 query string 裡面插入不合法的字元或是不合規則的輸入,馬上就會噴那一段 source code 給你看。

頁面的下方還有 ASP.NET 的版本號碼,仔細一看竟然是 2005 年的版本,那時候甚至連 IE 7 都還沒發布 (2006年),距離現在足足有 11 年之久。

(圖片來自這裡)

SQL Injection

既然會噴 source code,那來看一下它 database 有沒有防 SQL injection 好了,答案是沒有,有人如果輸入個 drop 之類的,database 大概就被清空了吧。

Unauthorized Access

每個人使用服務借用場地都有紀錄,而這些紀錄有一個 index 值,不但是線性的,而且也沒有做身份驗證,所以直接把別人借用的場地取消根本輕而易舉……

Revenge or Not?

於是,反擊這位對手的策略如下:

  • 利用相同 Client-side Validation Only 漏洞,比它更早去搶到場地

不過這樣做的話,我似乎也變成違反規定的人了,就好像為了防止有限的資源被壞人偷,那我們先發制人把它偷走。聽起來不是一個很好的作法,摒棄。

  • 利用 Unauthorized Access 把它違法借用的場地直接取消

這個方法中,我像是扮演一個義賊或是 Batman 之類的角色,替官方剷奸除惡。

  • 乖乖繼續走白道的方法,走官方通道檢舉……

雖然效率不彰,但卻是最富正當性的作法。於是我決定先走這條路線,如果行不通我就來用第二種方法,扮演 Batman!

Meet

經過多次的信件來回,官方邀請我去跟相關單位的工程師討論漏洞事宜,收到這封信的時候,還真的是有點驚訝。

總之後來就跟工程師約了時間碰面,我也就 demo 了上述的那些 bug,請他修復。

但聽工程師的口氣,語氣中夾帶無奈,他似乎是中途被叫來維護的,並不是這套系統的開發者,然後很不幸的,前人的程式碼寫的很爛,又加上系統老舊,所以官方打算一口氣更新,重寫一個系統。因此我回報的那些 bug,除了 SQL injection 之外他們可能不會這麼快處理。

好吧,我也懂他的立場,所以只能先暫時接受用人工處理停權的方式了,不然我也可以私自當 Batman 替官方剷奸除惡 XD

The Engineer

跟一位大自己二十幾歲的,業界官方工程師討論漏洞,真的是一次很有趣的經驗。它讓我更體認到資訊界技術的更迭是多麼迅速,還有學界與業界巨大的差異。

討論完漏洞之後,這位工程師還算健談,他表示自己擅長的是 C#, ASP.NET 網頁開發,並且好奇現在的學生都怎麼寫網頁?

我:「現在流行 script language,nodejs + expressjs, ruby on rails, python + django」

工程師一臉驚訝的看著我說:「所以現在你們都沒什麼人寫 C#, ASP 跟 PHP了嗎?」

我:「現在網頁的框架,有著漂亮的 MVC, MTV 架構,很多東西都不需要重造輪子,只需要寫控制邏輯、database schema、routing,其餘可以交給前端工程師。」

工程師震驚的的看著我說:「那樣還叫做寫程式嗎?」

我很好奇,十年、二十年後的我們,聽到現在外面流行的程式語言、網頁框架,跟自己當初學的東西相差十萬八千里的時候,是不是也會有跟這位工程師一樣的反應?