日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

modsecurity配置指令学习

發(fā)布時間:2025/4/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 modsecurity配置指令学习 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

事務(transactions)

Console(控制臺)

1 Introduction

Modsecurity是保護網絡應用安全的工作。不,從零開始。我常稱modsecurity為WAF(網絡應用防火墻),這是種被廣泛接受的叫法,它指的是為保護網絡應用而專門設計的產品族。也有些時候我稱它為HTTP入侵檢測工具,我認為這個稱呼更好的描述了modsecurity做了什么。

?

Understanding ModSecurity

像Apache為其他模塊所做的一樣,Apache為modsecurity處理一些基礎任務:

1、? 加密解密

2、? 破壞HTTP請求的入站連接流

3、? 部分性解析HTTP請求

4、? 引導modsecurity,選擇正確的配置文本(<VirtualHost>,<Location>等)

5、? De-chunks必需的請求體

反向代理模式時Apache會執(zhí)行幾個別的任務:

1、? 請求轉發(fā)到后端服務器(SSL或者非SSL)

2、? 部分性解析HTTP響應

3、? De-chunks必需的響應體

?

What ModSecurity Does

Modsecurity提供的功能大概能分成四個部分:

Parsing解析:

Modsecurity會努力解析盡可能多的數(shù)據。Security-conscientious解析器會提取儲存數(shù)據,義工在規(guī)則中使用,并支持一定的數(shù)據格式。

Buffering緩存

典型安裝時,請求體和響應體都會緩存。這就意味著,modsecurity在請求被傳到應用服務器進行處理之前,就見到完整的請求了。在響應被送到客戶端之前就見到了響應。緩存是一個重要的特性,因為只有這種方式才能可靠的攔截數(shù)據。緩存也存在缺陷,他需要額外的RAM來存儲請求體和響應體數(shù)據。

Logging日志

全事務日志(又稱審計日志)占據了modsecurity所做工作的很大一部分。你可以利用日志記錄完整的HTTP流量,而不是僅僅粗略的訪問日志信息。請求頭、請求體、響應頭、響應體,所有這些信息你都能獲得。只有日志有這個功能

?

?

?

?

?

What Rules Look Like規(guī)則是什么樣子的

ModSecurity圍繞兩種東西:配置和規(guī)則。配置告訴modsecurity怎么處理它遇到的數(shù)據。規(guī)則決定對要處理的數(shù)據做什么。盡管現(xiàn)在看規(guī)則是怎么運作的還太早,我將給你展示一個快速的例子,僅僅告訴你規(guī)則是什么樣子的:

SecRule ARGS “<script>” log,deny,status:404

即使沒有進一步的幫助,你大概也能看出來規(guī)則指定了在輸入數(shù)據(<script>)中我們希望得到什么樣的數(shù)據。類似的,你很容易發(fā)現(xiàn)當?shù)玫狡谕J?#xff08;log,deny,status:404)時會發(fā)生什么。如果我告訴你規(guī)則的一般語法,你將會更加清晰,例如下面:

SecRule VARIABLES OPERATOR ACTIONS

三部分的含義如下:

VARIABLES告訴ModSecurity上哪查找,例子中的ARGS變量,表示所有的請求參數(shù);。

OPERATOR告訴ModSecurity怎么查找,例子中,我們用一個正則表達式模式,他將和ARGS匹配。

ACTIONS告訴ModSecurity,當匹配發(fā)生時,將會做什么。例子中的規(guī)則給出了指示:記錄問題,拒絕交互,用狀態(tài)號:404拒絕。

我希望你不要對第一條規(guī)則的簡單而失望,我向你保證通過組合ModSecurity提供的不同的工具,你能夠寫出有用的規(guī)則來實現(xiàn)負責的邏輯功能。

?

Transaction Lifecycle交互周期

ModSecurity中,每次交互都需要五步或五段:每一段,modSecurity都要在開始做一些工作(例如:剖析數(shù)據),激發(fā)這一段中指定的規(guī)則,讓他起作用,或者段規(guī)則結束之后做一兩件事情。乍一看,五步很多,但是每一段的存在都有一個原因。總有一件或者幾件事情只能在交互周期的某一特定時刻發(fā)生。

請求頭(1)

請求頭段是modsecurity第一個切入點。這一段的首要目的是允許規(guī)則作者在代價很高的請求體處理過程發(fā)生之前對請求進行評估。請求頭段會影響modsecurity怎么處理一個請求體。例如,modsecurity不會默認分析XML請求體,但是你可以通過在第一階段指定合適的規(guī)則來指示他這么做。

請求體(2)

請求體階段是主要的請求分析階段并且當接收到一個完整的請求體并進行處理時,這一階段立即發(fā)生。這一階段的規(guī)則可以任意處理所有的請求數(shù)據。

響應頭(3)

響應頭階段在接收到響應頭之后,還沒有讀取響應體之前發(fā)生。這一階段的規(guī)則將會決定是否檢查響應體。

響應體(4)

響應體階段是主要的響應分析階段。這一階段一開始,就會讀取響應體的數(shù)據以供規(guī)則使用。

記錄(5)

記錄階段很特殊,首先,這是唯一的一個你不能鎖定的階段。交互完成之后,這個階段才開始運行,所以你什么都不能做,只能記錄發(fā)生的事實。這個階段的規(guī)則將會控制怎么記錄。

?

周期實例

為了讓你更好的理解每個交互階段發(fā)生了什么,我們將研究一個POST交互的詳細調試日志。因為下面這個交互將會運用modsecurity的大多數(shù)部分,我們特意選擇了一個使用請求體來發(fā)送數(shù)據的交互類型。為了使事情相對簡單,我使用了一個沒有任何規(guī)則的配置,為了清晰起見,去除了一些調試記錄行、時間戳和一些附加的元數(shù)據。

注意:不要期望在此就能理解關于日志的所有事情。只是有一個關于modsecurity如何工作的大體感覺。開始使用modsecurity之后,你很快就會發(fā)現(xiàn)調試記錄是一個不可缺少的書寫規(guī)則和疑難排解的工具。

我在這一段文章中使用的交互很直接。我把請求數(shù)據放在兩個不同的地方,參數(shù)a放在查詢字符串中,參數(shù)b放在請求體中,但是在這個請求當中再沒有值得注意的地方了。

POST /?a=test HTTP/1.0

Content-type: application/x-www-form-urlencoded

Content-Length:6

?

B=test

?

響應一點都不起眼:

HTTP/1.1 200 OK

Date:Sun,17 Jan 2010 00:13:44 GMT

Server:Apache

Content-Length:12

Connection:close

Content-Type:text/html

?

Hello World!

?

請求頭available之后但是請求體(如果有的話)未讀之前,Apache第一次啟用ModSecurity。先出現(xiàn)初始化消息,包含了mod_unique_id產生的獨立的交互ID號。使用這個信息你應該能夠把調試日志里的信息和你訪問的信息以及審計日志里的信息配對。這時,modsecurity將解析請求行和請求頭上的信息。在這個例子中,查詢字符串包含了一個簡單的參數(shù)a,所以你會看見記錄它的發(fā)現(xiàn)的消息。然后Modsecurity會創(chuàng)建一個交互語境,并引發(fā)REQUEST_HEADERS段:

[4]初始化交互(txid SopXW38EAAE9YbLQ)

[5]增加請求參數(shù)(查詢字符串QUERY_STRING):名字“a“,值“test”

[4]創(chuàng)建交互語境(dcfg 8121800)

[4]開始段REQUEST_HEADERS

如果一個規(guī)則沒有鎖定交互,那么現(xiàn)在modsecurity就會給Apache返回控制,以允許其他模塊在控制返回給他之前處理請求。在第二階段,modsecurity先讀取然后處理請求體,前提是請求體存在。在接下來的例子中,你能看到輸入過濾器中的三個消息,告訴你讀取了什么。第四條消息告訴你,從請求體中獲取了一個參數(shù)。請求(application/x-www-form-urlcoded)中使用的內容類型是modsecurity能識別并且自動分析的類型。一旦處理了請求體,就會處理ERQUEST_BODY規(guī)則。

[4]第二階段開始(dcfg 8121800)

[4]輸入過濾器:正在讀取請求體

[9]輸入過濾器:斗式HEAP包含6個字節(jié)

[9]輸入過濾器:斗式EOS包含0個字節(jié)

[5]正在增加請求參數(shù)(BODY):名稱“b”,值:“test”

[4]輸入過濾器:已完成接受請求體(長度6)

[4]開始階段REQUEST_BODY

記錄當中一直提到的過濾器是modsecurity處理請求體和響應體的部分。

[4]鉤住嵌入過濾器:增加輸入轉發(fā)過濾器(r 81d0588)

[4]鉤住嵌入過濾器:增加輸出過濾器(r 81d0588)

Modsecurity沒法送一大塊數(shù)據給請求處理程序,就會在調試日志里面增加一條消息,最后一條小時用來說明緩沖區(qū)中沒有數(shù)據了。

[4]輸入過濾器:轉發(fā)輸入:mode=0,block=0,nbytes=8192(f 81d2228,r 81d0588)

[4]輸入過濾器:轉發(fā)了6個字節(jié)

[4]輸入過濾器:發(fā)送了EOS

[4]輸入過濾器:輸入轉發(fā)完成

不久之后,輸出過濾器將會開始接收數(shù)據,就在此時引發(fā)RESPONSE_HEADERS規(guī)則:

[9]輸出過濾器:接收輸出(f 81d2258,r 81d0588)

[4]開始RESPONSE_HEADERS階段

一旦所有的規(guī)則都運行過了,modsecurity將繼續(xù)在緩存區(qū)中儲存響應體,之后運行RESPONSE_BODY規(guī)則。

[9]輸出過濾器:斗式MMAP包含12個字節(jié)

[9]輸出過濾器:斗式EOS包含0個字節(jié)

[4]輸出過濾器:完成接收響應體(緩沖區(qū)滿-12個字節(jié))

[4]開始階段RESPONSE_BODY

再一次假設沒有鎖定規(guī)則,積累的響應體將會轉發(fā)給客戶端。

[4]輸出過濾器:輸出轉發(fā)完成

最后,記錄階段開始。先運行LOGGING規(guī)則來影響記錄動作,這之后如果有必要的話才會啟動審計記錄子系統(tǒng)來記錄交互。審計記錄子系統(tǒng)發(fā)的消息將會是日志中最后一條交互消息。在這個例子中,modsecurity告訴我們他沒有發(fā)現(xiàn)交互當中任何值得關注的事情并且沒有理由記錄:

[4]開始記錄

[4]開始LOGGING階段

[4]審計記錄:忽略了一個不想管的請求。

?

?

?

?

?

?

?

?

?

?

?

處理階段:

ModSecurity 2.x允許把規(guī)則至于下述五個階段之一:

請求頭(REQUEST_HEADERS)

請求體(REQUEST_BODY)

響應頭(RESPONSE_HEADERS)

響應體(RESPONSE_BODY)

記錄(LOGGING)

為了在規(guī)則執(zhí)行時選擇階段,需要使用階段命令,可以通過規(guī)則中直接使用,也可以通過SecDefaultAction指令。

SecDefaultAction “l(fā)og,pass,phase:2”

SecRule REQUEST_HEADER:Host “!^$””deny,phase:1”

注意:要注意規(guī)則的執(zhí)行時依賴于階段,即使是一個配置文件中的兩條鄰近的規(guī)則,只要是設置了在不同的階段中執(zhí)行,他們就不會是一個接一個的生效。配置文件中的規(guī)則順序僅僅是在規(guī)則各自的階段中是重要的。在使用Skip和SkipAfter動作時尤為重要。

注意:LOGGING階段比較特別,無論前面的各個階段發(fā)生了什么事,都會每個事務的最后被執(zhí)行。這就意味著哪怕是請求被中斷或是放行事務時都會被執(zhí)行。

請求頭階段:

這個階段的規(guī)則會在apache完成請求頭的讀取后立即被執(zhí)行(post-read-request階段),這時,還沒有讀取請求體,意味著不是所有的參數(shù)都可用。如果你必須讓規(guī)則盡早運行,應把規(guī)則放在這個階段(在apache使用這個請求做某些事前),在請求體被讀取前做些事情,從而決定是否緩存這個請求體,或者決定你將希望這個請求體如何被處理(如是否以XML格式解析或不解析)。

注意這個階段的規(guī)則無法影響apache的范圍指令(Directory,Location,LocationMatch等)像post-read-request鉤子一樣還無法得到信息。VirtualHost指令有些例外,如果想在apache的locations使用ModSecurity規(guī)則,那么他們應該運行在階段2,參考apache請求環(huán)/ModSecurity處理階段圖標。

請求體階段:

這是通用輸入分析階段,大部分傳統(tǒng)的應用規(guī)則不在這兒,這個階段你肯定能收到參數(shù)(只有讀取過請求體后),在請求體階段,ModSecurity支持三種編碼類型。

Application/x-www-form-urlencoded – used to transfer from data

Multipart/from-data – used for file transfers

Text/xml – used for passing XML data

大部分WEB應用還沒有使用其他的編碼方法。

響應頭階段:

發(fā)生在響應頭被發(fā)送到客戶端之前,如果你想觀察響應發(fā)生前就在這兒運行,如果你想使用響應頭來決定你是否想緩存響應體也行。注意一些響應狀態(tài)碼(如404)在請求環(huán)的早期就被apache管理著,我也無法觸發(fā)預期。加上apache在后面的鉤子上雙增加了一些響應頭(如日期、服務器和連接信息等),這些我們無法觸發(fā)和審查。在代理配置模式下或使用phase:5(logging)工作的較好。

響應體階段:

這是通用輸出分析階段,這里你能運行規(guī)則截斷響應體(當然提供緩存)。這個階段你想檢查輸出的HTML信息公布、錯誤信息和失敗的驗證文字。

日志階段:

在日志發(fā)生前運行的一個階段,放在這個階段的規(guī)則只能影響日志記錄器如何執(zhí)行,這個階段可以檢測apache記錄的錯誤信息,在這個階段你不能拒絕或阻斷連接,因為太遲了,這個階段也允許檢測其他的響應頭,如那在phase:3或者phase:4階段中不可用的。注意在這個階段,你應當小心不要繼承破壞性的動作到規(guī)則中,這樣的情況在ModSecurity2.5.0及其以后的版本中被當做配置錯誤。

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

Embedded vs. Reverse Proxy Mode

嵌入式與反向代理模式

Modsecurity并不關心自己是否處于嵌入式或反向代理模式,反向代理模式時,Apache負責向后端服務器轉發(fā)數(shù)據并接收發(fā)回來的數(shù)據,所以modsecurity不用關心。只有一點小區(qū)別,下面我列出來供參考:

1、? 嵌入式時,通常會使用一個資源(一個script腳本或者一個file文件)來滿足每一個請求。Modsecurity規(guī)則會檢查這些文件(SCRIPT_*允許訪問的變量族)的屬性。反向代理模式時,實際上是由后端服務器來滿足所有的請求。也就是說不使用本地資源,并且相關變量的使用一點意義也沒有。

2、? 嵌入式時,

?

?

?

?

?

?

?

Integrating with ClamAV

結合clamav

Clamav是一個開源防病毒軟件,如果你已經安裝了Clamav,你可以使用下面的腳本掃描modsecurity的文件。(Clam AntiVirus是一個類UNIX系統(tǒng)上使用的反病毒軟件包。主要應用于郵件服務器,采用多線程后臺操作,可以自動升級病毒庫。)

?

?

?

?

3 Configuration

Modsecurity已經編譯好并且準備好運行了,現(xiàn)在我們可以對他進行配置。這一段落以及很多分段,會講到modsecurity配置的每一部分,并明確的配置每一個小細節(jié)。

Table 3.1. Main configuration directives

Directive ?????????????????????????Description

SecArgumentSeparator ???????????????Sets the application/x-www-form-urlencoded parameter separator

SecCookieFormat ????????????????????Sets the cookie parser version(設置cookie解析器版本)

SecDataDir ??????????????????????????Sets the folder for persistent storage(設置用于持久性存儲的文件夾)

