中華資安國際為中華電信旗下的資安公司
今年最難的題目似乎就是這攤了

第一步很簡單,到fb粉專案讚就行
第二步就是向粉專發送私訊:[I want play a game!]

接受挑戰之後會有三道小題目

第一題比較簡單,只要是 ‘ = ‘ 結尾的編碼基本上就是base64

第二題就稍微難一點了,這裡的checksum算法是逗號前面的所有數字 ‘ + ‘ 逗號後面的所有數字

第一行 1 2 3 4 5,15 =>1+2+3+4+5+(1+5)=21
第二行 2 2 2 2 2,-81=>2+2+2+2+2+{-(8+1)}=10-9=1
故推算第三行 2 3 5 6 8,-13=>2+3+5+6+8+{-(1+3)}=24-4=20
答案為20

接下來進入重頭戲了,第二步會給一個虛擬帳戶,條件是必須將這個帳戶存入是少1000元

連結點進去之後會出現這個畫面

原始的額度是100元,不過小弟先前忘了截圖,這是已經完成挑戰的畫面,額度為1100元

攤位的小姐有給出提示,需要從QR Code下手
於是按照提示操作網頁,下面的[收款]按鈕是假的,只會跳出無法收款的錯誤訊息
於是點上面的[轉帳按鈕]

這裡會有10的提示,依照提示出入10然後按ok,會跳出一個QR Code

將QR Code解碼之後會得到一串base64編碼

eyJhY2NvdW50X251bWJlciI6IjYwNDc5MzY3MTI1NzU3MjkzNTMxMDE5MSIsImFtb3VudCI6IjEwIiwiY2hlY2tzdW0iOjEwNCwiaGludCI6IkhvdyB0byBjYWxjdWxhdGUgY2hlY2tzdW0/ICAifQ==

將這串編碼拿去ASCII to Hex解碼之後會得到一串Text格式的程式碼

{“account_number”:”604793671257572935310191″,”amount”:”10″,”checksum”:104,”hint”:”How to calculate checksum? “}
這裡就是要下手的地方

由於線索還不夠多,於是想辦法再生成一個 QR Code

這次試試轉出99元

於是得到另一個 QR Code

一樣拿去解碼


得到另一組base64
eyJhY2NvdW50X251bWJlciI6IjYwNDc5MzY3MTI1NzU3MjkzNTMxMDE5MSIsImFtb3VudCI6Ijk5IiwiY2hlY2tzdW0iOjEyMSwiaGludCI6IkhvdyB0byBjYWxjdWxhdGUgY2hlY2tzdW0/ICAifQ==

再轉成Text格式


得到這組程式碼
{“account_number”:”604793671257572935310191″,”amount”:”99″,”checksum”:121,”hint”:”How to calculate checksum? “}

這裡比較一下amount跟checksum的變化
amount =10的時候checksum是104
amount =99的時候checksum是121
但是線索還是不夠多 ,於是再多試試幾組觀察 amount跟checksum的變化


多次嘗試之後,發現amount值為1、10、100時 checksum均為104
發現 amount 值為12時 checksum為106、amount 值為101時checksum為105

因此大膽假設checksum 初始值為103,且末2碼為amount數字的總和
回到題目的要求 [至少存入1000元]

一開始的程式碼為 {“account_number”:”604793671257572935310191″,”amount”:”10″,”checksum”:104,”hint”:”How to calculate checksum? “}
從帳戶頁面得知此為 [ 轉出 ] 的代碼,那要 [ 轉入 ] 的話,大膽假設應該是在 amount輸入 [ 負值 ],並計算出正確的checksum值,因此 amount=-1000checksum=103+(-1-0-0-0)=102

故得出下面的程式碼
{“account_number”:”604793671257572935310191″,”amount”:”-1000″,”checksum”:102,”hint”:”How to calculate checksum? “}

然後轉成basd64再轉成 QR Code

抱著姑且一試的心態到攤位的機器上掃,結果還真的成功了

回到一開始的網頁查看,成功匯入了1000元

