
2019年那場春招奇安信筆試我印象挺深。當時我身邊不少同學以為網絡安全公司的筆試就是刷“安全工程師題庫”結果一上來就被題目里的場景化問法打懵了。那一輪筆試考察的并不是簡單的概念背誦而是安全服務、滲透測試、應急響應里真正會遇到的問題全部壓縮成一張在線試卷。這篇文章不打算貼所謂的標準答案因為網上流傳的版本本來就七零八落。我根據自己的回憶結合當年校招群里大家討論出來的復盤版本把奇安信2019春招筆試題一涉及的題型、高頻考點和答題思路完整梳理一遍。目標是幫準備走安全方向的讀者建立一條清晰的復習線索同時也讓你知道每道題背后對應的工作場景和影響范圍。無論你是在校生還是剛轉行想做安全這篇文章應該都能幫你少走一點彎路。1. 筆試到底在篩什么1.1 不是讓你背答案是看你怎么分析問題奇安信的筆試題目有一個很明顯的特征題目都會套上一個“已經發生了什么”的場景。比如一道選擇題它不會直接問“SQL注入是什么”而是給你一段登錄接口的代碼讓你判斷存在問題。這種出題方式篩掉的是靠背題通過的選手留下的是真正理解攻擊鏈路的人。我當時印象很深的一道題大意是給了一個PHP文件上傳功能的代碼片段選項里有“未校驗文件類型”“文件名拼接路徑時可目錄穿越”“上傳目錄沒有禁止腳本執行”等。很多同學只盯著“文件類型校驗”這一個點卻忽略了后面的路徑拼接問題。那道題的正確思路應該是把文件上傳一整個流程走一遍從哪里上傳、存儲到哪個目錄、文件名怎么生成、上傳之后能不能被解析執行。任何一個環節有疏漏都會導致完全不同的利用方式。所以準備筆試不要只記結論要習慣用“輸入-處理-輸出-影響”這條鏈去思考安全風險。這個思維在后面的編程題和場景分析題里基本上會反復出現。我把題目里“為什么這么問”當成第一件事來復盤后面再去拆具體知識點效率會高很多。后來跟一些做招聘的同學聊過他們也說筆試要看的往往是“分析路徑”而不是那個最終結論因為最終結論在真實工作里可以查文檔分析路徑卻只能靠自己攢。1.2 題型分布與時間分配建議根據當時的印象奇安信2019春招筆試題一大致分為三類客觀題、主觀場景分析題、在線編程題。客觀題分布在最前面覆蓋網絡基礎、Linux、數據庫、Web安全基礎主觀題一般是給一段日志或代碼讓你寫出漏洞成因、利用思路和修復建議編程題則是標準的在線編程平臺模式會有用例判分。我建議的時間策略是客觀題控制在總時長的35%以內不要在一道不確定的選擇題上糾結太久主觀題至少留30%因為這類題按點給分寫得越完整越容易拿分最后剩下的時間全部給編程題哪怕只能過部分用例也要把暴力解法跑通至少不能交白卷。年份和具體題量我不保證完全準確但備考時按這個結構來分配是穩妥的。你可以把投遞方向也考慮進去偏滲透的方向Web安全和系統安全權重更高偏研發的方向編程題和數據結構權重更高。我見過有人把大量時間花在記憶CVE編號上結果筆試里其實不考這種死記硬背的東西反而因小失大。時間花在哪里方向要對。2. 高頻考點逐個拆解2.1 網絡基礎端口、協議、日志特征網絡安全公司筆試考網絡基礎算是一種“行業慣例”。TCP三次握手、HTTP狀態碼、DNS解析流程、TLS握手過程這些幾乎是必背內容。但奇安信的考法會加一層“安全視角”。比如同樣的HTTP狀態碼它不會只考404代表什么而會問你“掃描器不斷收到401/403說明目標可能做了什么防護”。這種題考的是對協議特征和訪問控制機制的理解。端口映射也是一個高頻點。SSH是22MySQL是3306Redis是6379Elasticsearch是9200這些數字在安全日志分析里天天出現。筆試里可能會給一段報警日志讓你判斷是Redis未授權訪問還是MySQL弱口令爆破。看到端口和返回特征基本就能判斷個八九不離十。我當年就是把常用端口和服務整理成一張表每天過一遍筆試時確實幫了大忙。還有一類網絡題跟流量分析相關會讓你從HTTP日志中找異常。正常日志的User-Agent比較雜但如果大量請求的UA都是同一個掃描器特征或者URL路徑里包含常見的敏感目錄就值得警惕。這種題與其說考協議不如說考能不能從日志里讀出安全事件。如果你平時用過Wireshark或者tcpdump看到這類題目會覺得特別親切因為本質就是把抓包分析搬到了試卷上。2.2 Web安全SQL注入、XSS、CSRF、文件上傳Web安全在整張試卷里的占比很高。這跟實際工作有關不管是攻防還是防護Web漏洞都是最常見的突破口。SQL注入要理解本質是“數據被當成代碼執行”因為開發者把用戶輸入直接拼進SQL語句。修復手段不是簡單“過濾關鍵字”而是參數化查詢把數據和SQL結構分開。MyBatis里#{}和${}的區別本質上也是這個原理。XSS考的更多是分類和利用場景。反射型、存儲型、DOM型的區別以及各自的危害范圍都要能說清楚。這里容易丟分的地方是“影響范圍”的描述。很多人只寫“彈個窗”但閱卷人想看到的是“存儲型XSS會把惡意腳本持久化在服務器上訪問該頁面的用戶都會被影響可能造成會話劫持”。把這個描述完整分數自然就上去了。CSRF相對容易被忽略但筆試里也出現過。核心是“瀏覽器會自動攜帶Cookie”服務端無法區分這個請求是用戶主動發起的還是惡意頁面借用戶的身份發起的。防御思路主要有三種校驗Referer、加CSRF Token、關鍵操作二次確認。答題時把這三條寫全基本不會失分。文件上傳是另一個筆試常客。題目一般會給一個上傳接口的代碼問你存在什么問題。你至少要能講清楚幾個關鍵檢查點擴展名是否做白名單校驗、文件內容是否校驗了文件頭、存儲目錄是否禁止腳本執行、上傳后的文件名是否隨機生成。這幾點對應了不同的攻擊路徑寫全才能拿高分。我自己在準備這部分時會把每一個漏洞點都配一個“如果我是攻擊者我怎么利用”的腦圖反向記憶印象特別深。2.3 加密與編碼識別套路比會寫算法更重要加密相關題目在2019年的筆試里不算難但坑很多。比如給你一串“5L2g5aW9”選項里有MD5、Base64、URL編碼、SHA-1。看到結尾的“”和字符集范圍就能判斷是Base64但很多同學一看到密文就慌了。我當時是先把常見編碼的特征記下來Base64由大小寫字母、數字、 /組成長度是4的倍數經常有填充URL編碼是%后跟兩位十六進制十六進制是0-9和a-f。另一個高頻坑是“哈希是不是加密”。MD5、SHA-1、SHA-256都屬于哈希算法不可逆AES、RSA屬于加密算法可逆。筆試里經常有人混淆。題目如果問“用戶密碼在數據庫里存儲使用MD5是否安全”只回答“MD5不可逆所以安全”是不完整的。因為弱口令可以被彩虹表反查所以要加鹽并選擇更合理的密碼哈希方案。這類題背后的工作場景是日志分析和應急處置。你在日志里看到一串可疑參數首先要能判斷它是編碼混淆、加密數據還是普通參數后面才能決定要不要解碼、怎么分析。所以筆試考編碼識別不是單純為了為難你。我復習時會把Base64解碼和URL解碼這幾個常用操作練到形成肌肉記憶因為工作里真的會頻繁用到。2.4 系統權限與主機安全安全崗筆試基本不會繞過系統基礎。Linux文件權限、用戶和組、SUID位、環境變量、計劃任務這些都可能出題。我記得有一道題是問“Web服務以root權限運行存在什么風險”。答案是一旦Web應用被攻破攻擊者拿到的就是root權限后續提權步驟都不需要了影響范圍等于整個服務器。正確的做法是給服務單獨建一個用戶只授予它需要讀取的目錄和文件權限。進程監聽端口也要盡量不用1024以下的特權端口除非確實有需要。這類題考察的是最小權限原則筆試里可以用一個反向問題來檢驗理解程度假如一個WebShell成功落地但服務運行在低權限用戶下攻擊者能碰哪些東西想清楚這個你對權限的理解就會扎實很多。Windows方向也可能出題比如自啟動目錄、注冊表Run鍵、服務權限配置。如果目標崗位偏終端安全這些內容占比會更高。我備考時把Linux和Windows的常見提權路徑各自整理成一張表不背細節只記風險點因為筆試關注的是“你知不知道這里可能有問題”而不是“你能不能復現提權exp”。2.5 安全運營與日志分析題除了漏洞利用奇安信這類安全廠商也很重視安全運營能力所以日志分析題在筆試里出現的概率不低。核心考點是給你一堆系統日志、應用日志或流量日志讓你找出異常并判斷原因。比如同一IP在短時間內對多個賬號嘗試登錄題目會問“這是什么行為該怎么處置”。回答這類題要先定位異常特征時間維度上有沒有集中爆發源IP是否單一目標是否集中在某個接口返回狀態碼有沒有規律。描述清楚這些再給出處置建議封禁來源IP、通知業務側確認賬號安全、增加登錄頻率限制、對已經登錄的會話做失效處理。這套回答邏輯我在筆試里用過很多次基本能覆蓋大多數日志分析題。安全運營題最忌諱的就是只回答“封IP”三個字。閱卷人希望看到你有沒有“檢測-響應-處置-加固”的完整閉環意識。哪怕你寫的步驟很簡單只要你把這個流程走完分數就會明顯不一樣。這也是我在整理這份復盤時最有收獲的一點。3. 幾道典型題的完整復盤3.1 流量日志分析識別SQL注入嘗試當時筆試里有一道題給了一段HTTP訪問日志里面有幾個POST請求請求參數長這樣192.168.10.7 - - [01/Mar/2019:10:15:23 0800] POST /login.php HTTP/1.1 200 5261 - Mozilla/5.0 192.168.10.7 - - [01/Mar/2019:10:15:26 0800] POST /login.php HTTP/1.1 200 5380 - Mozilla/5.0 usernameadmin OR 11password123456題目問判斷請求是否存在攻擊行為說明判斷依據和處理建議。我看到這個參數的第一反應就是SQL注入嘗試。判斷依據有三個參數值里出現了SQL關鍵字OR和恒真表達式單引號打破了原有SQL語句結構登錄場景下這種輸入極大概率是在嘗試繞過認證。如果有返回包還可以補充判斷依據請求返回的長度異常、響應狀態碼變化、數據庫報錯信息等。處置建議要從兩個角度寫一是臨時防護在網關或WAF上封禁來源IP并對登錄接口增加頻率限制二是根治修復代碼里改用參數化查詢把用戶名和密碼作為參數交給數據庫預編譯而不是拼接進SQL語句。影響范圍要寫明如果注入成功可能造成登錄繞過、用戶數據泄露甚至通過數據庫寫文件能力進一步控制服務器。這種題不需要多么高深的知識但回答要完整按“發現-判斷-影響-處置”四步走把你看到的現象、依據和后續動作都寫出來。即使判斷錯了方向只要邏輯清晰多少也能拿到分。當時群里好幾個人討論說自己只寫了“存在SQL注入建議修復”一句話就結束了。這種回答太單薄閱卷人根本看不出你懂不懂原理。3.2 代碼審計從參數拼接到預編譯代碼審計題是奇安信筆試里比較有區分度的題型。給我印象最深的是這么一段簡化代碼?php $id $_GET[id]; $result mysql_query(SELECT * FROM users WHERE id $id); while ($row mysql_fetch_assoc($result)) { echo $row[username]; } ?雖然是很老的寫法但思路可以套用到任何語言。第一眼看代碼先找外部輸入$_GET[id]。接著看數據流向這個變量直接拼到SQL語句里沒有任何過濾或類型校驗。最后看執行點mysql_query執行了這條語句。三步走下來SQL注入的判斷就很明確了。修復方案怎么寫至少給出兩層第一層是參數化查詢用PDO預處理把$id作為參數傳入第二層是輸入校驗比如is_numeric判斷id是否為數字或者按業務規則做白名單校驗。答題時把兩層都寫比只寫一句“過濾單引號”要專業得多。這段代碼對應的工作場景是舊系統改造和安全審計。你去審一套老代碼經常能看到mysql_query這種寫法不可能直接推倒重來只能在現有基礎上用最小改動降低風險。筆試里考代碼審計本質上是在模擬這個場景。我當時復習的做法是每天看5段有漏洞的代碼先自己找問題再對照修復方案。看得多了代碼里的危險點基本一眼就能掃出來。3.3 編程題IP合法性校驗與日志統計在線編程題里我遇到過的題型包括字符串處理、數組、基礎數據結構。有一道題很典型實現一個函數判斷傳入的字符串是否是合法的IPv4地址。這題本身不涉及安全但很考驗邊界處理跟安全日志處理密切相關。import re def is_valid_ipv4(ip: str) - bool: if not ip or len(ip) 15: return False parts ip.split(.) if len(parts) ! 4: return False for part in parts: if not re.fullmatch(r\d{1,3}, part): return False if len(part) 1 and part[0] 0: return False num int(part) if num 0 or num 255: return False return True這道題容易漏的點有幾個字符串為空、包含非法字符、分段數不是4、某段超過255、前導零問題。比如“01.2.3.4”算不算合法不同題目要求不一樣題目通常會說明如果沒有說明我傾向于按嚴謹格式判False。邊界條件全考慮清楚代碼才算穩。另一類編程題更貼近安全運營給一段日志文件要求統計每個IP出現的次數輸出Top10。核心就是用正則把IP行提取出來再用字典或defaultdict計數最后排序。先寫一個能跑通的版本再考慮日志文件很大時如何流式處理不至于一次性讀入內存。筆試平臺限時代碼不一定最優但必須保證邏輯正確、能跑出結果。我的經驗是編程題平時刷LeetCode的簡單到中等題就夠但一定要自己手寫不能只看題解。因為在線筆試的判題環境對縮進、函數簽名、輸入輸出格式要求很嚴格平時不練考場上很容易因為小問題拿不到分。3.4 安全配置題Redis未授權訪問筆試里還有一類題目不給你代碼給你環境配置讓你判斷風險。最典型的就是Redis未授權訪問。題面可能簡化成這樣一臺服務器的Redis服務監聽在0.0.0.0:6379沒有配置密碼也沒有設置protected-mode問有什么風險。這道題考察的知識點很集中Redis默認只監聽本機回環地址如果修改成公網或內網全網段監聽并且沒有設置認證外部主機可以直接連接并執行命令。結合Redis自身的功能攻擊者能往web目錄寫WebShell、寫計劃任務、修改配置影響范圍不光是緩存數據還可能擴散到整個主機。修復建議包括設置密碼、開啟protected-mode、監聽內網地址、不要用root權限運行Redis服務。我把它單獨拿出來復盤是因為很多人復習時只關注Web漏洞卻忽略中間件和數據庫配置。奇安信筆試既然考了這類題目說明安全廠商確實看重“基礎安全配置”這一塊。你在回答時如果能補充一句“需要先判斷Redis進程用什么權限運行”會讓閱卷人覺得你考慮到了權限維度印象分會明顯提升。4. 最容易被扣分的坑4.1 時間分配策略我在前面說過客觀題不要戀戰這里再展開講講具體的坑。我當年做客觀題時遇到一道關于Linux權限的題猶豫了很久結果后面編程題時間不夠最后一道題只寫了個半成品。后來復盤發現那道權限題就算做對了也就1到2分但編程題半個題的分值遠高于它。兩相對比非常不劃算。進答題頁之后建議先把全部題目快速掃一遍題目分值一般會標注沒有標注的話就從主觀題和編程題的分值反推。先做自己確定能拿分的題主觀題就算不確定也要寫思路至少要把“漏洞點-利用效果-修復建議”這個框架填滿。只要框架在閱卷人大概率會給你過程分。在線筆試平臺通常不允許切屏所以提前把草稿紙、IDE、文檔準備好很有必要。不過筆試過程中的操作規范也要注意我在校招群里看過有人因為頻繁切屏被判違規雖然不知道具體原因但可能跟平臺監控有關。環境干凈一點對自己只有好處。4.2 常見答題誤區第一個誤區是“答得太短”。主觀題只寫結論不寫過程。比如“有什么風險”只寫“嚴重”卻不說明被攻擊后會造成什么影響。你得把攻擊者拿到什么權限、能讀到什么數據、對業務有什么影響串起來才能體現你真正理解了風險。第二個誤區是“修復方案太籠統”。寫“加強輸入過濾”不如寫“使用參數化查詢并對上傳文件擴展名做白名單校驗”。閱卷人看的是可落地性。面試官在后續追問中也一定會問“具體怎么改”如果你筆試和面試回答不一致會非常減分。第三個誤區跟編程題有關不測異常輸入。很多同學寫完代碼只跑正常用例提交之后才發現邊界條件沒處理。比如IP合法性那道題空字符串和超長字符串是常見隱藏用例。平時練習就養成補邊界測試的習慣考試時會省很多冤枉時間。第四個誤區是忽略“影響范圍”的描述。安全崗位最核心的能力之一就是評估影響范圍。一道題問“這個漏洞有什么危害”你不僅要答“命令執行”還要說明執行權限是什么、能訪問到什么數據、是否可能橫向移動。對這些有意識才說明你有實戰視角而不是只會背書。4.3 筆試結束后如何復盤和準備面試筆試不是交卷就結束了尤其對安全崗來說筆試題目往往就是面試提綱。你寫了“使用預編譯修復SQL注入”面試官大概率會追問預編譯的原理是什么MyBatis的#{}和${}有什么區別Join查詢和子查詢在預編譯下有沒有例外情況這些東西必須在筆試結束后馬上整理成一套自己能講清楚的版本。我建議做一個“為什么”清單。每一道做過的題都往下問三個為什么。比如Web服務為什么要用普通用戶運行因為最小權限最小權限具體怎么落地給服務單獨建賬號、目錄權限按需分配、限制Shell登錄那如果這個賬號被攻破攻擊者能干什么能讀服務數據但改不了系統文件提權還需要找新漏洞。能把這個鏈條講清楚面試基礎關基本就過了。安全行業變化快2019年的題目和現在的題目肯定有差異但考察的能力模型沒有變懂協議、懂漏洞、懂權限、懂編碼還要能寫代碼。把這些基礎能力夯實不管題目怎么變你都能接得住。我個人在整理這份復盤時最大的體會是筆試最大的價值不是那張分數而是逼你把零散的知識串成體系。把每個考點當成一個錨點往外延伸出原理、場景、修復方案這套復習方法我后來推薦給好幾個朋友效果都還不錯。希望這篇關于奇安信2019春招筆試題一的復盤也能幫你把復習思路理清楚。