SecRequestBodyAccess ??????????????Controls request body buffering

SecRequestBodyInMemoryLimit?????? ??Sets the size of the per-request memory buffer

SecRequestBodyLimit ?????????????????Sets the maximum request body size ModSecurity will accept

SecRequestBodyNoFilesLimit ??????????Sets the maximum request body size, excluding uploaded files

SecResponseBodyAccess?????? ???????Controls response body buffering

SecResponseBodyLimit ???????????????Specifies the response body buffering limit

SecResponseBodyLimitAction ?????????Controls what happens once the response body limit is reached

SecResponseBodyMimeType ??????????Specifies a list of response body MIME types to inspect

SecResponseBodyMimeTypesClear ????Clears the list of response body MIME types

SecRuleEngine ??????????????????????Controls the operation of the rule engine

SecTmpDir ??????????????????????????Sets the folder for temporary files

?

Miscellaneous Options各種各樣的選項

這一段落的指令幾乎不會用到,但是有了他們,我們可以完全掌握modsecurity的配置選項。你也應該意識到他們的存在,并在一些罕見的需要使用它們的時候會使用它們。

可以使用SecArgumentSeparator指令改變application/x-www-form-urlencoded編碼的參數(shù)separator。application/x-www-form-urlencoded編碼是用來傳輸所有的GET參數(shù)和大部分POST參數(shù)的。

SecArgumentSeparator &

實際上,所有的application都使用一個&來達到這個目的,但是也有一些不會。HTML4.01說明書建議,為了方便,application支持使用分號作為separators(參考段落B.2.2URI屬性值中的&)。PHP則可以把任何字符黨組separator。

SecCookieFormat指令會從modsecurity支持的兩個cookie解析器當中選出一個。實際上,所有的applications都使用Netscape-style cookie(有時也當做version 0)所以,幾乎沒有理由來改變這個設置:

SecCookieFormat 0

?

?

4 Logging

這一段落詳細的講述了modsecurity的logging能力。Modsecurity所做的工作中,Logging占了大部分。

Debug Log調試日志

調試日志是你進行疑難排解的最基本的工具,尤其是在你剛開始學習modsecurity怎么工作的時候。

Table 4.1. Debug log directives

Directive??????? ???Description

SecDebugLog ????????Path to the debug log file

SecDebugLogLevel?? ?Debug log level

理論上調試日志有10個等級,但不是全部都使用。1-3等級的消息是有意義的,并且被復制到Apache的error log中。更高等級的消息大部分是用來解決問題和調試的。

Table 4.2. Debug log levels

Debug log level ????Description

0 ??????????????????No logging

1 ??????????????????Errors (e.g., fatal processing errors, blocked transactions)

2 ??????????????????Warnings (e.g., non-blocking rule matches)

3???????????? ??????Notices (e.g., non-fatal processing errors)

4 ??????????????????Informational

5 ??????????????????Detailed

9?????????? ????????Everything!

你會想把調試日志的等級控制的很低(當你想把所有的消息復制到調試日志時,使用等級3;或者你只想把它們放在error log中時,使用等級0)。這是因為調試日志的消息會超過50條(每一條消息都是一條I/O操作),并且平巨額每個交互至少有7KB的數(shù)據。為每一個交互都記錄所有的消息將會消耗大量的資源。

一個簡單的調試日志行是這樣的:

[18/Aug/2009:08:18:08 +0100] [192.168.3.111/sid#80f4e40][rid#81d0588][/index.html]}

[4] Initialising transaction (txid SopVsH8AAAEAAE8-NB4AAAAD)。

這一命令行以元數(shù)據開頭,而元數(shù)據通常比消息本身還要長。

?

?

?

?

?

?

?

?

?

?

?

?

?

5 Rule Language Overview規(guī)則語言概述

?

Operators

截止到目前,所有的例子都是假設使用正規(guī)模式對輸入進行匹配。盡管正則表達式非常有用,我們還是經常想做一些其他的事情。這時候就會用到運算符。事實是modsecurity總是使用一個運算符,而不是你在一個規(guī)則中指定一個運算符它才使用運算符,不指定的話,它就使用正規(guī)模式匹配。所以作為開始,下面的規(guī)則明確指定了一個運算符——正規(guī)模式正在匹配一個!

SecRule ARGS:username “@rx ^(admin|root)$”

上面的規(guī)則檢查請求用戶名是admin還是root。你也許已經注意到了幾件事情:

運算符以@開頭

運算符總是被放在第二條SecRule token開頭(token貌似指的是引號部分)

運算符后面有一個空格。無論運算符后面是不是一個簡單的運算符參數(shù)。@rx運算符的參數(shù)是一個正則表達式

當規(guī)則中帶有明確的運算符的時候,你需要在token周圍使用雙引號,token內部總是有一個空格。沒有雙引號,Apache將會混淆。

運算符之所以強大在于它提供的廣泛的功能。表5.9中列出的字符串操作符,使用最頻繁。目前你已經看到了足夠的使用正規(guī)模式匹配的例子。除了簡單的匹配運算符(@beginsWith,@endsWith等)之外,modsecurity還提供了類似的匹配,可以立即匹配大量的模式。@pm@pmFromFile就是這么用的。

String matching operators字符串匹配運算符

字符串匹配運算符從輸入提取一個字符串,然后嘗試將他和提供的參數(shù)進行匹配。@rx和@pm是經常使用的運算符,因為他們的versatility(@rx)和速度(@pm),剩下 運算符也有用,尤其是當你 需要不同種類的擴展的時候,@rx和@pm都不支持。

Table 5.9. String matching operators

Operator ??????????????????Description

@beginsWith ??????????????????Begins with

@contains ?????????????????????Contains

@endsWith???????????????????? Ends with

@rx ???????????????????????????Regular pattern match(正規(guī)模式匹配)

@pm ??????????????????????????Parallel matching(平行匹配)

@pmFromFile ?(@pmf in v2.6) ??Parallel matching, with arguments from a file(與文件中的參數(shù)進行平行匹配)

@streq ????????????????????????String equal to

@within ???????????????????????Within

Numerical operators數(shù)字運算符

表格5.10,使比較數(shù)字值變得很簡單(previously you had to resort to使用復雜的正則表達式)

Table 5.10. Numerical operators

Operator????? ?Description

@eq ???????????Equal

@ge ???????????Greater or equal

@gt ???????????Greater than

@le ???????????Less or equal

@lt ????????????Less than

Validation operators

表格5.11,all validate input in some way.,

Table 5.11. Validation operators

Operator??????????? ?Description

@validateByteRange ????Validates that parameter consists only of allowed byte values

@validateDTD ??????????Validates XML payload against a DTD

@validateSchema ??????Validates XML payload against a Schema

@validateUrlEncoding ???Validates an URL-encoded string

@validateUtf8Encoding ??Validates an UTF-8 encoded string

Miscellaneous operators

?

?

Table 5.12. Miscellaneous operators

Operator ???????Description

@geoLookup ??????Determines the physical location of an IP address

@inspectFile ??????Invokes an external script to inspect a file

@rbl ??????????????Looks parameter against a RBL (real-time block list)

@verifyCC ????????Checks if the parameter is a valid credit card number

Actions

動作會使modsecurity精簡(tick)。

?

?

Disruptive actions

表格5.13指定了規(guī)則成功匹配時將會做什么。每一條規(guī)則都必須和一個disruptive動作結合。Pass動作時唯一例外,當規(guī)則匹配時他會繼續(xù)處理規(guī)則。其他所有的動作都會以某一指定方式進行攔截。

Table 5.13. Disruptive actions

Action ???????Description

Allow????????? ?Stop processing of one or more remaining phases(停止一個或更多的剩下階段的處理)

Block????????? ?Indicates that a rule wants to block(規(guī)則會攔截)

Deny????????? ?Block transaction with an error page(用一個錯誤頁面攔截交互)

drop ???????????Close network connection(關閉網絡連接)

pass?????????? ?Do not block, go to the next rule(不攔截,繼續(xù)下一條規(guī)則)

proxy ??????????Proxy request to a backend web server(對后端服務器進行代理請求)

redirect ?????????Redirect request to some other web server()

Flow actions

表格5.14中的動作會轉變規(guī)則在一個段中處理的方式。

?

Table 5.14. Flow actions

Action ????Description

chain ??????Connect two or more rules into a single logical rule(把兩條或更多的規(guī)則在一條簡單的邏輯規(guī)則里進行連接)

skip ???????Skip over one or more rules that follow(跳過緊接下來的一條或幾條規(guī)則)

skipAfter??? Skip to the rule or marker with the provided ID(跳到指定ID號的規(guī)則或標志)

Metadata actions

表格5.15中的metadata actions提供了規(guī)則的附加信息,把這些信息和error消息結合起來就會更容易理解他們?yōu)槭裁窗l(fā)生的。

Table 5.15. Metadata actions

Action ??Description

id ????????Assign unique ID to a rule(給規(guī)則分配單獨的ID號)

phase ????Phase for a rule to run in(規(guī)則在哪一段中運行)

msg????? ?Message string(消息字符串)

rev ???????Revision number()

severity ???Severity

tag ???????Tag

Variable actions變量動作

5.16中的變量動作處理變量,你可以用他們來對變量進行設置、改變和刪除。

Table 5.16. Variable actions

Action ?????Description

capture ??????Capture results into one or more variables()

deprecatevar ?Decrease numerical variable value over time

expirevar ?????Remove variable after a time period(一個時間段之后刪除變量)

initcol???????? Create a new persistent collection(創(chuàng)建一個新的連續(xù)的集合)

setenv ???????Set or remove an environment variable(設置或刪除環(huán)境變量)

setvar ???????Set, remove, increment or decrement a variable()

setuid ???????Associate current transaction with an application user ID (username)(用應用用戶ID、用戶名和當前交互結合起來)

setsid?????? ?Associate current transaction with an application session ID(用應用會話ID和當前交互結合起來)

Logging actions

5.17的Logging動作會影響日志產生的方式。需要使用ctl動作來整體控制交互記錄。

Table 5.17. Logging actions

Action ???????????????Description

auditlog ?????????????????Log current transaction to audit log(把當前交互記錄得到audit log里面)

log????????????????????? Log error message; implies auditlog(記錄錯誤信息,implies auditlog)

logdata????????????????? Log supplied data as part of error message()

noauditlog ???????????????Do not log current transaction to audit log(不把當前交互記錄到auditlog中)

nolog??????????????????? Do not log error message; implies noauditlog()

sanitiseArg ??????????????Remove request parameter from audit log(從auditlog中刪除請求參數(shù))

sanitiseMatched ??????????Remove parameter in which a match occurred from audit log(從audit log中刪除匹配參數(shù))

sanitiseRequestHeader ????Remove request header from audit log(從audit log中刪除請求頭)

sanitiseResponseHeader ??Remove response header from audit log(從audit log中刪除響應頭)

Special actions

5.18的special動作是sort的gateways,使用他們可以訪問其他功能類。Ctl動作有幾個自己的子動作,它能改變交互的引擎配置,而且只能改變當前交互的。MultiMatch規(guī)則產生了一種特殊的匹配方式,在每一次轉換之后,規(guī)則里的運算符都以這種方式執(zhí)行(通常情況下,當所有的轉換完成之后運算符只執(zhí)行這一次)。可以使用t動作來使用0個或更多的轉換,在運算符執(zhí)行之前對變量進行轉換。

Table 5.18. Special actions

Action ?????Description

ctl ???????????Change configuration of current transaction(改變當前交互的配置)

multiMatch ???Activate multi-matching, where an operator runs after every transformation()

t ????????????Specify transformation functions to apply to variables before matching(匹配之前指定變量的轉換函數(shù))

Miscellaneous actions

Miscellaneous動作包含了不屬于任何組的動作。

Table 5.19. Miscellaneous actions

Action ??????Description

append ???????Append content to response body

exec ?????????Execute external script(執(zhí)行外部腳本)

pause??????? ?Pause transaction(暫停交互)

prepend ??????Prepend content to response body()

status ????????Specify response status code to use with deny and redirect(指定響應狀態(tài)碼deny和redirect)

xmlns ????????Specify name space for use with XPath expressions(為APath表達式指定響應空間)

?

?

?

?

6 Rule Language Tutorial規(guī)則語言使用指南

Introducing simple rules and operators

最簡單的規(guī)則值指定一個變量和一個正則表達式。下面的例子中,檢查request URI,看看能不能和正則表達式模式<script>進行匹配。

SecRule REQUEST_URI <script>

正是由于modsecurity允許一個規(guī)則不指定運算符,他會假設正則表達式就是一個運算符,這個簡單的規(guī)則才能成立。

?

SecRule REQUEST_URI "@rx <script>"

注意因為第二個參數(shù)含有空格,必須使用雙引號。Modsecurity支持很多運算符,有些相似,但通常會有不同的執(zhí)行特點。例如,上面的例子中我使用的正則表達式模式(<script>)還不足以成為一個模式。只是一個字符串而已。因為他不包含任何特殊字符。我也能使用@contains運算符寫一個同樣的規(guī)則:

SecRule REQUEST_URI "@contains <script>"

?

Working with variables

在一條規(guī)則當中你可以指定任意多的變量,只要使用“|”字符他們分開即可。

SecRule REQUEST_URI|REQUEST_PROTOCOL <script>

對集合這個變量來說,包含了一條以上的消息。例如ARGS變量,包含了一個交互中所有的請求參數(shù)。你可以使用“:”運算符來指定集合當中的一個成員,下面這條規(guī)則只查看名字為p的參數(shù):

SecRule ARGS:p <script>

在同一條規(guī)則當中你可以多次使用同一個集合:

SecRule ARGS:p|ARGS:q <script>

實際上,“:”非常有效,使用正則表達式的時候,你可以使用“:”來指定名字,當參數(shù)的名字在運行期間會發(fā)生改變的時候,這個功能非常有用。下面這條規(guī)則會找出所有名字是以字母“p”開頭的參數(shù),捕捉密碼或者pea這樣的參數(shù):

SecRule ARGS:/^p/ <script>

如果你沒有限制規(guī)則只能訪問集合中的某些成員時,modsecurity會認為你會用集合的所有成員。當你不知道一個頁面會使用什么參數(shù)的時候,使用起來會很handy。并不是所有的結合都可以這么使用(ARGS可以,但是ENV不可以)。但是。。。

例如,當一個請求含有p、q、z三個參數(shù)時,ARGS可以如下擴展:

[4] Expanded "ARGS" to "ARGS:p|ARGS:q|ARGS:z".

?

下面這條規(guī)則將會檢查除z以外的參數(shù):

SecRule ARGS|!ARGS:z <script>

Combining rules into chains

一個規(guī)則中指定一個以上的變量時,可以使用OR邏輯運算符。任一個變量匹配,規(guī)則就會匹配。也可以使用邏輯AND把幾個規(guī)則組合成一個。如果你想寫一條規(guī)則,實現(xiàn)在p和q兩個參數(shù)中發(fā)現(xiàn)一些東西,規(guī)則就匹配,你可以這樣寫:

SecRule ARGS:p <script> chain

SecRule ARGS:q <script>

這就叫rule chaining,chain這個動作構成了兩個或更多的規(guī)則鏈,并有效的建立了帶有一個以上的evaluation步驟的一條簡單規(guī)則。鏈的第一條規(guī)則總是運行,而對子規(guī)則來說,只有當同一條鏈中它前面的規(guī)則都運行完了之后他才運行。。。

?

Operator negation否定運算符

在運算符前面放感嘆號“!”,就會得到否定的結果。例如:你想寫一條規(guī)則,當用戶名既不是admin也不是root時規(guī)則匹配(與之前的例子目的相反):

SecRule ARGS:username “!@rx ^(admin|root)$”

不要把運算符否定和規(guī)則否定混淆。只有當一個規(guī)則只對一個變量使用的時候兩個才是一樣的。但是如果變量多于一個的話,情況就變了:

SecRule ARGS:p|ARGS:q “!@eq 5”

上面的規(guī)則只要有一個變量不等于5就會匹配。如果你想寫一條規(guī)則實現(xiàn)兩個變量都不等于5時才進行匹配,你就必須使用規(guī)則鏈:

SecRule ARGS:p "!@eq 5" chain

SecRule ARGS:q "!@eq 5"

Variable counting

提問:如何檢查沒有出現(xiàn)的一些東西,比如常見的規(guī)則,把所有的參數(shù)放在一個請求中:

SecRule ARGS <script>

一個請求不含有任何變量時,ARGS會擴展成0個變量。如果沒有變量的話,運算符將會運行失敗,規(guī)則(或規(guī)則鏈)將不會匹配。

答案就是使用modsecurity的能力去計算集合中變量的個數(shù)。使用&運算符可以查看ARGS,檢測沒有參數(shù)的情況:

SecRule &ARGS “@eq 0”

&運算符可以應用于任意集合,包括集合的某一部分。下面這條規(guī)則當請求中含有一個以上username參數(shù)的時候將會匹配。

SecRule &ARGS:username "!@eq 1"

Using actions

目前這個指南中的大部分例子都沒有用動作。剛開始我們只關注檢測機制。實際上,連一條簡單動作都不指定的話,你是寫不出規(guī)則的。而且,寫獨立的規(guī)則而不是讓規(guī)則依賴于默認動作,是一個很好的習慣。

SecRule第三個參數(shù)和SecAction第一個參數(shù)是動作。一個規(guī)則可以沒有動作,也可以有一個或一個以上的規(guī)則。如果有一個以上的動作,用“,”和許多空格進行分隔。下面這條規(guī)則指定了兩個動作:

SecRule ARGS K1 log,deny

有些動作帶有參數(shù),你需要在動作和參數(shù)之間放一個“:”。使用狀態(tài)碼404拒絕,規(guī)則如下:

SecRule ARGS K1 log,deny,status:404

最后,如果提供的參數(shù)帶有空格或逗號,需要用單引號把參數(shù)值括起來這種參數(shù)處理方式經常用于消息中:

SecRule ARGS K1 “l(fā)og,deny,msg:’Acme attack detected’”

在msg動作參數(shù)周圍使用單引號之外,我把整個指令參數(shù)用雙引號括起來了。這樣Apache才會正確解析指令行。稍后你將會看到一些動作包含復雜的參數(shù)(如ctl和setvar),現(xiàn)在討論的語法同樣要應用于他們。

?

Understanding action defaults

你已經了解了如何指定規(guī)則動作,但是如果你不指定的話會發(fā)生什么呢。Modsecurity有一個默認的動作列表。當你在配置中添加新的規(guī)則時,這條規(guī)則的動作列表和默認動作列表合并。Modsecurity2.5.11中,默認動作類表是phase:2,log,auditlog,pass,但是你可以隨時使用SecDefaultAction指令來把它覆蓋。最簡單的例子是,當增加的規(guī)則里面沒有動作時,就會替換性的使用默認動作列表。一下面這條規(guī)則為例(假設配置中沒有其他的規(guī)則或默認動作。)

SecRule ARGS K1

相當于:

SecRule ARGS K1 phase:2,log,auditlog,pass

通常當一個規(guī)則有一個或一個以上的動作時,合并意味著兩件事情中的一件:

Rule action replaces an action in the default action list規(guī)則動作代替默認動作列表中的一個動作

這非常典型的發(fā)生在disruptive動作中,一個每一條規(guī)則只能有一個disruptive動作。如果在默認動作列表中和新的規(guī)則中都指定了一個disruptive動作,那么規(guī)則中的那個將會把默認的覆蓋掉。

Rule action is appended to the ones in the default action list規(guī)則動作添加到默認動作列表中去

有些動作會在動作列表中出現(xiàn)不止一次。像很多non-disruptive動作,例如:t,setvar,ctl等等。有些情況下規(guī)則動作可以完全去除默認動作,但怎么做到的取決于動作。例如轉換動作指定none作為轉換函數(shù)(t:none)的話,就是清空列表重新開始。

?

?

SecDefaultAction phase:2,log,deny,status:404

SecRule ARGS K1

SecRule ARGS K2

SecRule ARGS K99

?

?

SecADefaultAction phase:2,log,pass,t:lowercase

SecRule ARGS K1 t:urlDecode

?

?

#first we have some rules that only warn

SecDefaultAction phase:2,log,pass

SecRule ARGS W1

SecRule ARGS W2

SecRule ARGS W19

#Now we have some rules that block

SecDefaultAction phase:2,log,deny,status:500

SecRule ARGS B1

SecRule ARGS B89

?

?

S

?

?

?

?

139

9 Practical Rule Writing實用規(guī)則寫作

Whitelisting白名單

通常寫規(guī)則集是為了挑選出不尋常的請求,但事實是大多數(shù)網絡包含一個或多個請求源,這些請求源不僅是不尋常的,而且是所需要的。網絡越復雜,就越需要使用白名單。大多數(shù)情況下,一個粗陋的監(jiān)視腳本監(jiān)視你的網站,看上去更像是一個粗陋的Perl腳本攻擊你的網站。你可能會把安全測試外包給第三方,并且你不想你的規(guī)則干擾他們的工作。最后,即使你沒有這些問題,你也無法避免一些不能預料的情況,Apache會給自己發(fā)送請求。

Whitelisting theory

?

Integration with other Apache modules與Apache其他模塊整合

Apache最大的優(yōu)點就是它的模塊化。大多數(shù)情況下模塊是單獨使用的,但是多功能模塊能把一個模塊與另一個模塊聯(lián)系起來。通常modsecurity避免重復實現(xiàn)一些其他模塊已經實現(xiàn)了的功能,即使是帶有安全標簽的功能。向其他模塊發(fā)送指令或者從其他模塊接收指令需要時間。

Apache內部有兩個機制實現(xiàn)模塊之間的聯(lián)系:

Environment variables環(huán)境變量

通常內部模塊使用環(huán)境變量來實現(xiàn)與其他模塊之間的信息交換或者相互影響。當兩個模塊需要聯(lián)系時,要配置接受狀態(tài)的模塊來監(jiān)聽環(huán)境變量,并能對環(huán)境變量進行作用。很多模塊建立之初就帶有環(huán)境變量,所以如果你發(fā)現(xiàn)一個模塊支持環(huán)境變量,那就意味著你能夠用這個環(huán)境變量通過setenv動作和modsecurity的模塊進行通信。因為在modsecurity內部你能夠實用ENV集合檢索已命名變量的值,所以你可以不受限制的使用其他模塊提供的信息來寫規(guī)則。

Optional functions可選函數(shù)

對一個模塊來說,有了可選函數(shù),就可以輸出一個或者更多的函數(shù)供其他模塊使用。Modsecurity在可選函數(shù)頂部建立了自己的擴展API接口。擴展API會在第十三章,Extending Rule Language.詳細講解。

你可能感興趣的模塊包括:

?mod_deflate

? mod_headers

? mod_log_config

? mod_rewrite

? mod_setenvif

?

Conditional logging有條件的日志記錄

通常情況下,日志會把所有Apache處理過的交互都記錄下來,但是有時候你只想記錄一部分交互。這就是conditional logging。你可以使用Apache的環(huán)境變量描述你想記錄哪些東西。

? 默認記錄 ,但是如果設置了環(huán)境變量就不記錄

? 默認不記錄,但是如果設置了環(huán)境變量就會記錄

下面的例子,創(chuàng)建了一個自定義訪問日志,只記錄指定IP地址的交互:

# Detect the condition that require logging

SecRule REMOTE_ADDR "@streq 192.168.1.1" \

phase:1,nolog,pass,setenv:SPECIAL_ACCESS_LOG

# Create a special access log file, which reacts to

# the SPECIAL_ACCESS_LOG environment variable.

CustomLog logs/special_access.log combined env=SPECIAL_ACCESS_LOG

?

?

?

Header manipulation頭操縱

Apache用mod_headers模塊進行頭操縱。Header和RequestHeader指令知道怎樣去檢查我前面提到的環(huán)境變量。也就是說你可以使用Header和RequestHeader指令有條件的改變請求和響應頭。像以前一樣,用modsecurity檢查條件,如果條件符合的話設置環(huán)境變量。

Mod_Header模塊是一個Apache平臺上對請求頭和響應頭進行定制的模塊,它的強大之處是可以和ModSecurity的SetEnv指令聯(lián)合使用,如:(張宏超)

下面的例子中使用modsecurity引導mod_headers刪除session(會話)cookie:

#Simulate a condition that would want us

#to force the user to use another session(模擬一下,強迫用戶使用另一個會話)

SecRule ARGS attackPattern “phase:2,t:none,log,pass,setenv:DISABLE_OUTBOUND_SESSION”(當遇到攻擊attackPattern時,modsecurity會給mod_headers發(fā)送環(huán)境變量)

#Expire session cookies when instructed(mod_headers接收到命令時時終止會話cookies)

Header set Set-Cookie “PHPSESSION=;expires=Fri,31-Dec-1999 00:00:00 GMT” \

Env=DISABLE_OUTBOUND_SESSION (當mod_headers接收到環(huán)境變量DISABLE_OUTBOUND_SESSION時就會刪除會話cookie,并給用戶返回另一個會話)

這個例子簡單的來說就是當發(fā)現(xiàn)某個人在攻擊我們的網站時,我們就強制重新給他發(fā)一個session(張宏超)

(這個規(guī)則編譯時候需要有action id號,并且需要在httpd配置文件中加載模塊:

LoadModule headers_module modules/mod_headers.so)

Securing session cookies保護會話cookies

在支持用戶認證的web應用中,會話cookie功能作為臨時口令。用戶只提供他們的身份證明一次,假設證明是正確的,將會把他們的會話作為認證標記。從此刻起,只要知道會話ID就可以完全控制這次會話。應該非常小心創(chuàng)建會話cookie,以保證他們的安全。在很多應用中,可以通過修改cookie結構的兩個方面提高他們的安全:

Use of the httpOnly flag使用httpOnly標志

Ie發(fā)明了httpOnly,目的是防止JavaScript訪問會話cookies。攻擊者經常使用JavaScript成功實現(xiàn)XSS攻擊,然后盜竊會話ID。因為只有服務器編碼使用會話cookies,所以如果阻止JavaScript訪問并不會損失什么。使用httpOnly會使會話劫持變得更困難。

Use of the secure flag使用secure標志

如果網站使用SSL,攻擊者就無法訪問在網站和用戶之間傳輸?shù)臄?shù)據。當使用SSL時,經常忽略了把會話cookies標記為secure。這種疏忽會使用戶的會話cookies陷入危險,使攻擊者能夠訪問響應的會話。

如果你使用的是Apache2.2.4或更高版本,你就能夠只使用兩條mod_headers指令就可以很快的解決上面這些問題。下面的例子使用PHP提高了會話cookies的安全。

# Add missing httpOnly flag

Header edit Set-Cookie "(?i)^(PHPSESSID=.+(?!httponly))" "$1; httpOnly"

# Add missing secure flag

Header edit Set-Cookie "(?i)^(PHPSESSID=.+(?!secure))" "$1; secure"

通常使用Set-Cookie頭來創(chuàng)建新的cookies,所以通過查看Set-Cookie頭,就可以找出沒有設置期望標志的會話cookies。如果找到設置錯誤的cookie,我們會修改頭并加上標志。例子使用了很少用但是很有用的特性:

兩個正則表達式都以(?i)開頭,保證匹配動作不區(qū)分大小寫。

第二部分里面,一個negative lookahead assertion(否定先行界定符),造成只有當界定符里面的bits沒有在頭里面出現(xiàn)時才會匹配整個模式。

第四個參數(shù)使用反響引用($1),第四個參數(shù)包含的值,會替換現(xiàn)存的Set-Cookie的值,現(xiàn)存的頭值會替換反向引用($1)。

?

Advanced Blocking高級鎖定

簡單的鎖定是直截了當?shù)摹?/p>

使用deny狀態(tài)碼和redirect(重定向)狀態(tài)碼

配置用戶響應頁面(單獨一個單元還是應用程序安裝的一部分?)

不能鎖定第五階段

鎖定第三和第四階段會有困難

加上可能帶有mod_deflate的版本

蜜罐鎖定(每個IP地址/段重定向)

指定了什么時候鎖定但沒指定怎么鎖定

延遲(階段)鎖定——設置一個標志評估段中的規(guī)則。最大化的檢測。

基于分數(shù)的鎖定(每次交互)

持續(xù)的基于分數(shù)的鎖定(每個IP地址,段,用戶)

外部鎖定

嚴重性有什么用

可以在鎖定中使用標記嗎

用于鎖定的名譽數(shù)據庫(rbl)

用于鎖定的GeoIP

?

Making the most of regular expressions充分使用正則表達式

盡管modsecurity支持很多操作符,正則表達式如此強大而且功能廣泛,因為在規(guī)則中經常見到正則表達式。Modsecurity使用Per1兼容正則表達式庫http://www.pcre.org ,更常稱為PCRE。這是一個周所周知應用廣泛的正則表達式庫。Apache也使用的PCRE。正則表達式強大的令你驚奇,你會發(fā)現(xiàn)它比你想象的能干。這個章節(jié)將會強調PCRE最重要的方面以及modsecurity是如何使用它的,但這也只是冰山一角。強烈建議你熟悉一下PCRE參考資料http://www.pcre.org/pcre.txt ,包含了你需要知道的所有東西。

How ModSecurity Compiles Patternsmodsecurity怎樣編譯模式

正則表達式需要先編譯后使用。編譯是轉化成有效的內部表示。在configure-time,編譯步驟做盡可能多的工作來提高庫的性能,編譯標志會影響模式的使用,你需要注意一下他們。在最重要的地方,即@rx操作符,使用正則表達式,modsecurity用了兩個編譯標志:

?

PCRE_DOLLAR_ENDONLY

默認,一個美元通配符$將會在字符串結尾匹配換行符。用戶通常會發(fā)現(xiàn)一件不可思議的事情,規(guī)則完全控制著哪個地方允許什么東西,但是$卻把規(guī)則打亂了。通過使用PCRE_DOLLAR_ENDONLY來編譯模式,$只能在輸入的結尾進行匹配。

?

以下是從百度文庫里搜索的:

D(PCRE_DOLLAR_ENDONLY)

如果設定了此修正符,模式中的行結束($)僅匹配目標字符串的結尾。沒有此選項時,如果最后一個字符是換行符的話,也會被匹配在里面。如果設定了m修正符則忽略此選項。

?

PCRE_DOTALL

默認,模式中的原點元字符匹配除了指定換行符之外的所有字符。在一個有潛在弱點的安全上下文中,攻擊者使用換行符打破攻擊有效載荷并阻止模式匹配。使用PCRE_DOTALL集,一個原點元字符會真正的匹配任何字符。

現(xiàn)在你知道了要使用哪些編譯標志,去了解兩個不用的很重要:

PCRE_CASELESS

匹配時忽略大小寫。

?

以下是從百度文庫里搜索的:

S(PCRE_DOTALL)

如果設定了次修正符,模式中的原點元字符(.)匹配所有的字符,包括換行符。沒有此設定的話,則不包括換行符。

?

?

?

Table 9.1. Pattern compilation flags

Usage ???????????????????????Compilation flags used

@rx ??????????????????????????PCRE_DOLLAR_ENDONLY, PCRE_DOTALL

@verifyCC ????????????????????PCRE_DOTALL, PCRE_MULTILINE

SecAuditLogRelevantStatus ?????PCRE_DOTALL

SecRuleRemoveByMsg ?????????No flags used

Variable selection (e.g. ARGS)? ??PCRE_CASELESS, PCRE_DOLLAR_ENDONLY, PCRE_DOTALL

Changing how patterns are compiled改變模式編譯的方式

如果你對modsecurity編譯模式的方式不滿意,但是你會對一件事情感到滿意,那就是你可以用PCRE在模式內部可以覆蓋編譯標志。比如下面這個例子:沒有使用任何轉換函數(shù),無論使用什么案例,它將會匹配單詞attack

SecRule ARGS “(?i)attack” phase:2,t:none