接著粉專就給了最後一道題目

依照連結http://hitcon-2019-nutbank.chtsec.tw來到了這個網站
題目要求是成功上傳粉專提供的FLAG,不限任何形式

看來是要想辦法找出這個網站的漏洞,於是使用Kali Linux
建立vpn連線之後先用nslookup解出這台伺服器

順利解出ip位址 : 107.167.176.17及FQDN : ns-cloud-c1.googledomains.com
看來這台機器是架在GCP上的虛擬機
一般人要攻進GOOGLE的伺服器幾乎是不可能的事情
因此猜想是要利用伺服器本身的漏洞進行攻擊
於是使用nmap掃描這台server使用了那些port

一共使用了4個port,但只有22port跟80port是開放的
現在改用openvas去掃描這台機器

掃描之後發現,這台server有1個missing ‘ HttpOnly ‘ 的漏洞
HttpOnly是抵禦XSS( Cross-Site Scripting )跨站腳本攻擊的一種機制
避免攻擊者植入惡意腳本直接經由 JavaScript 存取session cookie,進而hijacking帳戶資料甚至是管理員的帳戶
不過上述方法需要有撰寫 JavaScript 的能力,技術能力要求較高

於是開始google尋找相關文章,尋找有沒有描述比較具體的做法的文章,有找到一些對靶機做練習文章,但對於不懂java語法或是php語法的人來說還是完全看不懂
很快的一個上午過去了,仍然沒有進展,雖然有試著生成幾個 JavaScript ,不過因為完全沒有基礎,所以也不知道什麼地方有編譯錯誤,XSS攻擊以失敗告終

直到下午2點休息時間結束後,攤位再次釋出了support,攤位的小姐說明,這次的活動重點在參與,因此即使沒有達成題目要求,只要能具體講出伺服器的漏洞弱點就會給予明顯提示

此題的官方正解是SQL injection

此網址並不是正解,不過已經有明顯的提示

http:// hitcon-2019-nutbank.chtsec.tw/blog.php?bid=-1,%22FLAG{你的FLAG}%22,3,4,%22FLAG{ 你的FLAG }%22,6,7

“bid=” 這個變數後面接的數字對應到的是結果的ID
如果搜尋ID是沒有結果就會回傳沒有結果
這時後面加個union語法連接子句
例如:union select 1,2,3,4,5,6
select1,2,3,4,5,6這就是自定義的搜尋結果,但這就需要測試
因為select後面的數量是要看結果的列數

因為bid = 1是有存在於資料庫
所以顯示會顯示第一條結果
上圖裡面的提示裡[bid=-1]就是找不到結果,所以會顯示找不到文章
若是用bid=0一樣可行
簡單來說只要系統找不到結果,就是可被污染的SQL injection漏洞
這個的問題發生的原因就是開發人員在變數傳入時沒有過濾
直接丟入SQL搜尋
就會造成這個問題
另一點是沒有針對無結果設定例外狀況

因此依照提示,在bid後面加入引數
http:// hitcon-2019-nutbank.chtsec.tw/blog.php?bid=1+union+all+select+1,%22FLAG{你的FLAG}%22,3,4,%22FLAG{ 你的FLAG }%22,6,7

再將粉專提供的FLAG填入,得到下列網址
http://hitcon-2019-nutbank.chtsec.tw/blog.php?bid=1+union+all+select+1,%22FLAG{LJQQ6eIWHXXr}%22,3,4,%22FLAG{LJQQ6eIWHXXr}%22,6,7
就得到正確答案

成功完成挑戰,解鎖最後的花蓮台東2個據點,完成[點亮台灣]的最終挑戰

相關網站

ASCII ot Hex
https://www.asciitohex.com/

QR Code轉換
http://qr.calm9.com/tw/

MD5/SAH1解碼
https://www.cmd5.com/

有關本次弱點 SQL injection 的相關說明

https://blog.csdn.net/superit401/article/details/78052965
https://blog.csdn.net/liuyanhuasd/article/details/80116223