在經典 ASP 開發中,Request 內建對象是獲取 HTTP 請求數據的核心入口,亦是 SQL 注入攻擊的主要攻擊面。本文將系統梳理 Request 的集合結構、優先級機制,並揭示通用防注入方案中常被忽視的 Cookies 繞過風險。
Request 封裝了 HTTP 請求中的所有信息,按來源分為六大集合:
QueryString — GET 參數Form — POST 表單數據Cookies — Cookie 數據ServerVariables — 伺服器變量(固定集合)ClientCertificate — 客戶端憑證(固定集合)Browser — 瀏覽器能力信息(固定集合)前三者變量名可任意指定,後三者為系統預定義。
Request(key) 的隱含優先級直接使用 Request("key") 時,ASP 會依次搜尋上述六大集合,首個匹配即返回。實測優先級順序為:
實驗驗證:同名參數 b 分別以 GET、POST、Cookie 傳遞,GET 值「He」覆蓋 POST 值「She」;Telnet 手工構造 Cookie 頭同樣可注入數據(注意空格需 URL 編碼)。
ASP 下的 SQL 注入本質上是 Request 參數未經嚴格過濾即拼接進 SQL 語句。常見通用防注入方案(如「SQL 通用防注入系統」)採用遍歷 QueryString 與 Form 集合、匹配關鍵字黑名單(and、select 等)的策略,卻漏掉了 Cookies 集合。
Request(key) 獲取參數。id=1 OR 1=1)。Request("id") 因優先級機制先讀到 QueryString/Form 無惡意內容而放行,實際執行時卻從 Cookies 取到注入代碼。此漏洞源於「防禦邏輯與數據獲取方式不匹配」,而非語言本身缺陷。
Command 對象 + Parameters 集合,徹底隔離代碼與數據。Global.asa 或公共 Include 中遍歷 所有六大集合,或顯式指定 Request.QueryString/Form/Cookies 避免優先級陷阱。xp_cmdshell 等危險擴展。Request 對象的便利性源於其聚合特性,但這聚合機制若被誤解,便會成為安全黑洞。深入理解集合優先級、拒絕盲目依賴黑名單、堅持參數化查詢,才是 ASP 應用防注入的正道。