把(?i)部分放在模式開頭,為整個模式觸發(fā)PCRE_CASELESS標志。也可以通過在里面方修飾語的方法,為模式的一部分修改設置。

SecRule ARGS “attack (?i)keyword” phase:2,t:none

上面這個例子將會匹配attack keyword和attack KEYWORD,但不會匹配ATTACK keyword。如果你在次模式中使用修飾語,只修飾余下的模式:

SecRule ARGS “(ken(?i)word) attack” phase:2,t:none

上面的例子將會匹配keyWORD attack,但不會匹配keyWORD ATTACK或者KEYWORD attack。

在字母之前使用破折號-來刪除一個標志。下面的模式打亂了modsecurity默認使用的PCRE_DOTALL標志:

SecRule ARGS “(?-s)keyword” phase:2,t:none

你可以用這種方法使用的修飾符的完整列表在表9.2,你可以查閱PCRE參考文件查找他們完整的意思。

Table 9.2. Pattern modifiers

Modifier ???Meaning

i ????????????PCRE_CASELESS

J ???????????PCRE_DUPNAMES

m ???????????PCRE_MULTILINE

s??????????? ?PCRE_DOTALL

U ???????????PCRE_UNGREEDY

x ???????????PCRE_EXTENDED

X?????????? ?PCRE_EXTRA

Common pattern problems常見模式問題

正則表達式出錯很常見,但是有兩個更加常見:

Forgetting to escape the dot metacharacter ???????忘記忽視元字符點.

很容易遺忘一件事情,那就是點.是一個需要被忽視的元字符。因為IP地址里面有很多點,所以當你寫一個模式來匹配IP地址的時候,經常發(fā)生這種事情。如果沒有忽視點,點將會匹配任意一個字符,和非元字符進行匹配。

Not using the ^ and $ anchors when matching entire input當要匹配整個輸入的時候沒有使用^和$錨

當你要匹配整個輸入的時候,需要使用^和$。者能夠保證,不管你寫的是什么模式,都能夠進行全部匹配。如果你忘記了使用^,攻擊者就是在你的模式之前發(fā)送任意內容,如果是忘記了使用$,攻擊者就會在你的模式之后發(fā)送任意內容。如果沒有錨,模式將會匹配中間的子字符串,而忽略其他任何東西。

?

Regular Expression Denial of Service正則表達式拒絕服務攻擊

正則表達式拒絕服務攻擊(又稱ReDoS)是一個比較令人費解的問題,它能影響每一個正則表達式寫手。一些正則表達式結構當遇到邊界案例的時候性能變得很差(指數(shù)級的)。你一不小心會寫出一個會被暗中操縱的模式,攻擊者從外面消耗你大部分服務器資源。

下面是從Alex’s和Adar’s借用的一些變量模式的例子:

(a+)+

([a-zA-Z]+)*

(a|aa)+

(a|a?)+

(.*a){x},for x>10

?

Resources

當和正則表達式一起工作的時候會變得不知所措時,不要緊張。完全正常并且會得到及時解決。想要精通正則表達式沒必要買書,但是如果買的話肯定會有幫助的。關于書我只關注一點,就是他們都能涵蓋大部分正則表達式特性,而且我唯一感興趣的是PCRE。你至少應該看兩本書:

Mastering Regular Expressions。作者:JeffreyFriedl(O’Reilly,2006),普遍認為是正則表達式的經典著作。

Regular Expressions Cookbook,作者:Goyvaerts和Steven Levithan(O’Reilly,2009),是正則表達式最近增加的版本,更適合實踐學習。

?

?

?

?

?

?

?

Part II: Reference Documentation

14 Reference Manual

Configuration Directives配置指令:

下面一節(jié)概述了modsecurity所有的指令。大部分的modsecurity指令能被用于Apache內,例如虛擬主機,地址,地址匹配,目錄等等,當然還有其他,但是,如果在主配置文件里只能使用一次,這個在下面的章節(jié)會詳細介紹。

這些規(guī)則,和和新規(guī)則庫,應該放在httpd.conf文件外面,然后用include指令包含進來,這樣有利于更新或整合規(guī)則。如果你想自己定義一個規(guī)則,那么你應該創(chuàng)建一個文件命名為modsecurity_crs_15_customrules.conf然后放在核心規(guī)則所在文件夾,這樣,你的自定義規(guī)則將在ModSecurity標準的核心規(guī)則庫后調用,但在其他核心規(guī)則前調用,這是很有用的,如果你的站用了”allow”指令它可以檢查核心規(guī)則是否誤報。

?

注意

建議不要修改核心規(guī)則文件,除非你把它放在你自己的規(guī)則庫里,這樣當你從ModSecurity更新時會方便些。

?

SecAction action1,action2,action3

無條件執(zhí)行動作清單,它只接受第一個也是唯一的一個參數(shù),其這個參數(shù)的使用規(guī)則與SecRule的第三個參數(shù)的使用規(guī)則相同,SecAction是你想無條件執(zhí)行一個動作時的最好選擇,這個指令不受任何交互條件的限制,SecRule指定了一些動作,而這些動作的發(fā)生是基于請求/響應對數(shù)據的檢查,當你想執(zhí)行initcol動作時,這個指令通常被用來初始化持久化集合類。例如:

SecAction nolog,phase:1,initcol:RESOURCE=%{REQUEST_FILENAME}

?

SecArgumentSeparator character

SecArgumentSeparator ;

指定的字符作為application/x-www-form-urlencoded內容的分隔符,默認是&,非常少的情況下應用會使用分號(;)。這個指令用于后臺WEB應用在使用非標準的參數(shù)分隔符,如果沒有在每一個WEB應用中合理設置這個指令,那么ModSecurity可能無法適當?shù)姆治鏊械膮?shù),并且規(guī)則匹配的效果可能會顯著的降低。

SecAuditEngine On|Off|RelevantOnly

配置審計日志引擎的開啟與否,On-默認情況下記錄所有事務的日志,Off-默認情況下不記錄所有事務的日志,RelevantOnly-默認只記錄事務中由warning或error觸發(fā)的日志,或者記錄一些特意考慮過的狀態(tài)碼

在當前事務可以通過ctl操作進行設置或修改

以下例子說明不同的審計指令一起使用:

SecAuditEngine RelevantOnly

SecAuditLog logs/audit/audit.log

SecAuditLogParts ABCFHZ

SecAuditLogType concurrent

SecAuditLogStorageDir logs/audit

SecAuditLogRelevantStatus ^(?:5|4\d[^4])

?

SecAuditLog /path/to/auditlog

SecAuditLog /usr/local/apache/logs/audit.log

定義審計日志文件路徑,伴隨服務器運行開始,這個文件會以root打開,你不能為非root權限的用戶對這個文件或存儲這個文件的目錄有可寫權限。如果串行審計日志格式使用后,這個文件將被用作審計日志條目的存儲。如果同時審計日志格式使用這個文件那就被當做索引,并包含所有的審計日志文件創(chuàng)建信息。如果你計劃使用同時審計日志并發(fā)送審計日志數(shù)據到遠程主機或商業(yè)ModSecurity管理平臺,那么你需要配置和使用ModSecurity日志搜集器(mlogc)并使用下述格式去得到審計日志:

SecAuditLog “|/path/to/mlogc/path/to/mlogc.conf”

?

SecAuditLog2 /path/to/auditlog2

SecAuditLog2 /usr/local/apache/logs/audit2.log

定義同時日志啟用下的第二審計日志索引文件路徑,在本指令使用之前必須通過SecAuditLog定義主審計日志,另外這個文件僅用于當同時審計日志使用時復制主審計索引文件,不能用于非同時審計日志的情況。

?

SecAuditLogParts PARTS

SecAuditLogParts ABCFHZ(默認)

定義每個事務中記錄到審計日志中的部分。每部分以一個獨立的字母表示,當每個字母出現(xiàn)在列表中,也就是指每個事務中的相同部分會被記錄,全部列表見下文:

A-????? 審計日志標題(強制的)

B-????? 請求標題

C-????? 請求體(目前只針對請求體存在,并且ModSecurity已經配置成攔截)

D-????? 為中間人響應頭保留,暫未實現(xiàn)

E-?????? 中間人相應題(目前僅對配置了攔截響應體和配置審計日志引擎記錄有效)。中間人相應體和實際的相應體相同,除非ModSecurity攔截了中間人響應體,這種情況下,實際相應體會包含出錯信息(可能是apache的默認錯誤信息,也可能是出錯文檔頁面)。

F-?????? 最終響應頭(除了日期和服務器標題以外的被apache添加的盡其內容傳遞信息)。

G-????? 為實際響應體保留,暫未實現(xiàn)

H-????? 審計日志索引

I-??????? C部分的替換,使用multipart/form-data編碼時,在所有的異常情形下記錄與C相同的數(shù)據,在這種情況下,會記錄假的application/x-www-form-urlencoded內容,這包含參數(shù)的相關信息,但不是這個文件的。如果你不想用文件(通常很大)來存儲你的審計日志,這是很方便的。

J-??????? 保留。實現(xiàn)后,這部分會包含文件使用multipart/form-data編碼上傳的信息。、

K-?????? 這部分包含一個完整的列表,按順序匹配(每行一個),這些規(guī)則是完全合格的,從而表明繼承默認的動作和操作,從2.5.0開始支持。

Z-最終分界,意味著是條目的最后(強制的)

?

SecAuditLogRelevantStatus REGEX

SecAuditLogRelevantStatus ^(?:5|4\d[^4])

配置哪些響應狀態(tài)碼與審計日志的目的密切相關,必須將SecAuditEngine設置為RelevantOnly,其參數(shù)是個正則表達式。

這個指令最主要的目的是允許你配置審計產生特殊HTTP響應狀態(tài)碼的唯一事務,這個指令通常用于減少審計日志文件的總體大小。記住一點,如果使用了這個參數(shù),那么返回狀態(tài)碼是200的成功攻擊事件不會記錄。

?

SecAuditStorageDir /path/to/storage/dir

SecAuditStorageDir /usr/local/apache/logs/audit

配置同時審計日志條目存儲時的路徑,必須同時設置SecAuditLogType,啟動apache潛,需要先創(chuàng)建目錄,而且必須讓服務器用戶運行時可以新建文件。

盡管有了記錄日志的機制,還需要確保指定的本地文件系統(tǒng)上有足夠的磁盤空間,并且不是在根分區(qū)上。

?

SecAuditLogType Serial|Concurrent

配置使用審計日志記錄機制的類型,如果使用Concurrent類型必須指定SecAuditLogStorageDir

Serial-所有的審計日志條目都被存儲在主審計日志記錄文件中,隨意使用是很方便,但是他很慢,因為任何時候只有一個文件被打開也只能寫入一條審計日志條目。

Concurrent-審計日志條目被存儲于不同的文件中,每個事務一個,如果你要把審計日志數(shù)據發(fā)送到遠程ModSecurity控制主機上就是用Concurrent日志模式。

?

SecCacheTransformations(Deprecated/Experimental)

SecCacheTransformations On|Off [options]

SecCacheTransformations On “minlen:64,maxlen:0”

控制transformations的緩存,2.5.6開始,緩存是默認關閉的,當時都不贊成開啟并降低為實驗性。

On-緩存變化(每階段,每次變化)允許相同的變化只執(zhí)行一次(默認的)

Off-不緩存任務變化,強制所有的變化都被每一條規(guī)則實行生效

有以下可選項(逗號分隔):

Incremental:on|off-啟用這個選項后,緩存每一個變化,而不只是最后一個變化(默認:off)

Maxitems:N-緩存N個以內的變化,超過時不再緩存,為0時表示unlimited,對于限制緩存一個使用大數(shù)字的ARGS表單這個選項是有用的(默認512)

Minlen:N-緩存變化的值的最小長度(默認32)

Maxlen:N-緩存變化的值的最大長度,為0時表示unlimited(默認:1024)

?

SeChrootDir /path/to/chroot/dirm

配置web服務器工作的安全目錄

這個功能在Windows系統(tǒng)版本上不可用,ModSecurity提供的內部chroot功能在簡單配置上工作的很好,舉個最簡單例子,apache只提供靜態(tài)頁面服務或使用模塊提供腳本運行功能。在一些復雜設置時你會遇到一些問題:

1、? DNS查詢無法工作(這是因為這一功能在chroot操作后,一經查詢就要求加載一個共享庫)

2、? 你不能使用PHP發(fā)送郵件,因為PHP使用sendmail但sendmail在安全目錄之外

3、? 某些情況下apache會莫名其妙的不干活了(重載)

你需要小心,這個內部chroot功能可能不是100%可用。由于大量默認的或是第三方為apache web服務器提供的模塊,他們不可能去校驗在內部chroot下是否可用,在沒有被限制在安全目錄中時,一個apache的模塊,工作的很正常。特別是如果你正使用的模塊在模塊初始化階段進行fork的(如mod_fastcgi,mod_fcgid,mod_cgid),建議你測試每個apache進行和觀察其工作目錄,進程根目錄,以及所打開的文件列表。考慮一下你的選擇,在作出決定。

?

SecComponentSignature “COMPONENT_NAME/X.Y.Z(COMMENT)”

SecComponentSignature “Core Rules/1.2.3”

擴展組件簽名為modsecurity簽名,這個指令可以讓ModSecurity增加很多有意義的已知組件,完整的簽名被記錄在事務審計記錄中,應該讓ModSecurity模塊和規(guī)則集作家使用,使調試更加容易。

?

SecContentInjection (on|off)

啟用內容注入使用行為附加并加在前面

SecCookieFormat 0|1

選擇當前配置文本中使用的cookie格式

0-?????? 使用version 0(Netscape)cookies,這是大部分應用使用的,也是默認值

1-?????? 使用version 1 cookies

?

SecDataDir /path/to/dir

SecDataDir /usr/local/apache/logs/data

指定連續(xù)數(shù)據(如ip地址數(shù)據,session數(shù)據等)存儲的路徑,initcol、setsid和setuid需要用到這個指令,必須讓服務器用戶對這個目錄可寫

?

SecdDebugLog /path/to/modsec-debug.log

SecDebugLog /usr/local/apache/logs/modsec-debug.log

指定modsecurity調試日志文件的路徑

Secdebugloglevel 0|1|2|3|4|5|6|7|8|9

配置冗長的調試日志數(shù)據,1~3級別一直用于產生apache的錯誤日志,因為你可以在產品中一直使用0級別作為默認的日志級別,級別5用于調試,不建議在產品中使用這么高級別的日志,過度的日志記錄會顯著服務器的性能。

可用的值如下:

0-不記錄,1-僅僅錯誤日志(攔截請求),2-警告,3-注意,4-事務控制的細節(jié),5-同上,但包含每一個信息控制的信息,9-記錄所有,包括每一個調試細節(jié)信息

?

SecDefaultAction action1,action2,action3

定義匹配規(guī)則后的默認動作,例:

SecDefaultAction log,auditlog,deny,status:403,phase:2

備注:SecDefaultAction指令后的規(guī)則都繼承這一設置,除非為某條規(guī)則制定了一個特定的動作,或者制定了新的 SecDefaultAction。特別注意到,未經處理的disruptive動作時不允許的,但是在SecDefaultAction中一不小心就會繼承了使用disruptive動作。

默認值是minimal

SecDefaultAction phase:2,log,auditlog,pass

注意:SecDefaultAction必須指定一個disruptive動作和處理階段,而且不能包含元數(shù)據動作。

警告:SecDefaultAction不集成交叉配置的內容。

?

SecGeoLookupDb /path/to/db

定義地理數(shù)據文件路徑,例:

SecGeoLookupDb /usr/local/geo/data/GeoLiteCity.dat? 從maxmind.com提取的免費數(shù)據文件

?

SecGuardianLog |/path/to/httpd-guardian

配置使用httpd-guardian腳本來監(jiān)視拒絕服務攻擊(DoS)的指令,例:

SecGuardianLog |/usr/local/apache/bin/httpd-guardian? 使用默認的httpd-guardian可以防止客戶端在1分鐘內請求120次或5分鐘內請求360次。

