3.6 SqlMap用法—注入
這些選項可用于指定要測試的參數,提供自定義注入有效負載和可選的篡改腳本。
3.6.1.要測試的注入點
選項:-p,--skip和--param-exclude
默認情況下,sqlmap測試所有GET參數和POST參數。當的值--level> = 2時,它還會測試HTTP Cookie標頭值。當此值> = 3時,它還會測試SQL注入的HTTP User-Agent和HTTP Referer標頭值。但是,可以手動指定要sqlmap測試的參數的逗號分隔列表。這也將繞過對價值的依賴--level。
例如,要測試GET參數id和User-Agent僅HTTP ,請提供-p "id,user-agent"。
如果用戶希望從測試中排除某些參數,則可以使用option --skip。當您要使用更高的值--level并測試所有可用參數(通常不測試某些HTTP標頭)時,這特別有用。
例如,跳過測試對于HTTP標頭User-Agent和HTTP頭Referer在--level=5,提供--skip="user-agent,referer"。
還可以根據基于某些參數的名稱的正則表達式從測試中排除某些參數。在這種情況下,用戶可以使用option --param-exclude。
例如,要跳過對包含字符串token或其session名稱的參數的測試,請提供--param-exclude="token|session"。
3.6.2.URI注入點
在特殊情況下,注入點位于URI本身內。除非手動指出,否則sqlmap不會對URI路徑執行任何自動測試。您必須在命令行中通過在希望sqlmap測試和利用SQL注入的每個URI點之后附加一個星號(*)(注意:%INJECT HERE%還支持Havij樣式)來指定這些注入點。
例如,當使用Apache Web服務器的mod_rewrite模塊或其他類似技術時,此功能特別有用。
有效命令行的示例為:
$ python sqlmap.py -u "http://targeturl/param1/value1*/param2/value2/"
3.6.3.任意注入點
與URI注入點類似,星號(*)(注意:%INJECT HERE%還支持Havij樣式)也可以用于指向GET,POST或HTTP標頭中的任意注入點。注射點可以通過標記它的GET參數值內(一個或多個)提供有選項來指定-u,POST參數值(一個或多個)提供選項--data,HTTP標頭中提供的選項值(S) ,-H,,--headers和/或,或在通用處內部HTTP請求從文件中加載,帶有選項。--user-agent``--referer``--cookie``-r
有效命令行的示例為:
$ python sqlmap.py -u "http://targeturl" --cookie="param1=value1*;param2=value2"
3.6.4.強制DBMS
選項: --dbms
默認情況下,sqlmap自動檢測Web應用程序的后端數據庫管理系統。sqlmap完全支持以下數據庫管理系統:
- MySQL
- Oracle
- PostgreSQL
- Microsoft SQL Server
- Microsoft Access
- IBM DB2
- SQLite
- Firebird
- Sybase
- SAP MaxDB
- Informix
- MariaDB
- Percona
- MemSQL
- TiDB
- CockroachDB
- HSQLDB
- H2
- MonetDB
- Apache Derby
- Amazon Redshift
- Vertica
- Mckoi
- Presto
- Altibase
- MimerSQL
- CrateDB
- Greenplum
- Drizzle
- Apache Ignite
- Cubrid
- InterSystems Cache
- IRIS
- eXtremeDB
- FrontBase
如果在識別到SQL注入后sqlmap由于某種原因無法檢測到后端DBMS,或者如果您想要避免活動的指紋,則可以自己提供后端DBMS的名稱(例如postgresql)。對于MySQL和Microsoft SQL Server分別提供了他們在形式MySQL <version>和Microsoft SQL Server <version>,其中<version>是數據庫管理系統的有效版本; 例如5.0MySQL和2005Microsoft SQL Server。
如果--fingerprint與一起提供--dbms,則sqlmap僅會為指定的數據庫管理系統執行擴展指紋,請閱讀以下內容以獲取更多詳細信息。
請注意,此選項不是強制性的,強烈建議僅在絕對確定后端數據庫管理系統時使用此選項。如果您不知道,請讓sqlmap為您自動為其指紋。
3.6.5.強制數據庫管理系統的操作系統名稱
選項: --os
默認情況下,當此信息依賴于任何其他提供的開關或選項時,sqlmap會自動檢測Web應用程序的后端數據庫管理系統基礎操作系統。目前,完全支持的操作系統是:
- 的Linux
- 視窗
如果您已經知道操作系統名稱,可以強制使用它,這樣sqlmap就可以避免這樣做。
請注意,此選項不是強制性的,強烈建議僅在絕對確定有關后端數據庫管理系統底層操作系統的情況下使用此選項。如果您不知道它,請讓sqlmap自動為您識別它。
3.6.6.生成無效參數值時強制使用大數
開關: --invalid-bignum
在sqlmap需要使原始參數值(例如id=13)無效的情況下,它將使用經典取反(例如id=-13)。使用此開關,可以強制使用大整數值來實現相同的目標(例如id=99999999)。
3.6.7.生成無效參數值時強制使用邏輯操作符
開關: --invalid-logical
在sqlmap需要使原始參數值(例如id=13)無效的情況下,它將使用經典取反(例如id=-13)。通過此開關,可以強制使用布爾運算來實現相同的目標(例如id=13 AND 18=19)。
3.6.8.生成無效參數值時強制使用字符串
開關: --invalid-string
在sqlmap需要使原始參數值(例如id=13)無效的情況下,它將使用經典取反(例如id=-13)。通過此開關,可以強制使用隨機字符串來實現相同的目標(例如id=akewmc)。
3.6.9.關閉payload轉換
開關: --no-cast
檢索結果時,sqlmap使用一種機制,其中所有條目都強制轉換為字符串類型,并在有NULL值的情況下替換為空格字符。這樣做是為了防止出現任何錯誤狀態(例如,NULL值與字符串值的連接)并簡化數據檢索過程本身。但是,在某些情況下(例如,MySQL DBMS的較舊版本),由于數據檢索本身存在問題(例如None,返回值),因此需要關閉(使用此開關)此機制。
3.6.10.關閉字符串編碼
開關: --no-escape
在sqlmap需要在有效負載(例如SELECT 'foobar')中使用(單引號分隔)字符串值的情況下,這些值會自動轉義(例如SELECT CHAR(102)+CHAR(111)+CHAR(111)+CHAR(98)+CHAR(97)+CHAR(114))。之所以這樣做是因為兩件事:混淆有效內容,并防止后端服務器上的查詢轉義機制(例如magic_quotes和/或mysql_real_escape_string)潛在的問題。用戶可以使用此開關將其關閉(例如,以減小有效負載大小)。
3.6.11.定制payload
選項:--prefix和--suffix
在某些情況下,僅當用戶提供要添加到注入有效負載的特定后綴時,漏洞參數才可利用。當用戶已經知道查詢語法并想通過直接提供注入有效載荷前綴和后綴來檢測和利用SQL注入時,這些選項很方便出現的另一種情況就會出現。
易受攻擊的源代碼示例:
$query = "SELECT * FROM users WHERE id=('" . $_GET['id'] . "') LIMIT 0, 1";
若要檢測和利用此SQL注入,可以讓sqlmap 在檢測階段為您檢測邊界(如SQL有效負載前綴和后綴的組合),也可以自行提供。
例如:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php
?id=1" -p id --prefix "')" --suffix "AND ('abc'='abc"
[...]
這將導致所有sqlmap請求最終以如下查詢結束:
$query = "SELECT * FROM users WHERE id=('1') <PAYLOAD> AND ('abc'='abc') LIMIT 0, 1";
這使得查詢在語法上正確。
在這個簡單的示例中,sqlmap可以檢測SQL注入并加以利用而無需提供自定義邊界,但是有時在現實世界的應用程序中,當注入點位于嵌套JOIN查詢中時,有必要提供它。
3.6.12.修改注入數據
選項: --tamper
sqlmap本身不會對發送的負載進行混淆,除了單引號之間的字符串被其CHAR()類似表示所代替外。
在您和后端數據庫管理系統之間的輸入驗證機制較弱的情況下,此選項可能非常有用且功能強大。該機制通常是由應用程序源代碼,昂貴的企業級IPS設備或Web應用程序防火墻(WAF)調用的自行開發的輸入驗證例程。所有用來定義相同概念的流行語都以不同的方式實現,并且通常要花費很多錢。
要利用此選項,請為sqlmap提供以逗號分隔的篡改腳本列表,這將處理有效負載并將其轉換為有效負載。您可以定義自己的篡改腳本,在tamper/文件夾中使用sqlmap腳本,也可以對其進行編輯,只要將它們以逗號分隔作為選項的值即可連接--tamper(例如--tamper="between,randomcase")。
有效的篡改腳本的格式如下:
# Needed imports
from lib.core.enums import PRIORITY
# Define which is the order of application of tamper scripts against
# the payload
__priority__ = PRIORITY.NORMAL
def tamper(payload):
'''
Description of your tamper script
'''
retVal = payload
# your code to tamper the original payload
# return the tampered payload
return retVal
您可以在tamper/目錄中檢查有效且可用的篡改腳本。
假設禁止>字符,空格和大寫SELECT字符串的MySQL目標示例:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_int.php?id=1" --
tamper tamper/between.py,tamper/randomcase.py,tamper/space2comment.py -v 3
[hh:mm:03] [DEBUG] cleaning up configuration parameters
[hh:mm:03] [INFO] loading tamper script 'between'
[hh:mm:03] [INFO] loading tamper script 'randomcase'
[hh:mm:03] [INFO] loading tamper script 'space2comment'
[...]
[hh:mm:04] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
[hh:mm:04] [PAYLOAD] 1)/**/And/**/1369=7706/**/And/**/(4092=4092
[hh:mm:04] [PAYLOAD] 1)/**/AND/**/9267=9267/**/AND/**/(4057=4057
[hh:mm:04] [PAYLOAD] 1/**/AnD/**/950=7041
[...]
[hh:mm:04] [INFO] testing 'MySQL >= 5.0 AND error-based - WHERE or HAVING clause
'
[hh:mm:04] [PAYLOAD] 1/**/anD/**/(SELeCt/**/9921/**/fROm(SELeCt/**/counT(*),CONC
AT(cHar(58,117,113,107,58),(SELeCt/**/(case/**/whEN/**/(9921=9921)/**/THeN/**/1/
**/elsE/**/0/**/ENd)),cHar(58,106,104,104,58),FLOOR(RanD(0)*2))x/**/fROm/**/info
rmation_schema.tables/**/group/**/bY/**/x)a)
[hh:mm:04] [INFO] GET parameter 'id' is 'MySQL >= 5.0 AND error-based - WHERE or
HAVING clause' injectable
[...]
SqlMap中文版使用教程
推薦文章: