入侵防護模組包含一個內建規則,可以偵測 SQL 注入攻擊並根據其特性中斷連接或記錄。該規則稱為1000608 - Generic SQL Injection Prevention,可以根據您組織的需求進行配置。例如,您可以通過修改中斷閾值來更改規則的靈敏度。
什麼是SQL注入攻擊?
SQL 注入攻擊或 SQL 網路釣魚攻擊是一種攻擊資料驅動應用程式的方法,攻擊者在輸入欄位中包含部分 SQL 語句。新形成的惡意 SQL 命令由網站傳遞到您的資料庫並執行。該命令可能導致攻擊者能夠讀取、添加、刪除或更改資料庫中的資訊。
在 SQL 注入攻擊中常用的字符和字符串有哪些?
以下是一些常用的字符和字符串。此列表並不詳盡。
('
%27
\x22
%22
字元
;
ascii
%3B
%2B
--
%2D%2D
/*
%2F%2A
*/
%2A%2F
子字串
drop table
drop+table
插入到
insert+into
版本(
值
group by
group+by
create table
create+table
刪除
更新
批量插入
批量插入
load_file
關機
union
擁有
選擇
宣告
exec
和
或
讚
@@hostname
@@tmpdir
為空
is+null
is not null
is+not+null
%3D
CONCAT
%40%40basedir
版本%28,用戶(
user%28,system_user(
(,%28,)
%29
@
%40
投射
通用 SQL 注入防護規則如何運作?
為了檢測 SQL 注入攻擊,通用 SQL 注入防護規則使用了一個評分系統。其工作原理如下:
- 來自您應用程式的數據包到達代理進行分析。
- 通用 SQL 注入防護規則會檢查封包並判斷是否存在下表中顯示的任何字串。請注意,這些字串以逗號分隔並分為十組。
- 如果找到字串,則計算分數如下:
- 如果找到單個字串,則其組的分數構成總分。
- 如果在不同群組中找到多個字串,則這些群組的分數會相加。
- 如果在同一組中找到多個字串,則該組的分數只計算一次。請參閱規則和計分系統範例以獲取說明。
- 使用總分,Server & Workload Security保護 決定是否中斷連接或記錄它。如果總分超過 Drop Threshold 分數,則中斷連接;如果超過 Log Threshold 分數,則記錄它。
注意趨勢科技經常更新其規則,因此下表中的字串可能與Server & Workload Security保護中的字串不完全匹配。
|
注意在下面的行中使用 '
\W ' 表示 '後面跟著一個非字母數字字符'。 |
Group
|
Score
|
drop table,drop+table,insert into,insert+into,values\W,create table,create+table,delete\W,update\W,bulk
insert,bulk+insert,shutdown\W,from\W
|
2
|
declare\W,select\W
|
2
|
cast\W,exec\W,load_file
|
2
|
union\W,group by,group+by,order by,order+by,having\W
|
2
|
and\W,or\W,like\W,is null,is+null,is not null,is+not+null,where\W
|
1
|
--,%2D%2D,/\*,%2F%2A,\*/,%2A%2F
|
1
|
,%27,\x22,%22,char\W
|
1
|
;,%3B
|
1
|
%2B,CONCAT\W
|
1
|
%3D
|
1
|
(,%28,),%29,@,%40
|
1
|
ascii,子字串
|
1
|
version(,version%28,user(,user%28,system_user(,system_user%28,database(,database%28,@@hostname,%40%40hostname,@@basedir,%40%40basedir,@@tmpdir,%40%40tmpdir,@@datadir,%40%40datadir
|
2
|
規則和評分系統運作的示例
以下是一些計分方式的範例,以及在每種情況下採取的行動。
範例 1:已記錄和已丟棄的流量
假設您正在使用此規則配置(群組的分數位於冒號(“:”)之後):
drop table,drop+table,insert into,insert+into,values\W,create table,create+table,delete\W,update\W,bulk
insert,bulk+insert,shutdown\W,from\W:2declare\W,select\W:2cast\W,exec\W,load_file:2union\W,group
by,group+by,order by,order+by,having\W:2and\W,or\W,like\W,is null,is+null,is not null,is+not+null,where\W:1--,%2D%2D,/*,%2F%2A,*/,%2A%2F:1',%27,\x22,%22,char\W:1;,%3B:1%2B,CONCAT\W:1%3D:1(,%28,),%29,@,%40:1ascii,substring:1version(,version%28,user(,user%28,system_user(,system_user%28,databas(,database%28,@@hostname,%40%40hostname,@@basedir,%40%40basedir,@@tmpdir,%40%40tmpdir,@@datadir,%40%40datadir:2Log
Threshold: 3Drop Threshold: 4
並且遇到此攻擊字串:
productID=BB10735166+UNION/**/+SELECT+FROM+user
那麼總分是 5 (2+1+0+2),因為:
- 字串
UNION/
符合第四組,得分為 2。 - 字串
/*
符合第六組,得分為 1。 - 字串
*/
與第六組匹配,得分為 0(因為第六組的得分已經被計算過)。 - 字串
SELECT+
符合第二組,得分為 2。
總分為 5 時,會生成日誌並丟棄流量。
範例 2:無記錄或丟棄的流量
假設您正在使用此規則配置(其中
select\W
字串已移至與 union\W
相同的行):drop table,drop+table,insert into,insert+into,values\W,create table,create+table,delete\W,update\W,bulk
insert,bulk+insert,shutdown\W,from\W:2declare\W:2cast\W,exec\W,load_file:2union\W,select\W,group
by,group+by,order by,order+by,having\W:2and\W,or\W,like\W,is null,is+null,is not null,is+not+null,where\W:1--,%2D%2D,/*,%2F%2A,*/,%2A%2F:1',%27,\x22,%22,char\W:1;,%3B:1%2B,CONCAT\W:1%3D:1(,%28,),%29,@,%40:1ascii,substring:1version(,version%28,user(,user%28,system_user(,system_user%28,databas(,database%28,@@hostname,%40%40hostname,@@basedir,%40%40basedir,@@tmpdir,%40%40tmpdir,@@datadir,%40%40datadir:2Log
Threshold: 3Drop Threshold: 4
並且遇到此攻擊字串:
productID=BB10735166+UNION/**/+SELECT+FROM+user
那麼總分是 3 (2+1+0+0),因為:
- 字串
UNION/
符合第四組,得分為 2。 - 字串
/*
符合第六組,得分為 1。 - 字串
*/
與第六組匹配,得分為 0(因為第六組的得分已經被計算過)。 - 字串
SELECT+
符合第四組,得分為 0(因為第四組的得分已經被計算過)。
總分為 3 時,不會生成日誌,也不會丟棄流量。分數必須超過閾值才能生效。
配置通用 SQL 注入防護規則
您可以配置通用 SQL 注入防護規則以符合您組織的需求。可配置的選項顯示在下圖中。
要配置規則:
-
登入Server & Workload Security保護主控台。
-
在頂部點選Policies。
-
在右側的搜索框中,輸入 1000608,這是通用 SQL 注入防護規則的數字標識符。按下 Enter 鍵。該規則將顯示在主窗格中。
-
雙擊該規則。
-
點選Configuration標籤。您會在頂部的文字框中看到SQL注入模式。
-
如果您尚未自訂 SQL 注入模式,請更新至最新版本。要更新至最新模式,請前往 詳細資訊 標籤頁,複製 Default SQL Pattern 標題下的文字,並將其粘貼到 SQL Injection Patterns 標籤頁的文本框中。您現在使用的是趨勢科技的最新模式。
-
按如下方式編輯欄位:
- SQL Injection Patterns:這是您指定用於 SQL 注入攻擊的字符和字符串列表的地方。字符和字符串被分組並分配了一個分數。如果您想添加或更改字符串,請確保使用正確的編碼。詳情請參閱下方的 字符編碼規則。
- Drop Threshold:這是您指定丟棄分數的地方。當分數超過此閾值時,連接將被丟棄。(如果分數等於丟棄閾值,連接將被保持。)預設值為
4
。 - Log Threshold:這是您指定日誌分數的地方。當分數超過此閾值時,連接會被記錄。(如果分數等於日誌閾值,則不會記錄任何內容。)預設值為
4
。 - Max distance between matches:這裡是您指定在沒有匹配的情況下可以通過的位元組數量以將分數重置為
0
。預設值為35
。
注意
考慮使用接下來的兩個選項來為可能導致超過正常閾值的頁面和欄位創建覆蓋。- Pages (resource) with a non-default score to drop on:這是您可以為特定資源覆蓋Drop Threshold的地方。例如,如果您的Drop Threshold是
4
,但您希望問卷頁面的丟棄分數為8
,請指定/example/questionnaire.html:8
。使用此配置,/example/questionnaire.html
需要有一個高於8
的分數才能丟棄連接,而所有其他資源只需要高於4
的分數。請在每一行指定一個資源。 - Form parameters with a non-default score to drop on:這是您可以覆蓋在Drop Threshold或Pages (resources)with a non-default score to drop on欄位中定義的特定表單欄位的閾值。例如,如果您的Drop Threshold分數是
4
,但您希望用戶名欄位的丟棄分數更高為10
,請指定/example/login.html:username=10
,其中/example/login.html
替換為用戶名欄位出現的頁面的路徑和名稱,username
替換為您的應用程式使用的用戶名欄位。通過此配置,用戶名欄位需要有一個高於10
的分數才能丟棄連接,而頁面本身只需要一個高於4
的分數。請在每一行指定每個表單欄位。
注意
Log Threshold 在因 Pages (resources) with a non-default score to drop on 或 Form parameters with a non-default score to drop on 欄位匹配而中斷連接時不會生效。例如,如果您將表單參數欄位設置為/example/login.html:username=10
,而 username 欄位得分為11
,則連接會中斷,但不會記錄此事件。 -
點選 確定。
您已經配置了通用 SQL 注入防護規則。
字元編碼指南
如果您想更改或添加字串到通用 SQL 注入防護規則中,您必須正確地編碼它們。例如,如果您想在模式中使用引號字符
'
,您必須輸入 \x22
。下表顯示了字符及其編碼等價物,以及您可以用來表示擴展模式的字符類別。
Enter this string...
|
To denote...
|
\a
\A
|
字母字符,a-z A-Z
非字母字符
範例:
delete\a表示“單詞 'delete' 後接字母字符” |
\w
\W
|
字母和數字字符,a-z A-Z 0-9
非字母數字字符
範例:
delete\W表示“單詞 'delete' 後跟隨非字母數字字符” |
\d
\D
|
數字 0-9
非數字字符
範例:
delete\d表示“單詞 'delete' 後跟著 0 到 9 之間的數字” |
\s
\S
|
空白
非空白 [\r,\n,\t,0x32]
範例:
delete\S表示“單詞 'delete' 後跟隨非空白字符” |
\p
\P
|
標點符號,除上述以外的可打印 ASCII 字符
非標點符號字元
範例:
delete\p表示“單詞 'delete' 後跟一個標點符號或可打印的 ASCII 字符” |
\c
\C
|
控制字符,低於 32 或大於等於 127,不包括空白字符
非控制字元
您可以在此處找到控制字符的詳細資訊。
|
\.
|
任何
|
\xDD
|
十六進位位元組 0xDD
|
,
|
逗號 (,)
|
\x22
|
雙引號字符 (")
|
\\
|
反斜線 (\)
|
\|
|
已轉義的管道符號 (|)
|
|xx xx xx...|
|
十六進位管道(位元組序列)
|