SecGuardianLog,設計此指令用于把所有允許數(shù)據通過管理日志功能發(fā)送到另一個程序。自從apache部署成典型的多進程方式,信息共享變得困難了,這一想法就是部署一個獨立的外部進行使用狀態(tài)機的方式去觀察所有的請求,提供額外的保護。

隨著ModSecurity發(fā)布,開發(fā)一個先進的外部保護工具將是一個重點。然而一個完整功能的工具已經可以做為apache httpd工具項目的一部分,工具名為httpd-guardian,它能用于防御DoS,使用黑名單列表(同一個項目中)和基于iptables(linux)或者基于pf(*BSD)的防火墻協(xié)同工作,動態(tài)的過濾黑名單中的惡意ip地址。也可以和SnortSam協(xié)同工作。如果已經配置過httpd-guardian,你只需要在apache配置中添加一行就可以部署他:

SecGuardianLog |/path/to/httpd-guardian

?

Secmarker ID

Secmarker 9999

在規(guī)則集中增加一個固定規(guī)則marker,可用于skipAfter動作。Secmarker指令本質上是創(chuàng)建了一條規(guī)則,這條規(guī)則什么也不做,其目的只是占用一個ID號

SecRule REQUEST_URI “^/$” \

“chain,t:none,t:urlDecode,t:lowercase,t:normalisePath,skipAfter:99”

SecRule REMOTE_ADDR “^127\.0\.0\.1$” “chain”

SecRule REQUEST_HEADERS:User-Agent \

? “^Apache \(internal dummy connection\)$” “t:none”

SecRule &REQUEST_HEADERS:Host “@eq 0” \

? “deny,log,status:400,id:08,severity:4,msg:’Missing a Host Header’”

SecRule &REQUEST_HEADERS:Accept “@eq 0” \

? “l(fā)og,deny,log,status:400,id:15,msg:’Request Missing an Accept Header’”

SecMarker 99

?

SecPcreMatchLimit

?

SecPdfProtect On|Off

啟用PDF XSS保護功能,一量啟用訪問PDF文件的跟蹤,直接訪問嘗試被轉到包含一次性令牌的鏈接,只有提供有效令牌的請被無條件允許,無效令牌的請求也被允許,但被強制下載PDF文件。本實現(xiàn)用響應頭去檢測PDF文件,因此可以對一些URI請求中不含有.pdf擴展名卻能動態(tài)生成PDF文件。

?

SecPdfProtectMethod method

SecPdfProtectMethod TokenRedirection(默認)

配置理想的保護方法用于請求的PDF文件進行保護。可有的選項有TokenRedirection和ForcedDownload。令牌重定向方式會嘗試轉到可有的令牌上,這允許PDF文件仍舊能使用內聯(lián)方式打開,但僅用于GET請求方式。強制下載總是導致PDF文件使用二進制或附件方式傳遞,后者常用于非GET請求,強制下載方式被認為更安全,但對用戶來說可能會導致可用性問題(“這個PDF無法再打開了”)。

?

SecPdfProtectSecret secret

secPdfProtectSecret MyRandomSecretString

定義用戶產生一次性令牌的密鑰,你應該設置一個足夠長的串作為密鑰(16字符較好),一旦定下密鑰,最好不要修改,可能會破壞修改前發(fā)出的令牌。但即使你修改了也不是大問題,導致過去的幾秒鐘變成使用令牌強制下載PDF文件。

?

SecPdfProtectTimeout timeout

SecPdfProtectTimeout 10(默認)

定義令牌超時,令牌過期后,不能再用于允許訪問PDF文件,請求仍舊被允許,但PDF文件會以附件方式傳送。

?

SecPdfProtectTokenName name

SecPdfProtectTokenName PDFTOKEN(默認)

定義令牌名,你想改變令牌的名字的唯一原因應是你想隱藏你正使用ModSecurity這一事實,這是一個好的理由,但這并不是提供幫助,因為敵人能找到保護PDF的算法并能計算出來,這樹立了新的標志,所以如果你想就去試吧。

?

SecRequestBodyAccess On|Off

ModSecurity是否默認緩存并處理請求體,On-訪問請求體,Off-不訪問請求體。

注意:當你想檢查POST_PAYLOAD時使用這個命令,這個指令必須和“phase:2”和REQUEST_BODY一起使用,這三部分任一一個沒有配置,你就無法檢查請求體。

?

SecRequestBodyLimit NUMBER_IN_BYTES

SecRequestBodyLimit 134217728

配置ModSecurity允許的最大請求體的緩存區(qū)大小,默認值是131072KB(134217728bytes)。任何超過此限制的都會被拒絕,提示413,請求體太大。還有一個應限制,1GB。

?

SecRequestBodyNoFilesLimit NUMBER_IN_BYTES

配置ModSecurity允許的最大請求體的緩存區(qū)大小,除了請求中正在傳送的文件大小。這項指令便于在受到某些使用大尺寸請求進行DoS攻擊時減少影響。提供上傳文件服務的WEB應用必須配置SecRequestBodyLimit為一個很大的值。由于大文件直接進行磁盤文件存取,不會加大內存的消耗。但是,仍然有可能有人利用超大請求體限制和發(fā)送大量大小的非上傳請求。該指令消除這一漏洞。

SecRequestBodyLImit 131072

備注:默認為1MB(1048576 bytes)。這個值比較古老了,大部分應用應該到128KB或者更低,任何超過此限制的都會被拒絕,提示413,請求體太大。還有一個應限制,1GB

?

SecRequestBodyInMemoryLimit NUMBER_IN_BYTES

SecRequestBodyInMemoryLimit 131072

配置ModSecurity使用內存保存的最大請求體大小,默認的限制是128KB,在內存中最多存儲128KB。

?

SecResponseBodyLimit NUMBER_IN_BYTES

SecResponseBodyLimit 524228

配置允許緩存的最大相應體大小,任何超過此限制的響應都會被拒絕,并出現(xiàn)狀態(tài)碼:500:內部服務器錯誤。這一設置不影響使用MIME類型的響應,緩存不為此做標記(因為這個類型標記為非緩存),有一個硬編碼為1GB。

默認配置成512KB

?

SecResponseBodyLimitAction Reject|ProcessPartial

Reject 響應體將被丟棄,傳輸中斷,返回狀態(tài)碼:500(內部服務器錯誤)

ProcessPartial 只檢測緩存中的響應,剩下的允許通過

配置SecResponseBodyLimit控制碰到響應體限制的情況,默認時ModSecurity拒絕超過指定長度的響應體,然而一些WEB站點,因為有較大的響應體,所以要指定一個合理的限制很困難。這類網站不得不提升限制,來達到控制首位限制的目的(控制內存消耗)。當達到一個限制,網站管理員有能力選擇只檢查響應的第一部分,這部分在限制的范圍內,剩下的允許通過。有些爭辯說,響應的一部分未經檢查,就允許通過,是個漏洞,理論上這是對的,但僅適用于攻擊者控制輸出的情況(如可以使輸出任意長)。在這種情況下,防止漏洞是不可能的。攻擊者在數(shù)據發(fā)送回來之前可以壓縮,打亂或者加密數(shù)據,使數(shù)據可以穿越任意監(jiān)控設備。

?

SecResponseBodyMImeType mime/type

SecResponseBodyMImeType text/plain text/html

為響應數(shù)據緩存配置推薦的MIME類型。可以使用多個SecResponseBodyMimeType指令來增加MIME類型。默認值是text/plain text/html

?

SecResponseBodyMimeTypesClear

清除推薦的響應體緩存MIME類型,允許你重新開始配置。

?

SecResponseBodyAccess On|Off

配置響應體是否被緩存并被分析。如果你計劃檢查HTML的響應,需要使用這個指令。;這個指令必須和”Phase:4”處理階段動作和REQUEST_BODY變量/位置一起使用,這三部分任意一個沒有配置,你就無法檢查請求體。可選值如下:

On-訪問響應體(僅支持使用MIME類型)

Off-不嘗試訪問響應體

?

SecRule VARIABLES OPERATOR [ACTIONS]

SecRule是ModSecurity主要的指令,用于分析數(shù)據,并根據結果執(zhí)行動作。

例子:SecRule REQUEST_URI ”attack” \

”phase:1,t:none,t:urlDecode,t:lowercase,t:normalisePath”

?

OPERATOR描述如何進行檢查

ACTIONS描述當一個操作符成功匹配一個變量時將執(zhí)行怎樣一個動作。

VARIABLES描述哪些變量被檢查,舉個例子,下述規(guī)則則是當?shù)刂窓诶镉小癲irty”這個單詞時會拒絕交互。

SecRule ARGS dirty

?

每條規(guī)則可以指定一個或多個變量:

SecRule ARGS|REQUEST_HEADERS:User-Agent dirty

還有第三種格式的選擇符 –Xpath表達式的支持。Xpath表達式只能用來對付特殊的XML變量,只有請求體使用XML格式時可用:

SecRule XML:/xPath/Expression dirty

注意:不是所有的集合都支持所有的操作符格式,你需要查閱各個集合的文檔檢查是否支持。

?

集合Collections

一個變量可以包含一個或多個數(shù)據塊,這取決于該變量的性質和它的使用方式。當一個變量包含一個以上的值,我們稱它為一個集合。

集合在規(guī)則運行前都是可以擴展的。如:

SecRule ARGS dirty

可以進行如下擴展:

SecRule ARGS:p dirty

SecRule ARGS:q dirty

在一個請求中只有兩個參數(shù),分別為p和q。

集合有幾種特性:

只讀:

在運行時用交互數(shù)據創(chuàng)建,如ARGS(包含所有請求參數(shù)值列表)和REQUEST_HEADERS(包含所有請求頭值的列表)。

瞬態(tài)讀/寫:

每個交互都創(chuàng)建一個空的TX集合,規(guī)則可以從中讀取并且可以寫入(如使用setvar動作),但在此集合中存儲的信息并不持續(xù)至交互結束。

連續(xù)的讀/寫:

有幾個集合能被寫入并且持久存儲。這些集合可在交互中跟蹤客戶,例如IP、SESSION和USER等類型的集合。

規(guī)則里的操作符:

最簡單的請況是用一個正則表達式作為規(guī)則的第二個參數(shù),我們已經在上面舉過這樣的例子,如果你這樣做,ModSecurity就假定你要使用rx(正則表達式)操作符,你也可以很明確的通過使用@來指定你想要的操作符,緊跟@之后的是操作符的名字,在規(guī)則第二個參數(shù)的開頭。例如:

SecRule ARGS “@rx dirty”

注意我們?yōu)槭裁幢仨毷褂秒p引號把第二個規(guī)則參數(shù)括起來呢,這是因為第二個參數(shù)里面包含空格。一些帶空格字符和數(shù)字會跟在操作符名字后面,如果出現(xiàn)非空格的字符,他們將被視為一個特殊的參數(shù)作為操作符。這種情況下制定的參數(shù)中的正則表達式被作為模式進行匹配。

如果你使用取非操作符取反操作符返回的結果,可以讓@處于第二個字符。

SecRule &ARGS “!@rx ^0$”

?

取非操作符:

操作符的結果可以通過在第二個字符前使用感嘆號來取反,下述規(guī)則匹配在User-Agent請求頭中找不到dirty單詞:

SecRule REQUEST_HEADERS:User-Agent !dirty

你能用感嘆號與任一個參數(shù)聯(lián)合使用,這樣做,感嘆號優(yōu)先,后面跟上明確的操作符說明,下述規(guī)則與前面的例子有相同的效果。

SecRule REQUEST_HEADERS:User-Agent “!@rx dirty”

如果你在多個變量中使用取非操作符,者可呢過無法立即清楚將會發(fā)生什么情況,考慮下述例子:

SecRule ARGS:P|ARGS:Q !dirty

這個規(guī)則與下面意思相同

SecRule ARGS:p !dirty

SecRule ARGS:q !dirty

警告:取非針對單個操作符,而不是針對整個變量列表。

規(guī)則中的動作:第三個參數(shù),ACTIONS可以忽略,因為有個輔助功能,即他可以在默認的動作清單中指定。如果這個參數(shù)沒有被忽略,當規(guī)則匹配時,這個參數(shù)指定的動作會聯(lián)合默認的動作列表創(chuàng)建一個實際的動作列表被執(zhí)行。

?

SecRuleInheritance On|Off

配置當前環(huán)境是否繼承父節(jié)點環(huán)境(大部分情況下都配置成可繼承,你應當查一下文檔的每一個指令,已明確他繼承與否),On從父環(huán)境下繼承規(guī)則,Off-不從父環(huán)境下繼承規(guī)則。

指定資源的環(huán)境(如:Location,Directory,等)不能覆蓋主服務器或虛擬服務器上配置的phase1規(guī)則。這是因為phase1在請求處理進程之前運行,早于apache分發(fā)請求的資源,虛擬服務環(huán)境可以覆蓋主服務器配置的phase1規(guī)則。

例如:下面的例子顯示了在主apache配置范圍的哪個地方啟用ModSecurity,不過,你可以為你的虛擬主機做不同的配置。第一個例子中,頭一個虛擬主機沒有繼承ModSecurity的主配置指令,而第二個做到了。

SecRuleEngine On

SecDefaultAction log,pass,phase:2

<VirtualHost *:80>

SerberName app1.com

ServerAlias www.app1.com

SecRuleInheritance Off

SecDefaultAction log,deny,phase:1,redirect:http://www.site2.com

</VirtualHost>

<VirtualHost *:80>

ServerName app2.com

ServerAlias www.app2.com

SecRuleInheritance On SecRule ARGS “attack”

</VirtualHost>

注意:Configuration Sections是apache的一個概念,指令<Directory>,<Files>,<Location>和<VirtualHost>都是用于創(chuàng)建Configuration Sections的,更多的信息請看apache的文檔部分中的Configuration Sections

?

SecRuleEngine On|Off|DetectionOnly

配置規(guī)則引擎,On-處理規(guī)則,Off-不處理規(guī)則,DetectionOnly-處理規(guī)則但不中斷交互,即使規(guī)則這樣配置了也不去執(zhí)行。這個指令針對每一條規(guī)則處理也可以通過ctl動作進行控制(ctl:ruleEngine=off)

?

SecRuleRemoveById RULEID ACTIONLIST

SecRuleRemoveById 1 2 “9000-9010”

SecRuleRemoveById 1 2 5 10-20 “400-556” 673

使用ID方式從上級環(huán)境中刪除規(guī)則,這個指令支持多個參數(shù),每個參數(shù)可以使一個規(guī)則ID,也可以是范圍。帶有空格的參數(shù)必須使用雙引號括起來。

?

SecRuleRemoveByMsg REGEX

SecRuleRemoveByMsg “FAIL”

使用規(guī)則方式從上級環(huán)境中刪除規(guī)則,這個指令支持多個參數(shù),每個指令是一個應用于消息的正則表達式(指定使用的消息動作)

?

SecRuleScript(試驗性的)

SecRuleScript /path/to/script.lua [ACTIONS]

SecRuleScript ”/path/to/file.lua” “block”

這個指令創(chuàng)建一個特殊的規(guī)則,執(zhí)行l(wèi)ua腳本來決定是否匹配,和SecRule主要的不同是這個沒有目的也沒有操作符,這個腳本可以從ModSecurity環(huán)境中取到所有的變量,并使用(Lua)操作符來進行測試,第二個參數(shù)可選,與SecRule相同,是一個動作列表。

注意:所有的 Lua腳本在配置時進行編譯并存入內存,要重載腳本,你必須通過apache重啟來重載整個ModSecurity配置。

示例腳本:

---------------Your script must define the main entry

---------------pointl,as below.

Function main()

?? ----------Log something at level 1.Normally you shouldn’t be

?? ----------logging anything,especially not at level 1,but this is

?? ----------jusy to show you can.Useful for debugging.

m.log(1,”Hello world!”);

--------------Retrieve one variable.

Local var1 = m.getvar(“REMOTE_ADDR”);

--------------Retrieve one variable,applying one transformation function.

--------------The second parameter is a string.

Local var2 = m.getvar(“ARGS”,”lowercase”);

--------------Retrieve one variable,applying several transformation functions.

