史上最详细sqlmap入门教程

news/2025/4/1 4:26:10/

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


http://www.ppmy.cn/news/72992.html

相关文章

1073. 负二进制数相加(leetcode,模拟,数学分析)-------------------c++实现

1073. 负二进制数相加(leetcode,模拟,数学分析)-------------------c实现 题目表述 给出基数为 -2 的两个数 arr1 和 arr2,返回两数相加的结果。 数字以 数组形式 给出:数组由若干 0 和 1 组成,按最高有效位到最低有…

【Linux】基础IO

文章目录 查看文件内存多大os如何传递标志位的接口openw(写)r(读) 文件描述符重定向dup和dup2 缓冲区syncprintf最后输出的都是字符串 在之前的博客当中我们简单的了解过文件的相关操作,之前的属于是语言方案,接下来要学习的就是系统方案 查看文件内存多…

解决RedisTemplate 使用 setIfAbsent 做分布式锁出现返回值为 null 的问题

我们现在较少使用RedisTemplate 提供的setIfAbsent 做分布式锁,解决并发场景问题,一般使用成熟的三方工具Redisssion来解决分布式锁问题.但是有时候还是需要手动通过RedisTemplate 提供的setIfAbsent实现简化的分布式锁. 此处记录一下使用RedisTemplate 的 setIfAbsent 做分布…

Spring Boot + Mybtis-plus集成

目录 需求分析Maven 相关依赖配置文件相关流程MybatisPlus配置自动补全参数配置逻辑删除注解乐观锁注解 需求分析 Spring Boot和MyBatis-Plus是目前使用最广泛的Java web开发框架和ORM框架,它们可以很好地协同工作,提供高效和稳定的系统开发和数据操作。…

leecode654——最大二叉树

leecode最大二叉树 🌻题目要求: 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的…

Nacos简介和安装

1.Nacos简介 1.1.为什么叫Nacos 前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service。 1.2.是什么 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos: Dynamic Naming and Configuration ServiceNacos就是注册中心&am…

JavaScript全解析——Ajax教程(上)

AJAX 是Asynchronous JavaScript And XML的缩写。 它不是一种编程语言。它是一种基于HTML、CSS、JavaScript 和 XML,让开发更好、更快和更有互动的 Web 应用的技术。 什么是ajax 认识前后端交互 前后端交互就是前端与后端的一种通讯方式,主要使用的技…

Springer期刊 latex投稿经验分享

Springer Nature期刊的latex模板下载: Download the journal article template package 以MTAP为例(修改之后对修订稿的投递过程) 第一步:将您的文章提交到适当的期刊轨道或特刊。 如有必要,从下拉菜单中更改您提交的文章类型。 然后点击Proceed 第二步: 与您提交的先前修…