最近做安全测试,遇到了SQL盲注的漏洞,从发现漏洞,确认漏洞,协助开发复现漏洞,验证漏洞一整套流程下来,有了亿点点收获,下面分享给大家,希望对软件测试同学有所启发,难度不大,小白看完也能上手的那种。
话不多说,先上图!!!
一、sqlmap工具简介
sqlmap 是一个自动化的 SQL 注入和渗透测试工具,是开源免费的, 支持 MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase 和 SAP MaxDB 等数据库管理系统, 可以帮助渗透测试人员自动化地检测和利用 SQL 注入漏洞,获取数据库服务器上的数据,甚至可以在某些情况下获取操作系统的shell。
sqlmap支持五种不同的注入模式:
基于布尔的盲注,即可以根据返回页面判断条件真假的注入;
基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断;
基于报错注入,即页面会返回错误信息,或者把注入语句的结果直接返回在页面中;
联合查询注入,可以使用 union 情况下的注入;
堆查询注入,可以同时执行多条语句执行时的注入。
二、sqlmap工具安装
1、安装Python
此次演示的Python版本是Python 3.6.6
2、在官网:sqlmap: automatic SQL injection and database takeover tool,下载sqlmap安装包,选择任意一种格式均可
3、解压sqlmap,并将解压的文件复制到Python安装路径下
演示的Python安装目录在:D:\Python36
4、在桌面创建一个cmd的快捷方式,并命名为sqlmap
5、在快捷方式sqlmap上鼠标右键,选择“属性”,把起始位置修改为sqlmap所在路径后,点击“确定”按钮
6、双击快捷方式sqlmap,并输入:sqlmap.py -h
这样,sqlmap就安装成功了。
三、sqlmap参数讲解
1、-u "URL"
指定URL,一般用于get请求
用法:python sqlmap.py -u "接口地址"
例如:python sqlmap.py -u "https://xxxx/saler/list?customerId=2"
2、-r
sqlmap可以从一个文本中读取原始的 HTTP 请求,通过这种方式,能够免于设置部分选项(例如:设置 Cookies,POST 数据等参数)
例如:python sqlmap.py -r D:\user.txt --dbs
如果相关的请求是 HTTPS,可以结合 --force-ssl 开关强制使用 SSL 进行 443/tcp 连接。或者,在 Host 头部信息后面直接加上 :443,使用 Google dork 结果作为目标地址
3、--dbs
如果当前会话用户对数据库系统表有读取权限,则可以枚举出当前数据库名称
例如:python sqlmap.py -r D:\user.txt --dbs
4、--exclude-sysdbs
排除所有的系统数据库
例如:python sqlmap.py -r D:\user.txt --dbs --exclude-sysdbs "information_schema,mysql,performance_schema"
5、--tables
如果当前会话用户对数据库系统表有读取权限,则可以枚举出当前数据库表
例如:python sqlmap.py -r D:\user.txt --tables
6、-D
用来指定数据库,如果不加该参数, sqlmap 将枚举所有 DBMS 数据库的表
例如:python sqlmap.py -r D:\user.txt -D test --tables
7、--columns
如果当前会话用户对数据库系统表有读取权限,则可以枚举出当前数据库表的列名
例如:python sqlmap.py -r D:\user.txt --columns -D testdb -T users -C name
8、-D
用来指定数据库名称
例如:python sqlmap.py -r D:\user.txt --columns -D testdb -T users -C name
9、-T
用来指定数据库表名
例如:python sqlmap.py -r D:\user.txt --columns -D testdb -T users -C name
10、-C
用来指定要枚举的数据库表的列名称
例如:python sqlmap.py -r D:\user.txt --columns -D testdb -T users -C name
11、--fresh-queries
使用这个参数sqlmap将不会从缓存里面加载数据,从而能将最新的数据注入到数据库
例如:python sqlmap.py -r D:\user.txt --dbs --fresh-queries
12、--level
如果 SQL 注入检测的难度越高,则需要设定越高的--level 值,最高级别是5
例如:python sqlmap.py -r D:\user.txt --level=5 --risk=3
13、--risk
风险级别,默认级别是1,风险级别是2时,会在默认的基础上添加大量的时间型盲注语句进行测试,风险级别是3时,会在原基础上添加大量OR类型的布尔型盲注语句进行测试
例如:python sqlmap.py -r D:\user.txt --level=5 --risk=3
这个命令,执行时间会比较久
四、sqlmap实践应用
一)通过工具AppScan扫描SQL盲注漏洞
查看AppScan工具的扫描结果,看是否有SQL盲注漏洞,如果存在,就会有如下图所示的标注
二)分析存在SQL盲注的接口
注入的接口一般分为POST注入和GET注入,两种类型的接口使用工具的方式不一样。
1、POST注入
1)如果接口是POST类型的,就需要把AppScan上该接口的请求信息(请求头+请求体),全部复制到一个txt文件下保存,放到一个本地文件下,例如D:\saler.txt
2)手动登录系统,将D:\saler.txt文件的Cookie值更新为最新值
复制最新的Cookie值
粘贴至D:\saler.txt文件中
3)打开cmd窗口,通过桌面快捷方式进入sqlmap所在目录,执行命令:python sqlmap.py -r D:\user.txt --dbs
命令的格式为:python sqlmap.py -r 请求报文txt文件所在目录位置 --dbs
4)命令执行完成后,分析结果
如果有注入,结果如下(因为我们演示的时候,执行命令的参数是--dbs,所以暴露的是数据库名):
5)将SQL盲注的漏洞反馈给开发同学,让开发同学修复
参考AppScan扫描时的参数,利用抓包工具例如Fiddler或者Charles进行重现
尝试传这四个参数,验证结果是不是不同,如果不一样,则证明存在SQL盲注漏洞
6)待开发修复漏洞后,进行验证
注意验证的时候清除缓存,带--fresh-queries参数,该参数表示sqlmap将不会从缓存里面加载数据,从而能注入到数据库最新的数据
3分钟左右,脚本跑完后,查看结果,如下是已修复的结果
2、GET注入
1)打开cmd窗口,通过桌面快捷方式进入sqlmap所在目录,执行命令:python sqlmap.py -u "https://xxxx/saler/list?customerId=2" --dbs
命令的格式为:python sqlmap.py -u "接口地址" --dbs
2)命令执行完成后,分析结果
如果有注入,结果如下:
如果没有注入,结果如下:
3)将SQL盲注的漏洞反馈给开发同学,让开发同学修复
参考POST注入的方式,GET注入重现也可以不抓包,直接手动登录系统,在浏览器中访问接口地址即可
4)待开发修复漏洞后,进行验证
注意验证的时候清除缓存,带--fresh-queries参数,该参数表示sqlmap将不会从缓存里面加载数据,从而能注入到数据库最新的数据
请参考POST注入的方式
相信大家看完了整个SQL盲注测试流程,对SQL盲注也有了一定的了解,今天的分享就到这里,希望对大家有所启发。(全网同名,转载请注明出处)