--------------The second parameter is now a list.You should note that m.getvar()

--------------requires the use of comma to separate collection names from

--------------variable names.This is because only one variable is returned.

Local var3 = m.getvar(“ARGS.P”,{“l(fā)owercase”,”compressWhitespace”});

-------------If you want this rule to match return a string

-------------containing the error message.The message must contain the name

-------------of the variable where the problem is located.

-------------return “Variable ARGS:p looks suspicious!”

-------------Otherwise,simply return nil.

Return nil;

End

第一個例子,我僅每次提取一個變量,這種情況下,你需要事先知道變量,然而很多時候,你想檢查一些事先不知道的變量名字,就像下面這個例子。

Example showing use of m.getvars() to retrieve many variables at noce:

Function main()

???????? Retrieve script parameters.

Local d = m.getvars(“ARGS”,{“l(fā)owercase”,htmlEntityDecode”});

???????? Loop through the parameters.

For I = 1,#d do

???????? Examine parameter value.

If(string.find(d[i].value,”<script”))then

???????? Always specify the name of the variable where the

???????? Problem is located in the error message.

Return(“Suspected XSS in variable”? d[i].name..”.”);

End

End

???????? Nothing wrong found.

Return nil;

End

注意:Lua支持被標示試驗方式的編程接口可以繼續(xù)發(fā)展,同時我們努力讓其最佳方式運行

?

SecRuleUpdateActionById RULEID ACTIONLIST

SecRuleUpdateActionById 12345 deny,status:403

按ID方式更新指定規(guī)則的動作列表,本指令合并指定的動作列表和規(guī)則的動作列表,存在兩個限制,一是規(guī)則ID不能被改變,也不能換階段。另外還需要注意的是動作可以duo8ci被附加到原來的。

SecAction\

“t:lowercase,phase:2,id:12345,pass,msg:’The Message’,log,auditlog”

SecRuleUpdateActionById 12345

“t:compressWhitespace,deny,status:403,msg:’A new message’”

The example above will cause the rule to be executed as if it was speciafied as follows:

SecAction\

“t:lowercase,phase:2,id:12345,log,auditlog,t:compressWhitespace,deny,status:403,msg:’A new message’”

?

SecServerSignature “WEB SERVER SOFTWARE”

SecServerSignature “Netscape-Enterprise/6.0”

通知ModSecurity改變響應頭令牌數(shù)據中當前使用的“Server:”,按指令的先后順序執(zhí)行,你必須完整的配置apache ServerTokens指令。通過該指令,ModSecurity會改寫服務器簽名數(shù)據并存入內存空間的數(shù)據集中。如果ServerTokens沒有完整設置,那么內存空間就沒有希望的足夠大來存入我們看到的新數(shù)據。

?

SecTmpDir /path/to/dir

SecTmpDir /tmp

配置臨時文件創(chuàng)建的路徑,需要提供apache用戶進程的可寫權限,這個目錄的位置也是當apache檢查數(shù)據用完內存時(比SecRequestBodyInMemoryLimit指令指定的還多的數(shù)據)會將數(shù)據交換到磁盤上的位置。

?

SecUploadDir /path/to/dir

SecUploadDir /tmp

配置攔截文件存儲的目錄,這個目錄必須和SecTmpDir定義的臨時目錄在同一個文件系統(tǒng)上,(This directory must be on the same filesystem as the temporary directory defiled with SecTmpDir.This directive is used with SecUploadKeepFiles.)

?

SecUploadFileMode octal_mode|”default”

SecUploadFileMode 0640

用8進制(和chmod一樣)配置所有上傳文件的模式(權限),這個功能在不支持8進制文件的操作系統(tǒng)上不可用。默認模式(0600)僅允許有讀寫許可的賬號修改這個文件,如果其他賬號也需要訪問(使用clamd是個好例子),那么這個指令時必須的。不管怎樣,要慎用這個指令,避免將敏感數(shù)據顯露給未授權用戶,使用“default”值時,還原默認設置。

?

SecUploadKeepFiles On|Off|RelevantOnly

配置是否保存事務處理后的攔截文件,該指令要求已經定義存儲目錄(使用SecUploadDir),On-保存上載文件,Off-不保存上載文件,RelevantOnly-只保存被確認與請求有關的文件

?

SecWebAppId “NAME”

SecWebAppId “WebApp1”

創(chuàng)建服務器上的一個分區(qū)只屬于一個WEB應用,通過使用分區(qū)來避免會話ID和用戶UD之間的沖突,在同一臺服務器上部署多個應用時一定要使用這個命令,如果不使用,會話ID之間的沖突可能發(fā)生,默認值是default

<VirtualHost *:80>

ServerName app1.com

ServerAlias www.app1.com

SecWebappId “App1”

SecRule REQUEST_COOKIES:PHPSESSID !^$ chain,nolog,pass

SecAction setsid:%{REQUEST_COOKIES.PHPSESSID}

</VirtualHost>

<VirtualHost *:80>

ServerName app2.com

ServerAlias www.app2.com

SecWebAppId “App2”

SecRule REQUEST_COOKIES:PHPSESSID !^$ chain,nolog,pass

SecAction setsid:%{REQUEST_COOKIES.PHPSESSID}

</VirtualHost>

配置顯示了兩個例子,SecWebAppId與apache的VirtualHost指令協(xié)同工作,在一臺服務器上應創(chuàng)建各自獨特的集合名稱,一般情況下,當啟用setsid時,ModSecurity會使用”SESSION”的值來創(chuàng)建集合,這可以保存專用值,然而像上述例子一樣使用SecWebAppId,集合的名字會變成”App1_SESSION”和”App2_SESSION”。

SecWebAppId相關的兩個情況:

1、你正把事務(transactions)和報警記錄到ModSecurity Console(控制臺)上,并且你想用WEB應用ID來搜索僅屬于那些應用的事務。

2、你正使用數(shù)據留存設施(SESSION和USER集合)并且你需要在屬于不同的應用之間的會話和用戶之間避免沖突。

?

?

?

?

處理階段:

ModSecurity 2.x允許把規(guī)則至于下述五個階段之一:

請求頭(REQUEST_HEADERS)

請求體(REQUEST_BODY)

響應頭(RESPONSE_HEADERS)

響應體(RESPONSE_BODY)

記錄(LOGGING)

為了在規(guī)則執(zhí)行時選擇階段,需要使用階段命令,可以通過規(guī)則中直接使用,也可以通過SecDefaultAction指令。

SecDefaultAction “l(fā)og,pass,phase:2”

SecRule REQUEST_HEADER:Host “!^$””deny,phase:1”

注意:要注意規(guī)則的執(zhí)行時依賴于階段,即使是一個配置文件中的兩條鄰近的規(guī)則,只要是設置了在不同的階段中執(zhí)行,他們就不會是一個接一個的生效。配置文件中的規(guī)則順序僅僅是在規(guī)則各自的階段中是重要的。在使用Skip和SkipAfter動作時尤為重要。

注意:LOGGING階段比較特別,無論前面的各個階段發(fā)生了什么事,都會每個事務的最后被執(zhí)行。這就意味著哪怕是請求被中斷或是放行事務時都會被執(zhí)行。

請求頭階段:

這個階段的規(guī)則會在apache完成請求頭的讀取后立即被執(zhí)行(post-read-request階段),這時,還沒有讀取請求體,意味著不是所有的參數(shù)都可用。如果你必須讓規(guī)則盡早運行,應把規(guī)則放在這個階段(在apache使用這個請求做某些事前),在請求體被讀取前做些事情,從而決定是否緩存這個請求體,或者決定你將希望這個請求體如何被處理(如是否以XML格式解析或不解析)。

注意這個階段的規(guī)則無法影響apache的范圍指令(Directory,Location,LocationMatch等)像post-read-request鉤子一樣還無法得到信息。VirtualHost指令有些例外,如果想在apache的locations使用ModSecurity規(guī)則,那么他們應該運行在階段2,參考apache請求環(huán)/ModSecurity處理階段圖標。

請求體階段:

這是通用輸入分析階段,大部分傳統(tǒng)的應用規(guī)則不在這兒,這個階段你肯定能收到參數(shù)(只有讀取過請求體后),在請求體階段,ModSecurity支持三種編碼類型。

Application/x-www-form-urlencoded – used to transfer from data

Multipart/from-data – used for file transfers

Text/xml – used for passing XML data

大部分WEB應用還沒有使用其他的編碼方法。

響應頭階段:

發(fā)生在響應頭被發(fā)送到客戶端之前,如果你想觀察響應發(fā)生前就在這兒運行,如果你想使用響應頭來決定你是否想緩存響應體也行。注意一些響應狀態(tài)碼(如404)在請求環(huán)的早期就被apache管理著,我也無法觸發(fā)預期。加上apache在后面的鉤子上雙增加了一些響應頭(如日期、服務器和連接信息等),這些我們無法觸發(fā)和審查。在代理配置模式下或使用phase:5(logging)工作的較好。

響應體階段:

這是通用輸出分析階段,這里你能運行規(guī)則截斷響應體(當然提供緩存)。這個階段你想檢查輸出的HTML信息公布、錯誤信息和失敗的驗證文字。

日志階段:

在日志發(fā)生前運行的一個階段,放在這個階段的規(guī)則只能影響日志記錄器如何執(zhí)行,這個階段可以檢測apache記錄的錯誤信息,在這個階段你不能拒絕或阻斷連接,因為太遲了,這個階段也允許檢測其他的響應頭,如那在phase:3或者phase:4階段中不可用的。注意在這個階段,你應當小心不要繼承破壞性的動作到規(guī)則中,這樣的情況在ModSecurity2.5.0及其以后的版本中被當做配置錯誤。

?

?

Variables變量

Modsecurity2.x支持的變量:

ARGS

是一個集合,可以作為靜態(tài)參數(shù)(以名稱為匹配論點)方式或以正則表達式(以正則表達式匹配的所有匹配的論點名稱)方式用于它自身(意思為POST負載中的所有論點)

一些變量是事實上的集合,在運行時可以擴展更多的變量

SecRule args dirty??? 測試所有的請求論點

SecRule ARGS:p dirty?? 有些時候只想看看集合的一部分,這個例子是通過selection操作(colon)查看名為P的變量(注意:通常行情況下,請求可以包含多個同名的變量)

ScRule ARGS|!ARGS:z dirty???? 指定排除方式,將仔細檢查所有的請求參數(shù)是否有單詞dirty,除了名字為z的參數(shù)(再則,z參數(shù)可以為0個,也可以為多個)

SecRule &ARGS !^0$?? 統(tǒng)計一個集合中有多少個變量,如果一個請求中使用了0個以上的參數(shù),下面的規(guī)則就會有效果(暫時忽視了第二個參數(shù))

SecRule ARGS:/^id_/ dirty??? 有些時候你需要查看一個參數(shù)數(shù)組,每個名字只有稍微不同,這種情況下,你可以為集合操作符自己制定一個正則表達式,這個規(guī)則就是查閱所有以id_打頭的參數(shù)名字。

注意:如果參數(shù)p不存在,則使用ARGS:p不會對操作符調用起到任何作用。

?

ARGS_COMBINED_SIZE

此變量相比apache的LimitRequest指令允許你更有針對性的設置Arguments 的總大小,如你可以創(chuàng)建一條規(guī)則確保參數(shù)數(shù)據的大小小于一個特定的閥值(幫助防止緩存溢出問題)例如:如果參數(shù)的大小超過25個字符就阻斷他。

SecRule REQUEST_FILENAME “^/cgi-bin/login\.php”\

”chain,log,deny,phase:2,t:none,t:lowercase,t:normalisePath”

SecRule ARGS_COMBINED_SIZE “@gt 25”

?

ARGS_NAMES

是參數(shù)名的集合,你可以搜索你想阻斷的特定的參數(shù)名,在一個積極策略情況下,你也可以僅僅使用白名單(使用!可以反轉規(guī)則)來審計參數(shù)名。例:下例規(guī)則僅允許規(guī)則名為p和a的兩個參數(shù),如果有其他參數(shù)名字在其中,就會被阻斷。

SecRule REQUEST_FILENAME “/index.php”\

”chain,log,deny,status:403,phase:2,t:none,t:lowercase,t:normalisePath”

SecRule ARGS_NAMES “!^(p|a)$” “t:none,t:lowercase”

?

ARGS_GET

類似于ARGS,但僅針對于查詢字符串中包含的參數(shù)

?

ARGS_GET_NAMES

類似于ARGS_NAMES,但僅針對于查詢字符串中包含的參數(shù)

?

ARGS_POST

類似于ARGS,,但僅針對于POST字符串中包含的參數(shù)

?

ARGS_POST_NAMES

類似于ARGS_NAMES,但僅針對于POST字符串中包含的參數(shù)

?

AUTH_TYPE

這個變量保存認證方法用于驗證一個用戶,注意:這個數(shù)據在使用非本地認證的代理模式部署時不可用,在代理模式部署下,你需要檢查REQUEST_HEADERS認證頭

?

ENV

是個集合,規(guī)則一個單獨的參數(shù)(在colon后),ENV變量通過setenv設置,不提供CGI環(huán)境變量的訪問,例如:

SecRule REQUEST_FILENAME “printenv” pass,setenv:tag=suspicious

SecRule ENV:tag “suspicious”

?

FILES

是個集合,包含一系列的初始文件名(就如同在遠程用戶的文件系統(tǒng)上命名的一樣),注意:只有從請求體中提取的文件才是有用的,例:

SecRule FILES ”\.conf$” log,deny,status:403,phase:2

?

FILES_COMBINED_SIZE

單一值,所有上傳文件大小的總和,注意:只有從請求體中提取的文件才是有用的,例:

SecRule FILES_COMBINED_SIZE “@gt 1000”log,deny,status:403,phase:2

?

FILES_NAMES?

W/O參數(shù)集合,包含用于文件上傳的表單字段列表,注意:只有從請求體中提取的文件才是有用的,例:

SecRule FILES_NAMES “^upfile$” log,deny,status:403,phase:2

?

FILES_SIZES?

集合,包含文件尺寸的列表,用于實施單獨文件上傳的大小限制。注意:只有從請求體中提取的文件才是有用的,例:

SecRule FILES_SIZES “@gt 100”log,deny,status:403,phase:2

?

FIELS_TMPNAMES???

集合,包含磁盤上臨時文件名的集合,和@inspecFile一起使用,注意:只有從請求體中提取的文件才是有用的,例:

SecRule FILES_TMPNAMES “@inspectFile /path/to/inspect_script.pl”

?

GEO

是和@geoLookups操作符一起使用的集合,可以用于匹配地理位置字段進行IP或主機名字的查詢,2.2.0以后版本可用

字段:

COUNTRY_CODE:兩個字符的國家代號,如:US、UK等

COUNTRY_CODE3:升級為3個字符的國家代號

COUNTRY_NAME:完整的國家名

COUNTRY_CONTINENT:兩個字符的國家所在洲的代號,如EU

REGION:兩個字符表示的區(qū)域,對美國來說是州,對加拿大來說是省,等等

CITY:城市名

POSTAL_CODE:郵政編碼

LATITUDE:緯度

LONGITUDE:經度

DMA_CODE:中心城區(qū)代碼(僅指美國)

AREA_CODE:電話區(qū)號(僅指美國)

例如:

SecRule REMOTE_ADDR “@geoLookup” “chain,drop,msg:’Non-UK IP address’”

SecRule GEO: COUNTRY_CODE “!@streq UK”

?

HIGHEST_SEVERITY 這個變量是迄今為止所有規(guī)則匹配時最為嚴格的,Severities是個數(shù)值,和比較操作符一起,如@It等

注意:更高的severities,其數(shù)值越小,255表示沒有設置severitySecRule

HIGHEST_SEVERITY “@le 2” “phase:2,deny,status:500,msg:’severity

%{HIGHEST_SEVERITY}’”

?

id

說明:對規(guī)則指定一個唯一的ID或鏈。

動作組:元數(shù)據

例如:

SecRule &REQUEST_HEADERS:Host "@eq 0" \??? "log,id:60008,severity:2,msg:'Request Missing a Host Header'"

