以上就是《Beyond XSS:探索網頁前端資安宇宙》的所有內容,我們從 XSS 開始談論前端資安,介紹了許多種類的 XSS 以及攻擊方式,再來談防禦手法,講到了 sanitization 以及 CSP,還有最新的 Trusted Types 以及 Sanitizer API。
接著,開始介紹一些不需要直接執行 JavaScript 也能攻擊的手法,像是 JavaScript 語言特性所造成的 prototype pollution、利用 HTML 來影響 JavaScript 的 DOM clobbering,或是根本不需要 JavaScript 也能攻擊的 CSS injection 等等,讓大家認識到不是只有利用 JavaScript 才能攻擊。
然後又看到了各種跨越限制的攻擊,瞭解了 origin 與 site 的差別,知道 CORS 的基本原理以及常見的設置錯誤會造成的問題,也看了 CSRF 以及 same-site cookie,知道了資安的防禦很多時候並不只是單點,而是一層一層的,才能確保在多數情況下都是安全的。
最後也介紹了其他有趣的資安議題,像是利用 iframe 執行的點擊劫持或是利用自動偵測 MIME type 達成的攻擊,以及我自己認為最有趣的 XSLeaks,想盡各種方式來偵測出差異,並藉由這個差異來造成影響。
如同我在第一篇裡面所說的,前端資安是個宇宙,除了 XSS 以外還有許多美麗的星球,它一直都在那邊,你只是沒有發現。
在資安的世界來講,只論前端資安的話,確實得到的關注沒有其他領域多,因為能夠造成的影響通常也比較小。舉例來說,有些 XSS 可能只能攻擊一個使用者,而且拿到的資料有限,但如果找到一個伺服器的 SQL injection 漏洞,可能一次就能拿到幾百萬筆使用者資料,甚至是 XSS 拿不到的 hash 過後的密碼。
但這並不影響我對前端資安的喜愛,我喜歡前端資安是因為它總能帶給我一些驚奇,讓我認識到對於前端這個領域,前端工程師所接觸到的其實只有其中一塊而已,還有許多是陌生的。身為前端工程師,我認為學習前端資安是必要的,資訊安全本來就是工程師應該必備的基本能力,也是專業素養的一部分。
在我看來,許多前端工程師並不是不願意理解或認識前端資安,而是根本不知道有這個東西,或甚至不知道從何開始。就像我之前有提過的,prototype pollution 似乎在資安圈是個眾所皆知的東西,但我以前學前端的時候怎麼沒人跟我講過?因此這個系列文除了總結我自己這兩年對於前端資安的認識以外,也希望能把資安的知識帶回到前端圈,讓更多人認識前端資安。
如果要說我對這個系列文有什麼期許的話,我希望它能成前端工程師的必讀經典之一(前提當然是系列文的深度以及廣度都必須到達一個程度,而且內容有一定的品質)。
我一直覺得做開發跟做資安是相輔相成的兩件事情,開發讓你更熟悉整體專案架構,知道一般工程師會怎麼做;而資安讓你知道很多細節,對每個小零件在做的事情以及整合有了更多的瞭解,而這些知識又會再進一步幫助你從另一個角度去看待開發,做出更安全的軟體。
若你對前端資安很感興趣,想要實際動手下去玩的話,我推薦 PortSwigger 的 Web Security Academy,裡面有許多已經準備好的免費 lab,很適合新手遊玩。
若是還想關注一些前端資安的新知識,我也推薦大家可以追蹤底下這些人的推特,每一個都是我心目中的前端資安大師,而且研究的領域各有不同(排序為隨機排序)。
還有其他前面的文章中比較少提到,但也都是前端資安圈知名的專家(沒有提到的不代表不是專家,可能只是我一時忘記而已,追蹤這些人之後推特就會自動推薦你其他專家了):@lbherrera_、@RenwaX23、@po6ix、@Black2Fan、@shhnjk 以及 @S1r1u5_。
來談談參加鐵人賽的感想好了,在今年以前只參加過兩次而已。
上次參加是 2019 年的自我挑戰組:後設鐵人:我從其他鐵人們身上學到的事,文章內容是我看其他鐵人賽文章的心得以及旅遊心得,因為寫鐵人賽的那一整個月全都在國外玩,才能寫出這個特別的主題
第一次參加是在 2017 年,用 Half-Stack Developer 養成計畫這個主題來寫,可以看見那時候的文章風格其實跟現在滿不一樣的,當初參賽的時候在開賽前先寫好了十幾篇,之後就是邊參加邊寫。
在最後一天的文章中,我寫下了那時對鐵人賽的感想:
其實我覺得鐵人賽不必刻意強調三十天內每一天都 po 一篇,這樣很容易造成「為了寫文章而寫」的現象,只是為了每一天都有交作業,就隨便寫一寫。如果真的想提高文章品質,又想維持這種鐵人賽的精神,感覺六十天內 30 篇文章也不錯?或者是 30 天內 15 篇文章,不用連續,你只要有寫出來就好,我覺得這會是比較好的折衷辦法。但是,如果真的有人連續 30 天寫的系列文品質超級棒,那我真心佩服。
那時候的我覺得屯稿是一件「不道德」的事情,因為當時鐵人賽強調的似乎就是連續 30 天每天寫文章,雖然屯稿原本就被默許,並不會因為先寫好就失去參賽資格,但我不認為這完全符合了鐵人賽的精神。
但六年後我的想法變了。
我覺得之前我會那樣覺得,是把鐵人賽當作一個正規比賽來看,而且是強調連續三十天寫文章,才會把屯稿視為有點道德疑慮的行為。但我現在不這樣想了,我把鐵人賽當作是「促進自己寫更有規劃的系列文的動力」,換句話說,它不是一個比賽了,而是一個「鼓勵你多寫文章,並且連續 30 天發文」的活動(我看現在官方好像也沒有在強調寫文章了,都是說連續 30 天發文)。
假設沒有鐵人賽這活動,我這個系列可能拖稿個五年都不會寫出來,但正是因為想參加鐵人賽、想要完賽,因此才強迫自己寫了這麼多篇有規劃好的系列文章。
事實上這 30 篇的系列文都是在開賽前就已經完成,開賽之後每天早上由我自己手動發布。
8/3 的時候開始寫,一直到 8/18 的時候完成,大約花了兩個禮拜左右。之所以可以在兩週內寫完,第一個原因是大概有三成的內容以前都寫過了,所以直接拿舊文來改,所以真正全新的創作大概是 20 篇,第二個原因是這個期間我是沒有工作的,因此有比較多時間可以寫文章。
寫完之後就是偶爾想到什麼要修改的就去修改,幾乎每隔一兩天就會小修一下。
幸好當時有選擇那個時候就開始寫,不然現在有了工作就真的沒時間寫了。
如果你跟我一樣把鐵人賽當作是一個「鼓勵自己寫文章」的活動的話,那其實鐵人賽在任何時候都可以開始。你可以現在就開始規劃 30 天要有哪些文章,然後開始慢慢寫,寫完以後拿去參加隔年的鐵人賽。
我想表達的意思是,如果你把鐵人賽看作是「一定要連續這 30 天寫文章」的話,說不定會覺得這很困難,做不太到。但若是換個角度,看成是「任何時候都可以寫文章,但一定要在九月連續 30 天發文」,就會變得容易許多。
以結果來看,「因為要連續 30 天寫文章所以不敢參賽,零產出」跟「把鐵人賽看作是連續 30 天發文,所以可以用一年來屯稿慢慢寫文章,最後完賽」,後者顯然是對自己更有幫助的。
總之呢,感謝鐵人賽這個契機讓我把這個一直很想完成的系列文寫完。
話說其實原本是想寫另一個拖稿很久的系列:JavaScript 隨意聊聊,但很無奈地暫時沒什麼靈感跟動力去寫,就只能繼續放下去了,希望它能有被完成的一天。
以上就是我對鐵人賽的一些想法上的轉變,都是個人解讀啦,如果哪天官方真的出來說:「沒有,你的理解都是錯的,鐵人賽的精神就是真的只能在這 30 天內寫文章而且發文,才能叫做鐵人」,那我當然是很樂意遵守比賽規則,因為屯稿而失去資格。
無論你喜歡或是不喜歡這個系列,都歡迎留言告訴我,有什麼想知道的資安問題或是對於文章的疑惑也都可以留言討論,感恩。
不過,不只隔行如隔山,行業內也是隔個領域就像隔了座山一樣,我比較熟悉的只有網頁資安或是前端資安,你問我 WAF 要怎麼設定或是怎麼選擇資安設備,我只能跟你說:「窩不知道 🤷」
另外,我有把鐵人賽的文章全部彙集在一起,用可愛的小恐龍架了一個網站方便閱讀全文跟分享,有中英雙語版:https://aszx87410.github.io/beyond-xss/
謝謝 huli 大大這系列的文章
也是因為你的文章開始對資安這塊提起興趣
當然也有一部分是因為自覺身為開發人員,對於資安應該要有更深入的了解或是學習
真的很感謝你願意花時間且將你的知識跟見解分享給大家!
感謝留言~ 希望這系列文章有對你帶來幫助
在我發現這串鐵人賽以前,發現大大的書《Beyond XSS:探索網頁前端資安宇宙》已經在預售中
毫不猶豫地預購、書本到了後也拜讀完了
書內的知識深度與廣度,真的不是一般人能理解的
非常感謝Huli大大!等有空我一定要再來多讀幾次!
感謝支持,但有時候沒辦法理解可能不是讀者的問題,是作者的XDD
如果對書中哪些概念不理解的話,都可以問我,我再想一下該怎麼解釋得更好