SQLMap详解
SQLMap是一个自动化的SQL注入工具,其主要功能是扫描、发现并利用给定URL的SQL注入漏洞。SQLMap内置了很多绕过插件,支持的数据库是MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase和SAP MaxDB。SQLMap采用了以下五种独特的SQL注入技术。
(1)基于布尔类型的盲注,即可以根据返回页面判断条件真假的注入。
(2)基于时间的盲注,即不能根据页面返回的内容判断任何信息,要通过条件语句查看时间延迟语句是否已执行(即页面返回时间是否增加)来判断。
(3)基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回页面中。
(4)联合查询注入,在可以使用Union的情况下的注入。
(5)堆查询注入,可以同时执行多条语句的注入。
SQLMap的强大功能包括数据库指纹识别、数据库枚举、数据提取、访问目标文件系统,并在获取完全的操作权限时执行任意命令。SQLMap的功能强大到让人惊叹,当常规的注入工具不能利用SQL注入漏洞进行注入时,使用SQLMap会有意想不到的效果。
SQLMap的安装
SQLMap的安装需要Python环境(支持Python 2.6、Python 2.7、Python 3.x),本节使用的是Python 3,可在官网下载安装包并一键安装,安装完成后,复制Python的安装目录,添加到环境变量值中(或者在安装时,勾选“Add Python to environment variables”选项,自动将Python加入环境变量),如图3-1所示:
图3-1
从SQLMap官网下载最新版的SQLMap,打开cmd,输入命令“python sqlmap.py”,工具即可正常运行,如图3-2所示。
图3-2
SQLMap入门
1.判断是否存在注入
假设目标注入点是http://10.211.55.6/Less-1/?id=1,用如下命令判断其是否存在注入:
python sqlmap.py -u http://10.211.55.6/Less-1/?id=1
结果显示存在注入,如图3-3所示。
图3-3
注意,当注入点后面的参数大于等于两个时,需要加双引号,命令如下:
python sqlmap.py -u "http://10.211.55.6/Less-1/?id=1&uid=2"
运行上述命令后,Terminal终端上会“爆出”一大段信息,如图3-4所示。信息中有三处需要选择的地方:第一处的意思为检测到数据库可能是MySQL,是否跳过并检测其他数据库;第二处的意思是在“level1、risk1”的情况下,是否使用MySQL对应的所有Payload进行检测;第三处的意思是参数ID存在漏洞,是否继续检测其他参数,一般默认按回车键即可继续检测。
图3-4
2.判断文本中的请求是否存在注入
从文件中加载HTTP请求,SQLMap可以从一个.txt文件中获取HTTP请求,这样就可以不设置其他参数(如Cookie、POST数据等)。.txt文件中的内容为Web数据包,如图3-5所示。
图3-5
运行如下命令,判断是否存在注入:
python sqlmap.py –r 1.txt
运行后的结果如图3-6所示,参数“-r ”一般在存在Cookie注入时使用。
图3-6
3.查询当前用户下的所有数据库
该命令是确定网站存在注入后,用于查询当前用户下的所有数据库,命令如下:
python sqlmap.py -u http://10.211.55.6/Less-1/?id=1 --dbs
如果当前用户有权限读取包含所有数据库列表信息的表,则使用该命令即可列出所有数据库,如图3-7所示。
图3-7
从图3-7中可以看到,查询出了5个数据库。
继续注入时,将参数“--dbs”缩写成“-D xxx”,意思是在xxx数据库中继续查询其他数据。
4.获取数据库中的表名
该命令的作用是在查询完数据库后,查询指定数据库中所有的表名,命令如下:
python sqlmap.py -u "http://10.211.55.6/Less-1/?id=1" -D security --tables
如果不在该命令中加入参数“-D”来指定某一个具体的数据库,则SQLMap会列出数据库中所有库的表,如图3-8所示。
图3-8
从图3-8中可以看出security数据库拥有的4个表名。继续注入时,将参数“--tables”缩写成“-T”,意思是在某个表中继续查询。
5.获取表中的字段名
该命令的作用是在查询完表名后,查询该表中所有的字段名,命令如下:
python sqlmap.py -u "http://10.211.55.6/Less-1/?id=1" -D security -T users --columns
该命令的运行结果如图3-9所示。
图3-9
从图3-9中可以看出,security数据库中的users表中一共有3个字段。在后续的注入中,将参数“--columns”缩写成“-C”,意思是获取指定列的数据。
6.获取字段内容
该命令的作用是在查询完字段名之后,获取该字段中具体的数据信息,命令如下:
python sqlmap.py –u "http://10.211.55.6/Less-1/?id=1" –D security –T users –C username,password --dump
这里需要下载的数据是security数据库里users表中username和password的值,如图3-10所示。
图3-10
7.获取数据库的所有用户
该命令的作用是列出数据库的所有用户。在当前用户有权限读取包含所有用户的表时,使用该命令就可以列出所有管理用户,命令如下:
python sqlmap.py –u "http://10.211.55.6/Less-1/?id=1" --users
可以看出,当前用户账号是root,如图3-11所示。
图3-11
8.获取数据库用户的密码
该命令的作用是列出数据库用户的密码。如果当前用户有读取用户密码的权限,则SQLMap会先列举出用户,然后列出Hash,并尝试破解,命令如下:
python sqlmap.py –u "http://10.211.55.6/Less-1/?id=1" --passwords
从图3-12中可以看出,密码采用MySQL 5加密方式,可以在解密网站中自行解密。
图3-12
9.获取当前网站数据库的名称
使用该命令可以列出当前网站使用的数据库,命令如下:
python sqlmap.py –u "http://10.211.55.6/Less-1/?id=1" --current-db
从图3-13中可以看出,数据库是security。
图3-13
10.获取当前网站数据库的用户名称
使用该命令可以列出当前使用网站数据库的用户,命令如下:
python sqlmap.py –u "http://10.211.55.6/Less-1/?id=1" --current-user
从图3-14中可以看出,用户是root。
图3-14
出当前使用网站数据库的用户,命令如下:
python sqlmap.py –u "http://10.211.55.6/Less-1/?id=1" --current-user
从图3-14中可以看出,用户是root。