注意

這些是保留的范圍:

1-99,999;本地(內部)保留,使用你認為合適的但是不要在規(guī)則里使用這個范圍的因為他們已經分配給其他。

100,000-199,999;,引擎內部保留使用,分配給沒有明確標識的規(guī)則。

200,000-299,999;modsecurity.org規(guī)則保留。

300,000-399,999;gotroot.com規(guī)則保留。

400,000-419,999;未使用(可預約)。

420,000-429,999;為ScallyWhack保留。

430,000-699,999;未使用(可預約)。

700,000-799,999;為伊萬里斯蒂奇保留。

900,000-999,999;為核心規(guī)則項目保留。

1000000及以上;未使用(可預約)。

?

initcol

說明:初始化一個持久的集合,從存儲里導入數(shù)據或在內存中創(chuàng)建一個新的集合。

動作組:非中斷性

例如:下面的例子啟動IP地址跟蹤。

SecAction phase:1,initcol:ip=%{REMOTE_ADDR},nolog

注意:通常你想在第一階段和initcol一起使用以便這個集合在所有階段都可用。

集合在initcol動作開始被加載進內存。這個集合在存儲里將是持續(xù)的(并且相應的計數(shù)器增加)除非它在交互過程中改變了。請參考” Persistant Storage”以獲取得多內容。

?

REQUEST_COOKIES

這個變量是一個所有cookie數(shù)據的集合。例如:下面的例子使用Ampersand(符號&)特殊運算符計算集合中變量的個數(shù)。如果請求不包括任何Cookie頭的話,規(guī)則將會啟動。

SecRule &REQUEST_COOKIES “@eq 0”

?

REQUEST_COOKIES_NAMES

這個變量是一個請求頭中cookie名字的集合。例如:如果沒有JSESSIONID cookie的話,下面的規(guī)則將會啟動。

SecRule &REQUEST_COOKIES_NAMES:JSESSIONID “@eq 0”

?

REQUEST_FILENAME

這個變量包含去掉QUERY_STRING那一部分之后的相對REQUEST_URI(例如/index.php)

SecRule REQUEST_FILENAME “^/cgi-bin/login\.php$” phase:2,t:none,t:normalizePath

注意:anti-evasion交互并不默認在REQUEST_FILENAME上使用。

?

RESPONSE_HEADERS

這個變量和REQUEST_HEADERS變量相似,可以在同樣的manner(方法)中使用,例如:

SecRule RESPONSE_HEADERS:X-Cache “MISS”

注意:這個變量不能訪問嵌入式模式中的一些頭。在Apache鉤子里面加上了像Server,Data,Connection和Content-Type這些頭,然后向客戶端發(fā)送數(shù)據。無論是在ModSecurity phase:5還是運行在代理模式下,這些數(shù)據都應該是可訪問的。

?

RESPONSE_HEADERS_NAMES

這個變量是一個響應頭名字集合。例如:

SecRule RESPONSE_HEADERS_NAMES “Set-Cookie”

注意:和RESPONSE_HEADERS一樣,不能訪問嵌入式模式中的一些頭。

?

SESSION

這個變量是一個集合,setsid執(zhí)行完之后才能訪問它。例如:下面的例子說明了怎么用setsid初始化一個SESSION集合,怎么使用setvar增加session.score的值,怎么設置session.blocked的值,最后怎么拒絕基于session.blocked的值的集合。

SecRule REQUEST_COOKIES:PHPSESSID !^$ chain,nolog,pass

SecAction setsid:%{REQUEST_COOKIES.PHPSESSID}

SecRule REQUEST_URI “^/cgi-bin/finger$” \

“phase:2,t:none,t:lowercase,t:normalizePath,pass,log,setvar:session.score=+10”

SecRule SESSION:SCORE “@gt 50” “pass,log,setvar:session.blocked=q1”

SecRule SESSION:BLOCKED “@eq 1” “l(fā)og,deny,status:403”

?

SESSIONID

這個變量使用setsid設置的一個值,例如:

SecRule SESSION !^$ chain,nolog,pass

SecRule REQUEST_COOKIES:PHPSESSID !^$

SecAction setsid:%{REQUEST_COOKIES.PHPSESSID}

?

TIME

這個變量含有一個表示時間的格式化字符串(時:分:秒),例如:

SecRule TIME “^(([1](8|9))|([2](0|1|2|3))):\d{2}:\d{2}$”

?

?

TX

交互集合。用來儲存數(shù)據塊,創(chuàng)建交互異常計算等。交互變量用來設置1號請求/響應循環(huán)。計算和賦值將不會持續(xù)到越過當前請求/響應處理過程。例如:在這個例子中,使用setvar使tx.score增加5個點。緊接著計算這次請求的交互分數(shù),并決定是否去允許/拒絕請求通過。

下面是TX集合的保留名稱:

TX:0----捕捉動作中使用@rx或者@pm操作符時的匹配值

TX:1-9-------捕捉括號和捕捉動作中使用@rx操作符時的捕捉子表達式的值。

SecRule WEBSERVER_ERROR_LOG “does not exist” “phase:5,pass,setvar:tx.score=+5”

SecRule TX:SCORE “@gt 20” deny,log

?

XML

可獨立使用(作為validateDTD和validateSchema的目標),也可和XPath表達式參數(shù)(這可以使他對任何可接受純文本的函數(shù)來說都是有效目標)一起使用。

DecDefaultAction log,deny,status:403,phase:2

SecRule REQUEST_HEADERS:Content-Type ^text/xml$ \

Phase:1,t:lowercase,nolog,pass,ctl:requestBodyProcessor=XML

SecRule REQBODY_PROCESSOR “|^xml$” skipAfter:12345

SecRule XML:|employees/employee/name/text() Fred

SecRule XML:|xp:employees/employee/name/text() Fred \

Id:12345,xmlns:xp=http://www.example.com/employees

第一個XPath表達式不使用命名空間。他將和類似如下的載荷進行匹配:

<employees>

??? <employee>

??????? <name>Fred Jones</name>

??????? <address location=”home”>

??????????? <street>900 Aurora Ave.</street>

??????????? <city>Seattle</city>

??????????? <state>WA</state>

??????????? <zip>98115</zip>

??????? </address>

??????? <address location=”work”>

??????????? <street>2011 152nd Avenue NE</street>

??????????? <city>Redmond</city>

??????????? <state>WA<state>

??????????? <zip>98052</zip>

</address>

??????? <phone location=”work”>(425)555-5665</phone>

??????? <phone location=”home”>(206)555-5555</phone>

??????? <phone location=”mobile”>(206)555-4321</phone>

</employee>

</employees>

第二個XPath表達式使用命名空間。它將匹配以下負載:

<xq:employees xmlns:xp=”http://www.example.com/employees”>

<employee>

??? <name>Fred Jones</name>

??? <address location=”home”>

??????? <street>900 Aurora Ave.</street>

??????? <city>Seattle</city>

??????? <state>WA</state>

??????? <zip>98115</zip>

??? </address>

??? <address location=”work”>

??????? <street>2011 152nd Avenue NE</street>

??????? <city>Redmond</city>

??????? <state>WA</state>

??????? <zip>98052</zip>

??? </address>

??? <phone location=”work”>(425)555-5665</phone>

??? <phone location=”home”>(206)555-5555</phone>

??? <phone location=”mobile”>(206)555-4321</phone>

</employee>

</xp:employees

注意第二個例子中的命名空間

?

?

?

?

?

?

?

?

?

Transformation functions轉換函數(shù)(應用,功能):

當ModSecurity接收到請求或者響應消息,它將把這個消息數(shù)據復制到內存當中做備份。交互函數(shù)就應用于這個數(shù)據。原始請求/響應數(shù)據不會被修改。一個變量要先使用交互函數(shù)轉換之后,才能在規(guī)則中進行測試。

注意:ModSecurity之前的版本并沒有默認交互函數(shù)。

下面的規(guī)則將防止攻擊者不使用混合大小寫(mixed case)來逃避ModSecurity的規(guī)則。

SecRule ARGS:p “xp_cmdshell” “t:lowercase”

?

同一條規(guī)則中可以使用多重交互動作,比如下面的規(guī)則也能保證攻擊者不使用URL編碼(%xx編碼)逃避規(guī)則。注意交互函數(shù)的命令能保證一個URL編碼信件是第一次編碼,而不是轉換成小寫。

SecRule ARGS:p “xp_cmdshell” “t:urlDecode,t:lowercase”

?

可以使用SecDefaultAction命令來為每條規(guī)則保證轉換發(fā)生,直到下一條規(guī)則。注意交互動作時附加(additive)的,所以如果一條規(guī)則明確的列出動作,SecDefaultAction中的轉換動作仍然執(zhí)行。

SecDefaultAction t:urlDecode,t:lowercase

?

下面是被支持的轉換函數(shù):

HtmlEntityDecode

對輸入的HTML實體進行解碼。支持以下變型:

&#xHH and &#xHH;(H是十六進制)

&#DDD and &#DDD;(D是十進制)

&quot and &quot;

&nbsp and &nbsp;

&lt and &lt;

&gt and &gt;

這個函數(shù)可以把任何實體轉換成一個簡單的字節(jié),可能會導致信息丟失。有利于發(fā)現(xiàn)本來不需要編碼的字節(jié)。這個函數(shù)不能處理255以上的字符。

?

lowercase

這個函數(shù)使用current C locale把所有字符轉換成小寫。

?

none

不是一個轉換函數(shù),命令ModSecurity刪除與當前指令結合的所有轉換函數(shù)。

?

TrimLeft

刪除輸入左邊的空格。

?

TrimRight

刪除輸入右邊的空格。

?

trim

刪除輸入左右兩邊的空格。

?

urlDecode

這個函數(shù)為URL編碼的輸入字符串解碼。無效編碼(例如非十六進制字符,字符串結尾部分少了一兩個字符)不會被轉換。可以用@validateUrlEncoding運算符檢測是否是無效編碼。交互函數(shù)不能針對URL編碼的變量使用,除非你想執(zhí)行URL二次編碼。

?

urlDecodeUni

除了urlDecode對%xx解碼之外,urlDecodeUni需要解碼%uXXXX。如果編碼在FF01-FF5E(ASCII碼總寬度),那么高字節(jié)將檢查和并調整低字節(jié)。否則,只有低字節(jié)可用,高字節(jié)不可用。

?

urlEncode

對輸入數(shù)據進行URL編碼

?

?

?

?

?

?

Actions

有五個動作組,每個動作分別屬于一個組:

Disruptive actions

引起modsecurity做些事情。有些情況下這些事情意味著鎖定事務,但并不是所有情況都這樣做。例如,allow動作屬于一個disruptive動作組,但是它并不鎖定事務。每個規(guī)則中只能有一個disruptive動作(如果有多個disruptive動作,或者繼承的動作,只有最后那個有效)。每個規(guī)則鏈中也只能有一個disruptive動作(在一個鏈中,只能在第一條規(guī)則中有disruptive動作)。

Non-disruptive actions

做一些事情,但是這些事情并不能影響規(guī)則處理流。例如,設置一個變量,或者改變變量的值。任何規(guī)則都可以使用Non-disruptive動作,就連一個鏈中的每一個規(guī)則也都可以有Non-disruptive動作。

Flow actions

這些動作影響規(guī)則流(例如skip或者skipAfter)

Meta-data actions

使用Meta-data動作可以提供關于規(guī)則更多的信息。例如:id,rev,severity和msg。

Data actions

不是真正的動作,只是容器,用來保存其他動作使用的數(shù)據。例如,status動作包含了blocking(blocking發(fā)生時)使用的狀態(tài)。

?

Allow

所屬動作組:Disruptive

當成功匹配一個規(guī)則時,停止規(guī)則的處理(審核)過程,并允許交互繼續(xù)進行。

SecRule TEMOTE_ADDR “^192\.168\.1\.100$” nolog,phase:1,allow

ModSecurity之前的版本,allow動作只能影響當前的phase。如果在Phase 1階段中有allow動作,將會跳過phase 1階段剩下的規(guī)則。但是如果在Phase 2階段中有allow動作,剩下的規(guī)則將會繼續(xù)執(zhí)行。從2.5.0版本開始,allow動作升級到,可以對正在執(zhí)行的規(guī)則進行細粒度的控制。下列規(guī)則適用:

1、像上面的例子中單獨使用一個allow的話,allow會影響整個交互,停止當前階段的處理,而且跳過除了logging階段之外的其他階段(logging階段很特殊,總是執(zhí)行)。

2、如果和參數(shù)phase一起使用,allow將會導致引擎停止處理當前階段,其他階段將會照常執(zhí)行。

3、如果和request參數(shù)一起使用,allow將會引起引擎停止處理當前階段。下一個處理階段將是RESPONSE_HEADERS階段。

例如:

#Do not process request but process response

SecAction phase:1,allow:request

?

#Do not process transaction(request和response)

SecAction phase:1,allow

如果你想讓response通過,在RESPONSE_HEADERS階段使用規(guī)則,而且只單獨使用allow。

#Allow response through

SecAction phase:3,allow

?

Capture

動作組:Non-disruptive

當和正則表達式操作符一起使用時,capture創(chuàng)建正則表達式捕捉的副本,并把這些捕捉副本放到交互變量集合里面。每次成功模式匹配,最多只能復制10個,每個以數(shù)字0-9的組合命名。

SecRule REQUEST_BODY “username=(\w{25,})” phase:2,t:none,chain

SecRule TX:1 “(?:(?:a(admin|nonymous)))”

注意:數(shù)字0捕捉整個的REGEX匹配,1捕捉第一個括號里面的數(shù)據。

?

Chain

動作組:Flow

動作緊跟著規(guī)則時,把規(guī)則串起來,得到的結果就是規(guī)則鏈,串起來的規(guī)則允許有更多復雜的規(guī)則匹配,在這些這些規(guī)則匹配中,使用大量不同的變量來創(chuàng)建一個更好的規(guī)則,并且有利于防止誤報。

#Refuse to accept POST requests that do

#not specify request body length.Do note that

#this rule should be preceeded by a rule that verifies

#only valid request methods(e.g.GET,HEAD and POST)are used.

SecRule REQEST_METHOD ^POST$ chain,t:none

SecRule REQUEST_HEADERS:Content-Lenth ^$ t:none

注意:

在程序語言概念中,串起來的規(guī)則有點類似于AND條件聲明。只有當所有的變量檢查返回正數(shù)時,規(guī)則鏈中第一部分指定的動作才被觸發(fā)。只要規(guī)則鏈有一方面是負的,那整個規(guī)則鏈都是負的。同時要注意,disruptive動作,execution段,metadata動作(id,rev,msg),skip,skipAfter動作只能通過鏈開始規(guī)則指定。

?

deny

所屬動作組:Disruptive

停止規(guī)則處理過程,并且中斷交互。

所屬動作組:Disruptive

?

Id

動作組:Meta-data

給規(guī)則或鏈指定一個ID號

SecRule &REQUEST_HEADERS:Host “@eq 0” \

“l(fā)og,id:60008,severtity:2,msg:’Reqest Missing a Host Header’”

注意:

保留值范圍:

1-99,999::保留做本地(內部)使用,你認為怎么合適就怎么用,但是你分配給別人的規(guī)則里面不要用這個范圍。

100,000-199,999:引擎內部使用,指定給一些沒有明確ID號的規(guī)則

200,000-299,999:modsecurity.org發(fā)布的規(guī)則使用

300,000-399,999:gotroot.com發(fā)布的規(guī)則使用

400,000-419,999:不可用,僅作保留

