在 JavaScript 的幾個資料型別中,Number 是非常常用的一個,而且有些小地方需要特別注意,不然很容易寫出有 bug 的程式碼。
這篇會帶大家看一些案例,有些是假想的情境,也有些是我自己碰過的問題,在每個案例繼續往下講解之前,大家也可以試著把自己帶入情境,想想看自己知不知道問題的成因,又該如何避免。
在 JavaScript 的幾個資料型別中,Number 是非常常用的一個,而且有些小地方需要特別注意,不然很容易寫出有 bug 的程式碼。
這篇會帶大家看一些案例,有些是假想的情境,也有些是我自己碰過的問題,在每個案例繼續往下講解之前,大家也可以試著把自己帶入情境,想想看自己知不知道問題的成因,又該如何避免。
上個週末除了有我上一篇心得寫的 SUSCTF 2022 以外,還有另外一個 TSJ CTF,裡面也有很多好題,因為時間不太夠所以我只有挑了自己比較有興趣的題目來看,就是標題說的這題 Nim Notes,最後沒解開(還差得遠呢),但解法十分有趣,因此寫一篇來記錄一下官方解法。
作者(maple3142)的 writeup 在這:https://github.com/maple3142/My-CTF-Challenges/tree/master/TSJ%20CTF%202022/Nim%20Notes
這個假日有不少 CTF,跟著隊伍 SU 一起打了 SUSCTF 2022,這篇簡單記錄一下幾個我有參與的題目的心得。
會講到的題目列表如下:
JavaScript 裡面一共有幾個資料型別?又分別是哪些?
要談型別之前,我們應該要先知道 JavaScript 中一共有幾種型別,並且對每一種型別都有最基本的理解。在文章開始之前,你也可以自己先數數看,再來跟我對答案,看是不是正確的。
由於 JavaScript 是會進化的,這篇的型別會以本文寫作時最新的 ECMAScript 2021 為準,底下如果有提到「spec」,指的都是 ECMAScript 2021 language specification。
我認為在理解 JavaScript 這個程式語言的時候,還需要認識到「執行環境(runtime)」這件事情,你心中的架構圖才會完整。有許多人並沒有意識到這一環,導致對於 JavaScript 或是一些技術的理解有認知上的差異;因此這一篇,就讓我們好好來談談執行環境。
附註:除了 runtime 叫做執行環境以外,execution environment 也叫做執行環境,但這兩個是完全不同的東西。為了避免歧義,底下會盡量用原文 runtime 這個詞。
另外,runtime 有許多意思,這邊的 runtime 比較像是 runtime environment 的意思。
如果你不知道什麼是 CTF,可以參考我之前寫過的:該如何入門 CTF 中的 Web 題?,裡面有簡單介紹一下什麼是 CTF,以及一些基本的題型。
去年的 DiceCTF 2021 我有認真玩了一下,最後解出 6 題 web 題,心得都在這邊:DiceCTF 2021 - Summary。今年的 DiceCTF 我有看了一下,直接被電爆,難度完全是不同等級。
這次的 Web 題一共有 10 題,1 題水題 365 隊解開,另一題比較簡單一點 75 隊解開,其他 8 題都只有 5 隊以內解開,其中還有一題沒人解開。
身為一個喜歡 web 以及 JS 相關冷知識的人,這是一個很好的學習機會,透過賽後放出的 writeup 來學習各種技巧。底下不會有所有 web 題的筆記,只會有我關注的題目。
如果你的網站想要搶先體驗瀏覽器還沒有正式上線的新功能,該怎麼做呢?
通常這些功能已經做好了,只是沒有開放而已,因此瀏覽器都會提供一些可以開關的 flag,只要把開關打開,就能夠搶先體驗到新功能,但我們通常不太可能叫使用者自己把開關打開。
因此,Chrome 提供了一個機制叫做 origin trials,你可以在網站上註冊,取得一組 token,接著只要設置好以後,如果使用者是用 Chrome 造訪你的網站,那就會開啟新功能,讓你的網站可以使用。
這篇就來簡單介紹一下這個機制該如何使用。
談完了 JavaScript 的歷史以及包袱以後,我們來談談 JavaScript 本身。
不知道大家有沒有想過一個問題,當你看到一本 JavaScript 書籍或是教學文章的時候,你要怎麼知道作者沒有寫錯?要怎麼知道書裡講的知識是正確的?就如同標題所說,會不會你以前知道的 JavaScript 知識其實是錯的?
因為作者常寫技術文章,所以就相信他嗎?還是說看到 MDN 上面也是這樣寫,因此就信了?又或是大家都這樣講,所以鐵定沒錯?
有些問題是沒有標準答案的,例如說電車難題,不同的流派都會有各自認可的答案,並沒有說哪個就一定是對的。
但幸好程式語言的世界比較單純,當我們提到 JavaScript 的知識時,有兩個地方可以讓你驗證這個知識是否正確,第一個叫做 ECMAScript 規格,第二個大家可以先想想,我們待會再提。
前陣子我們團隊在執行滲透測試時,發現了一個有趣的 SQL injection 案例,因為一些特性的關係,沒辦法直接用現成工具撈出資料,需要自己改工具或是寫腳本才能有效利用。因此,這篇將會分享兩個實際案例,以及我自己的幾個解法。
我有把這兩個案例放到 Heroku 上面,做成兩個小挑戰,有興趣的可以自己先玩玩看:
(Heroku 沒了QQ)
Same site 跟 same origin 雖然看起來有點像,但其實差別不小,而這個差別也會影響到瀏覽器如何看待這兩個網站的關係還有給予的權限。
這篇文章將會談到:
事不宜遲,就讓我們開始吧!
(開始之前先回答一個疑問。是的,標題的靈感來自於忍者哈特利)
2022-01-20:修改「細究 same site」段落,補充 scheme 相關歷史,感謝 @littlegoodjack