Htacess Helicon APE 誤報 403 失敗
web.config
我沒有使用我的重寫規則,而是使用Helicon APE來模擬 Apache 的.htaccess
功能。我有一個大型通用
.htaccess
文件,它作為功能的一部分在伺服器上應用,以限制對傳遞命令(如聯合、刪除等)的訪問。但是,我遇到了一個問題,其中一行程式碼正在創建誤報並阻止對其他正確 URL 的訪問。
失敗的 URL 是:
http://example.com/union-contracts
使用下面的命令
web.config
,所有失去的 URL 都被推送到index.php
.<httpErrors errorMode="Custom" existingResponse="Replace"> <remove statusCode="404" subStatusCode="-1" /> <error statusCode="404" path="/index.php" responseMode="ExecuteURL" /> </httpErrors>
返回 403 的 htaccess 規則
RewriteCond %{QUERY_STRING} (;|<|>|'|"|\)|%0A|%0D|%22|%27|%3C|%3E|%00).*(/\*|union|select|insert|drop|delete|update|cast|create|char|convert|alter|declare|order|script|set|md5|benchmark|encode) [NC] RewriteRule . - [F,L]
最終,我想繼續阻止聯合,例如,我只需要修改誤報的行。請注意,我也不希望在我的規則中
-contracts
進行硬編碼。.htaccess
在記住最初如何生成 URL 之後,我能夠在 XAMPP 中的 htaccess 中複製該問題。
在網站的訪問者一側,當訪問 URL 時,伺服器會生成 404 錯誤。我將 URL 過濾到最後一部分,並根據該字元串檢查數據庫以查看它是否與保存的 URL 匹配,如果是,我不會將該 404 傳遞給瀏覽器,只有當 URL 可以時它才會傳遞找不到。
當 IIS 生成 404 錯誤時,URL 變為:
index.php?404;http://example.com:80/union-contracts
但它不會以那種格式傳遞給瀏覽器。
我在評論中表達了我對肯定有“其他事情”發生的擔憂,但無論如何……
很難為一開始就不應該(閱讀:“不能”)觸發的規則編寫例外 - 這完全是猜測工作。畢竟,為什麼要尊重例外?
由於幾個“大”原因,該規則應該已經避免了給定的請求:
- 該請求不包含查詢字元串。
- 條件 ( CondPattern ) 中的正則表達式與 URL 的任何部分都不匹配(即使它在查詢字元串中)。
考慮到上面的#2,正則表達式已經包含了一個與給定請求不匹配的足夠的異常,那麼我們如何實現“另一個”異常呢?
您可以修改CondPattern以避免出現連字元 (
-
) 跟在單詞“union”之後的情況,使用否定的 lookahead。例如:
(;|<|>|'|"|\)|%0A|%0D|%22|%27|%3C|%3E|%00).*(/\*|union(?!-)|select|insert|drop|delete|update|cast|create|char|convert|alter|declare|order|script|set|md5|benchmark|encode)
因此,以上匹配
Xunion
,但不匹配Xunion-
, whereX
是第一個交替組中的一個字元序列(即(;|<|>|'|"|\)|%0A|%0D|%22|%27|%3C|%3E|%00)
)。或者,當連字元跟在這些關鍵字後面時:
(;|<|>|'|"|\)|%0A|%0D|%22|%27|%3C|%3E|%00).*(/\*|union|select|insert|drop|delete|update|cast|create|char|convert|alter|declare|order|script|set|md5|benchmark|encode)(?!-)
(**更新:**以下兩個建議可能不起作用,因為似乎這些指令僅在 IIS 已經重寫 URL之後才被處理。此時 URL-path 是簡單的
/index.php
,而不是/union-contracts
。)或者,修改
RewriteRule
以使其在 URL 路徑以開頭時不匹配/union-
(儘管這可能為規則試圖阻止的 XSS 嘗試提供後門)。例如:RewriteRule !^/?union- - [F]
(至少在 Apache 上,使用該
L
標誌時不需要該F
標誌 - 這是隱含的。)或者,您在現有規則之前的頂部
/union-
創建另一個規則,該規則會在請求開始且沒有查詢字元串的 URL 時創建一個例外(儘管如果另一個規則是相信)。例如:RewriteCond %{QUERY_STRING} ^$ RewriteRule ^/?union- - [L]
但是,如果您稍後在文件中有其他規則需要以某種方式重寫 URL,這可能會“破壞”請求 - 因為這些規則不會發生。
我假設 Helicon-APE/mod_rewrite 在類似目錄的上下文中工作(例如,
.htaccess
樣式語法而不是伺服器或虛擬主機上下文)?雖然這不應該影響上面的指令,因為它發生了。**更新:**當 IIS 生成 404 錯誤時,URL 變為:
index.php?404;http://example.com:80/union-contracts
是啊!該 URL將被原始條件擷取。因此,似乎 mod_rewrite 指令是在 web.config 中的 IIS“重寫”之後處理的!這確實使這些“安全”指令有些多餘甚至不正確,因為它們應該在客戶端的初始請求上執行。和….
我將 URL 過濾到最後一部分,並根據該字元串檢查數據庫以查看它是否與保存的 URL 匹配
由於您正在積極解析 URL 並僅過濾掉您需要的部分,因此至少對於這些“404”請求而言,這些“安全”檢查似乎是多餘的。(事實上,根據可能直接請求的真實文件(即非 404 請求),這種性質的惡意查詢字元串是否真的會對任何 URL 構成安全威脅?)
上面的兩個建議修改條件中的正則表達式以排除連字元跟在“union”關鍵字或任何關鍵字之後的實例,仍然適用於此處,並且似乎可以解決眼前的問題。
您還可以在遇到表單的 URL 時中止所有檢查
index.php?404;
(即,在它被 IIS 重寫之後)。(我假設你所有的 mod_rewrite 指令都是類似的“安全”檢查?)例如,將以下內容添加到腳本頂部,在現有指令之前:
.htaccess
RewriteCond %{QUERY_STRING} ^404; RewriteRule ^/?index\.php - [L]
當遇到表單的 URL 時,這應該可以防止任何進一步的處理
/index.php?404;......
。(因為您無論如何都要在腳本中解析 URL。)