420,000-429,999:為ScallyWhack[http://projects.otaku42.de/wiki/Scally-Whack]

430,000-899,999:不可用,僅作保留

900,000-999,999:核心規(guī)則[http://www.modsecurity.org/projects/rules/]設計

1,000,000及以上:不可用,僅作保留

?

Log

一個成功的規(guī)則匹配需要被記錄。這個動作不僅把匹配記錄到Apache error log file(用來記錄apache的錯誤信息)當中也要記錄到ModSecurity audit log(調試、審計日志)當中。

?

msg

動作組:Meta-data

給規(guī)則或鏈指定一個客戶消息。

SecRule &REQUEST_HEADERS:Host “@eq 0” \

“l(fā)og,id:60008,severity:2,msg:’Request Missing a Host Header’”

注意:

Msg消息在錯誤日志和/或審計日志中,而不作為響應頭返回給用戶。

?

noauditlog

所屬動作組:Non-disruptive

這個動作表明,當成功匹配一個規(guī)則時,并不記錄審計日志。不管交互應不應該被記錄到aodit log中,這次匹配都不能被當做(下次判斷的)標準。(感覺可以用于白名單中)

SecRule REQUEST_HEADERS:User-Agent “Test” allow,noauditlog

注意:如果SecAuditEngine 被設置為On,那么所有的交互都會被記錄;如果被設置成RelevantOnly,你才可以使用noauditlog這個動作來控制交互是否被記錄。

即使規(guī)則里寫了noauditlog,規(guī)則里觸發(fā)了審計動作,還是會記錄日志,正確的做法是在規(guī)則中加上ctl:auditEngine=Off才會不記錄日志。(上面是張彪依翻譯版的,言簡意賅,好理解,我應該感到汗顏)(即使noauditlog這個動作是應用于具體的規(guī)則當中,這個規(guī)則可能在審計事件觸發(fā)之前也可能在審計事件觸發(fā)之后,但是這個交互都要被記錄在audit log(審計日志)當中。正確的方法是:使用“ctl:auditEngine=off”來使整個交互的審計都不記錄(來使審計記錄功能失效)。)

?

nolog

Action Group:Non-disruptive

不記錄規(guī)則匹配,既不記錄在error中,也不記錄在audit logs中。

注意:使用這個動作,也必須說明noauditlog

?

pass:

動作組:Disruptive

盡管成功匹配了一個規(guī)則,但繼續(xù)檢查下一條規(guī)則

SecRule REQUEST_HEADERS:User-Agent “Test” log,pass

SecRule中寫了pass,SecRule帶了multiple targets,每一次規(guī)則匹配,所有的target都會被處理,并觸發(fā)non-disruptive動作。下面的例子里,每一次匹配,TX:test都增加1

SecRule ARGS “test” log,pass,setvar:TX.test=+1

注意:每一次匹配,都不會終止交互,并記錄日志,除非阻止日志。

?

pass

動作組:Meta-data

把規(guī)則或規(guī)則鏈歸于某一個有效處理階段之一

SecDefaultAction log,deny,phase:1,t:removeNulls,t:lowercase

SecRule REQUEST_HEADER:User-Agent “Test” log,deny,status:403

注意:記住如果段是錯誤的,會導致目標變量為空。即變量或運算符(RegEx)正確,但是由于指定了錯誤的段,導致丟失惡意數(shù)據。

Phase:1

Normally you will want to use phase:1 along with initcol so that the collection is available in all phases.

?

redirect

動作組:Disruptive

在給定位置發(fā)布redirect來攔截交互

SecRule REQUEST_HEADERS:User-Agent “test” \

Log,redirect:http://www.hostname.com/failed.html

注意:如果狀態(tài)動作是現(xiàn)在時的并且值可接受(為301,302,303,或者307),這個狀態(tài)碼將會用來重定向,否則,狀態(tài)碼302被用來重定向

?

setvar

動作組: non-disruptive

新建刪除更新集合中的變量

新建變量:setvar:tx.score=10

刪除變量:setvar:!tx.score

增加減小變量:在數(shù)字前面加上+或-:setvar:tx.score=+5

?

severity

動作組:Meta-data

指定規(guī)則的嚴重性

SecRule REQUEST_METHOD “^PUT$” “id:340002,rev:1,severity:CRITICAL,msg:’Restricted HTTP function’”

注意:

嚴重值遵循系統(tǒng)日志,如下:

0????????????????????? EMERGENCY

1????????????????????? ALERT

2????????????????????? CRITICAL

3????????????????????? ERROR

4????????????????????? WARNING

5????????????????????? NOTICE

6????????????????????? INFO

7????????????????????? DEBUG

用數(shù)字或文字值都可以指定嚴重程度。但是每個數(shù)字代表的嚴重程度很難記憶,所有應該使用文字值指定嚴重程度。數(shù)字值在v2.5.0版本中已經取消了,在接下來的版本更新中也可能會被取消。

?

skip

動作組:Flow

匹配成功時,跳過一條或更多的規(guī)則或規(guī)則鏈、

SecRule REQUEST_URI “^/$” \

“phase:2,chain,t:none,skip:2”

SecRule REMOTE_ADDR “^127\.0\.0\.1$” “chain”

SecRule REQUEST_HEADERS:User-Agent “^Apache \(internal dummy connection\)$” “t:none”

SecRule &REQUEST_HEADERS:Host “@eq 0” \

“deny,log,status:400,id:960008,severity:4,msg:’Request Missing a Host Header’”

SecRule &REQUEST_HEADER:Accept “@eq 0” \

“l(fā)og,deny,log,status:400,id:960015,msg:’Request Missing an Accept Header’”

注意:skip只應用與當前正在處理的階段,并且沒必要應用于配置文件里面的規(guī)則里的命令。如果想通過處理段對規(guī)則分類,就要使用skip。不能在一個規(guī)則鏈中跳過規(guī)則。一個簡單的參數(shù)就可以指出要跳過的規(guī)則或規(guī)則鏈的數(shù)量。

?

skipAfter

動作組:Flow

匹配后跳過規(guī)則或規(guī)則鏈,重新開始執(zhí)行指定了ID號或marker(參考SecMarker)的規(guī)則。

SecRule REQUEST_URI “^/$” “chain,t:none,skipAfter:960015”

SecRule REMOTE_ADDR “^127\.0\.0\.1$”? “chain”\

SecRule REQUEST_HEADERS:User-Agent “^Apache \(internal dummy connection\)$” “t:none”

SecRule &REQUEST_HEADERS:Host “@eq 0” \

“deny,log,status:400,id:960008,severity:4,msg:’Request Missing a Host Header’”

SecRule &REQUEST_HEADERS:Accept “@eq 0” \

“l(fā)og,deny,log,status:400,id:960015,msg:’Request Missing an Accept Header’”

注意:skip只應用與當前正在處理的階段,并且沒必要應用于配置文件里面的規(guī)則里的命令。如果想通過處理段對規(guī)則分類,就要使用跳過。不能在一個規(guī)則鏈中跳過規(guī)則。一個簡單的參數(shù)就可以指出要跳過的規(guī)則或規(guī)則鏈的數(shù)量。

?

?

status

動作組:Data

與動作deny和redirect動作一起使用來指定響應狀態(tài)碼

SecDefaultAction log,deny,status:403,phase:1

注意:Apache在scope位置(例如Directory,location等)定義的status動作可能會被phase:1的動作設置所代替。如果在配置文件中出現(xiàn)的話,Apache將會觸發(fā)ErrorDocument指令。所以如果你之前已經為一個給定的狀態(tài)定義了一個自定義錯誤頁的話,那么這個錯誤頁將會執(zhí)行并顯示給用戶。

?

t

動作組:non-disruptive

當轉換功能是針對指定變量,并且變量的結果是由運算符計算得到時,使用動作t

SecDefaultAction log,deny,phase:1,t:removeNulls,t:lowercase

SecRule REQUEST_COOKIES:SESSIONID “47414e81cbbef3cf8366e84eeacba091” \

?? Log,deny,status:403,t:md5,t:hexEncode

注意:先用SecDefaultAction中指定轉換功能,在此基礎之上,還需要用SecRule指定轉換功能。使用“t:none”可以為某一指定的規(guī)則取消所有轉換功能。

?

?

?

?

?

?

Operators運算符

規(guī)則中可以使用很多運算符,@后面跟運算符名稱

eq

相當于等號“=”

SecRule &REQUEST_HEADERS_NAMES “@eq 15”

?

pm

段匹配運算符。pm使用一組匹配引擎集(Aho-Corasick)來使關鍵字列表得到更快的匹配,It will match any one of its arguments anywhere in the target value.匹配不區(qū)分大小寫。

SecRule REQUEST_HEADERS:User-Agent “@pm WebZIP WebCopier Webster WebStripper SiteSnagger ProWebWalker”

上面這個例子中,如果口令在User-Agent HTTP頭值中得到匹配,將返回403拒絕訪問。

?

pmFromFile

段匹配運算符。pmFromFile使用一組匹配引擎集(Aho-Corasick)來使關鍵字列表得到更快的匹配,它和pm相同,不同在于pmFromFile需要一個一列文件作為arguments。目標值將和文件中任一個段相匹配。

注意:1、文件的每一行只能有一個段。行尾標記將會和段剝離,但是段里面不能沒有空格(End of line markers will be stripped from the phases,however,whitespace will not be trimmed from phases in the file.)。空行和以“#”開頭的行被忽略。

2、使用段文件的相對路徑,可以使帶有規(guī)則集的段文件的內容更簡單。此時,包含規(guī)則的文件路徑被預置為段文件路徑。

SecRule REQUEST_HEADERS:User-Agent “@pm /path/to/blacklist1 blacklist2” “deny,status:403”

上面的例子中,如果兩個文件的模式(pattern)在User-Agent的HTTP頭值中得到匹配,那么403拒絕訪問,表blacklist2需要和包含規(guī)則的文件相同路徑。

?

validateUrlEncoding

?

?

validateUtf8Encoding

檢驗變量是不是一個有效的UTF-8編碼字符串

SecRule ARGS “@validateUtf8Encoding”

注意:UTF-8在大部分web服務器上都是有效的。0-65535之間的整數(shù)值用UTF-8字節(jié)序列編碼,UTF-8字節(jié)序列沒有百分數(shù)。簡短的形式只有雙字節(jié)。

檢查以下三類錯誤:

Not enough bytes.UTF-8支持2,3,4,5,6字節(jié)編碼。ModSecurity將會找出一個或多個字節(jié)丟失的情況。

Overlong characters。ASCII字符直接映射成Unicode(統(tǒng)一字符編碼)空間,因而只代表一個簡單的字節(jié)。但是大多數(shù)ASCII字符也能編碼成2,3,4,5,6個字符。所有就會欺騙編碼者去思考這個字符是不是其他東西(并且這樣也大概會防止安全檢查)。

?

?

?

?

?

?

?

?

?

?

SecPcreMatchLimit

SecPcreMatchLimitRecursion

這兩個是設置pcre的參數(shù)的,用來避免pcre陷入死循環(huán)之類的。

pcre是實現(xiàn)正則表達式匹配的庫,modsecurity規(guī)則里面支持正則表達式,就是用pcre庫來做的。

SecStreamInBodyInspection

SecStreamOutBodyInspection

是兩個開關,是否檢查請求體和響應體。

?

?

SecRule REQUEST_HEADERS:Host "^[\d.:]+$" "phase:2,t:none,msg:'Host header is a numeric IP address',severity:1,id:0401006,"

?

?

?

?

?

?

?

MIME:多功能網際郵件擴充協(xié)議

MIMEMultipurpose Internet Mail Extensions)是一個互聯(lián)網標準,它擴展了電子郵件標準,使其能夠支持非ASCII字符、二進制格式附件等多種格式的郵件消息。

服務器將MIME標志符放入傳送的數(shù)據中來告訴瀏覽器使用哪種插件讀取相關文件。

MIME能夠支持非ASCII字符、二進制格式附件等多種格式的郵件消息。MIME規(guī)定了用于表示各種各樣的數(shù)據類型的符號化方法。瀏覽器接收到文件后,會進入插件系統(tǒng)進行查找,查找出哪種插件可以識別讀取接收到的文件。如果瀏覽器不清楚調用哪種插件系統(tǒng),它可能會告訴用戶缺少某插件,或者直接選擇某現(xiàn)有插件來試圖讀取接收到的文件,后者可能會導致系統(tǒng)的崩潰。Microsoft公司應用于Windows系統(tǒng)下的瀏覽器使用ActiveX控件,而不是Netscape插件,這種瀏覽器不必象其它瀏覽器那樣依靠MIME的編碼。"

在HTTP中,MIME類型被定義在Content-Type header中。

在ASP中,設定MIME類型的方法是通過Response對象的ContentType屬性。

?

0601001

#950103

SecRule TX:PARANOID_MODE "@eq 1" "chain,phase:1,t:none,msg:'Path Traversal Attack',id:0601001,severity:1"

?????? SecRule REQUEST_FILENAME|ARGS_NAMES|ARGS|XML:/* "(?:\x5c|(?:%(?:c(?:0%(?:9v|af)|1%1c)|2(?:5(?:2f|5c)|f)|u221[56]|1u|5c)|\/))(?:%(?:u2024|2e)|\.){2}(?:\x5c|(?:%(?:c(?:0%(?:9v|af)|1%1c)|2(?:5(?:2f|5c)|f)|u221[56]|1u|5c)|\/))" "t:none,t:lowercase,capture"

?

轉載于:https://www.cnblogs.com/xiachj/p/4112194.html

總結

以上是生活随笔為你收集整理的modsecurity配置指令学习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 美女交配 | 亚洲中字幕| 簧片av| 亚洲精品无码专区 | 四虎精品久久 | 国产黄色网络 | 国产欧美日韩免费 | 99热精品在线播放 | a天堂中文在线观看 | 国产乱强伦一区二区三区 | 国产精品色呦呦 | 国产精品影音先锋 | 日韩午夜在线视频 | 天天撸天天操 | 欧美性受xxx | 精品人伦一区二区三 | 黄色在线播放 | 一区二区三区不卡视频在线观看 | 日日拍夜夜拍 | 国产女主播一区二区三区 | 亚洲视频免费看 | 欧美日韩字幕 | 国产激情无套内精对白视频 | 羞羞漫画在线 | 亚洲高清在线看 | porn国产 | 哺乳喂奶一二三区乳 | 二区在线观看 | 精品黑人一区二区三区 | 久久久欧美精品 | 丁香花在线影院观看在线播放 | 大度亲吻原声视频在线观看 | 欧洲女性下面有没有毛发 | 免费的黄色小视频 | 插我一区二区在线观看 | 中文字幕25页 | 国模私拍在线观看 | 在线观看av不卡 | 极品videosvideo喷水| 中文字幕高清在线播放 | av大片在线看 | 国产一级免费片 | 黄床大片 | 亚洲伊人成人网 | 新x8x8拨牐拨牐永久免费影库 | 亚洲av无码国产精品久久 | 亚洲成av人片一区二区梦乃 | 国产成人亚洲精品 | 超碰蜜桃| 欧美私人网站 | 女儿的朋友在线播放 | 国产情侣自拍小视频 | 色综合日韩 | 青青草国产精品 | 国模无码大尺度一区二区三区 | 乱lun合集小可的奶水 | 天堂网在线资源 | 国产男女在线 | 日韩精品――中文字幕 | 亚洲综合在线成人 | 亚洲天堂影院 | 波多野结衣视频播放 | 玩弄丰满少妇xxxxx性多毛 | 国产乱仑视频 | 天天干夜夜艹 | 一区二区三区入口 | 爱欲av| 黄色片免费在线播放 | 老女人做爰全过程免费的视频 | 亚欧在线免费观看 | 中文字幕丰满乱子伦无码专区 | 爱色成人网| 雨宫琴音一区二区三区 | 美女一级视频 | 亚洲性自拍 | 色综合啪啪 | 天堂网视频在线观看 | 开心综合网| 国产精品人人做人人爽 | 久久99精品国产.久久久久 | 国产性―交―乱―色―情人 | 午夜伦伦 | 91精品又粗又猛又爽 | 91漂亮少妇露脸在线播放 | 超碰成人免费 | 久久婷婷六月 | 天天做天天看 | 久久瑟瑟 | 久久依人 | 国产福利电影在线 | 最新精品国产 | 好吊操av | 成人在线激情 | 日韩成人精品视频 | 日本不卡不卡 | 美女光屁屁露胸胸 | 嫩草在线观看 | 国产精品国产精品国产专区蜜臀ah | 婷婷在线免费观看 |