最近做安全测试,遇到了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盲注也有了一定的了解,今天的分享就到这里,希望对大家有所启发。(全网同名,转载请注明出处)

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