Iis

Htacess Helicon APE 誤報 403 失敗

  • December 30, 2020

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

但它不會以那種格式傳遞給瀏覽器。

我在評論中表達了我對肯定有“其他事情”發生的擔憂,但無論如何……

很難為一開始就不應該(閱讀:“不能”)觸發的規則編寫例外 - 這完全是猜測工作。畢竟,為什麼要尊重例外?

由於幾個“大”原因,該規則應該已經避免了給定的請求:

  1. 該請求不包含查詢字元串。
  2. 條件 ( 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。)

引用自:https://serverfault.com/questions/1047836