Active Server Pages (ASP) 以 VBScript/JScript 撰寫、伺服端解譯執行、輸出純 HTML,開發效率極高,成為早期電子商務、BBS、查詢系統主流。但「原始碼可讀、資料庫易下載、SQL 注入頻傳」三大痛點,讓無數站長痛失資料。本文系統梳理 ASP 工作原理、微軟宣稱優點的雙面性、20+ 經典漏洞與對策,並提供可直接落地的防護清單。
asp.dll (ISAPI) 解譯執行。關鍵特性:原始碼留在伺服端、輸出為純 HTML、支援虛擬目錄隔離物理路徑。
| 宣稱優點 | 實際風險/補充 |
|---|---|
| 用戶端看不見原始碼 | 早期 IIS 3.0/PWS 存在 %.、%81、::$DATA 等替代資料流漏洞可洩露原始碼;後續版本雖修補,但新漏洞層出不窮。 |
| 虛擬目錄隱藏物理結構 | 正確使用虛擬目錄 + NTFS 權限(HTML 唯讀、ASP 執行)可大幅降低資訊洩漏。 |
showcode.asp?source=../../boot.ini → 修補或升級 IIS。ASPSamp/Samples/code.asp 或封鎖目錄存取。null.htw?CiWebHitsFile=xxx.asp → 移除 .htw 對應或套用 Q256888/2kunicode 修補程式。成因: 資料庫放在 Web 目錄下、檔名可猜測(book.mdb、data.mdb)、無加密。
三層防禦:
./kdslf/i44/studi/d34ksfslf.mdbconn.open "MyDSN" 而非 conn.open "driver={...};dbq=" & Server.MapPath("data.mdb");PWD=yourpwd。風險: Scripting.FileSystemObject 可讀寫刪改 FAT/NTFS (權限不足時) 任意檔案。
對策:
regsvr32 /u scrrun.dll(若不需 FSO 功能)。場景: 留言板、搜尋關鍵字、錯誤頁面直接輸出使用者輸入。
對策: 統一輸出編碼函式:
Function SafeHTML(str)
str = Replace(str, "&", "&")
str = Replace(str, "<", "<")
str = Replace(str, ">", ">")
str = Replace(str, """", """)
SafeHTML = str
End Function
所有 Response.Write、<%= %> 輸出均經 SafeHTML() 處理。
經典 Payload: username: admin' OR '1'='1 → SQL 變 WHERE username='admin' OR '1'='1' 恆真繞過驗證。
根本防禦:參數化查詢 (Command + Parameters)
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = conn
cmd.CommandText = "SELECT * FROM Users WHERE Username=? AND Password=?"
cmd.Parameters.Append cmd.CreateParameter("@u", 200, 1, 50, Request("username"))
cmd.Parameters.Append cmd.CreateParameter("@p", 200, 1, 50, Request("password"))
Set rs = cmd.Execute
輔助措施:
✅ 單引號轉義 Replace(input, "'", "''")
✅ 限制輸入長度、白名單字元(帳號僅英數字)
✅ 資料庫帳號最小權限(僅 SELECT/INSERT/UPDATE,無 DROP/CREATE)
使用 Microsoft Script Encoder (screnc.exe) 將 .asp 加密為 .asp (內容變亂碼),IIS 仍可正常執行:
screnc /s /f /l vbscript /e asp input.asp output.asp
進階:核心商業邏輯封裝為 COM+ 元件 (DLL),僅保留薄薄 ASP 呼叫介面。
ASP 雖屬經典技術,但許多存續系統仍在服役。安全非一次性動作,而是「最小權限、參數化查詢、輸出編碼、持續修補」的長期實踐。將上述清單納入專案 Definition of Done,方能讓 ASP 網站在惡劣網路環境中穩健運營。