sql漏洞自动注入工具——sqlmap
一、sqlmap简介
sqlmap支持MySQL, Oracle,PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird,Sybase和SAP MaxDB等数据库的各种安全漏洞检测。
sqlmap支持五种不同的注入模式:
- 基于布尔的盲注,即可以根据返回页面判断条件真假的注入;
- 基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断;
- 基于报错注入:即页面会返回错误信息,或者把注入的语句的结果
- 联合查询注入:可以使用onion情况下的注入。
- 堆查询注入:可以同时执行多条语句的注入。
二、下载及安装
Linux下git直接下载
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
windows下安装
官网: http://sqlmap.org/
windows下下载sqlmap的压缩包,解压后即可使用。但需要一些组件包的支持,需要有python2.7.x或者2.6.x环境支持。
kali
kali默认安装sqlmap
三、sql使用参数详解
1、选项
-h , --help 显示基本信息并退出
-hh 显示高级信息并退出
–version 显示程序版本信息并推出。
-v VERBOSE 信息级别:0-6(默认1)。
0 只表示python错误以及严重的信息
1 同时显示基本信息和警告信息
2 同时显示debug信息
3 同时显示注入的payload
4 同时显示http请求
5 同时显示http响应头
6 同时显示http响应页
2、目标
在这些选项中必须提供至少有一个明确目标
-d DIRECT 直接连接数据库的连接字符串
-u URL , --url=URL 目标URL(eg:http://www.site.com/vuln.php?id=1)
-l LOGFILE 从burp或者WebScarab代理日志文件中分析目标
-x SITEMAPURL 从远程地图(.xml)分析目标
-m BULKFILE 将目标地址保存在文件中,一行为一个URL来解析目标
-r REQUESTFILE 从文件加载HTTP请求
–force-ssl 请求使HTTPS需要配合这个参数来使用,或者可以在host头后边加上443
-g GOOGLEDORJ 从谷歌中加载结果目标URL(只加载前100各结果,需要挂代理)
-c CONFIGFILE 从配置文件ini中加载选项
3、请求
这些选项可以用来指定如何连接到目标URL。
–method=METHOD 强制使用给定的HTTP方法。(eg: put)
–data=DATA 通过POST发送数据参数。
–date=“id=1” -f --banner --dbs --users
–param-del=PARA… 当GET或POST的数据需要其他字符分割测试参数的时候需要用的此参数。
–cookie=COOKIE HTTP cOOKIEHEADER 值(做DVWA靶场需要用到)
–cookie-del=COO… 用来分隔cookie的值
–load-cookie=L… 指定以 Netscape/wget 格式存放 cookies 的文 件
–drop-set-cookie 忽略 HTTP 响应中的 Set-Cookie 参数
–user-agent 使用指定的UA。默认SQLmap的HTTP请求头中UA:sqlmap/1.0-dev-xxxxxxx(http://sqlmap.org)可以使用–user-agent参数来修改,同时也可以使用–random-agent参数来随机的从./txt/user-agents.txt中获取。当–level参数设定为3或者3以上的时候,会尝试对User-Angent进行注入
–random-agent 使用随机的HTTP User-Agent
–host=HOST 指定HOST
–referer=REFERER 指定 HTTP Referer,当–level参数设定为3或者3以上的时候会尝试对referer注入
-H HEADER, --hea… 设置额外的HTTP头参数,(例如: “X-Forwarded-For :127.0.0.1 ”)
–headers=HEADERS 设置额外的HTTP头参数(例如: “Accept-Language: fr\nETag: 123”)
–auth-type=AUTH… HTTP 认证方式(Basic,Digest, NTLM, PKI)
–auth-cred=AUTH… HTTP 认证凭据 (username:password)
–ignore-code=IG… 忽略 HTTP 错误码(例如: 401)
–ignore-proxy 忽略系统默认代理设置
–ignore-redirects 忽略重定向尝试
–ignore-timeouts 忽略连接超时
–proxy=PROXY 使用代理连接目标 URL
–proxy-cred=PRO… 使用代理进行认证 (username:password)
–proxy-file=PRO… 从文件中加载代理列表
–tor 使用 tor 匿名网络
–tor-port=TORPORT 设置 Tor 代理端口代替默认端口
–tor-type=TORTYPE 设置 Tor 代理方式(HTTP,SOCKS4 或 SOCKS5( 默认))
–check-tor 检查是否正确使用了 Tor
–delay=DELAY 设置每个 HTTP 请求的延迟秒数
–timeout=TIMEOUT 设置连接响应的有效秒数(默认为 30)
–retries=RETRIES 连接超时时重试次数(默认为 3)
–randomize=RPARAM 随机更改给定的参数值
–safe-url=SAFEURL 测试过程中可频繁访问且合法的 URL 地址(译者注: 有些网站在你连续多次访问错误地址时会关闭会话连接)
–safe-post=SAFE… 使用 POST 方法发送合法的数据
–safe-req=SAFER… 从文件中加载合法的 HTTP 请求 -
-safe-freq=SAFE… 每访问两次给定的合法 URL 才发送一次测试请求
–skip-urlencode 不对 payload 数据进行 URL 编码
–csrf-token=CSR… 设置网站用来反 CSRF 攻击的 token
–csrf-url=CSRFURL 指定可提取反 CSRF 攻击 token 的 URL
–force-ssl 强制使用 SSL/HTTPS
–hpp 使用 HTTP 参数污染攻击
–eval=EVALCODE 在发起请求前执行给定的 Python 代码(例如: “import hashlib;id2=hashlib.md5(id).hexdigest()”)
4、优化
以下选项用于优化 sqlmap 性能
-o 开启所有优化开关
–predict-output 预测常用请求的输出
–keep-alive 使用持久的 http(s) 连接
–null-connection 仅获取页面大小而非实际的 HTTP 响应
–threads=THREADS 设置 HTTP(S) 请求并发数最大值(默认为1)
5、注入
这些选项可用于指定要测试的参数,提供自定义注入有效载荷和可选的篡改脚本。
-P TESTPARAMETER 指定需要测试的参数
–skip=SKIP 指定要跳过的参数
–skip-static 指定跳过非动态参数
–param-execlude=… 用正则表达式排除参数。(eg: ses)
–dbms=DBMS 指定 DBMS 类型,(eg: MySQL)
–dbms-cred=DBMS… DBMS 认证凭据(username:password)
–os=OS 指定 DBMS 服务器的操作系统类型
–invalid-bignum 将无效值设置为大数
–invalid-logical 对无效值使用逻辑运算
–invalid-string 对无效值使用随机字符串
–no-cast 关闭 payload 构造机制
–no-escape 关闭字符串转义机制
–prefix=PREFIX 注入 payload 的前缀字符串
–suffix=SUFFIX 注入 payload 的后缀字符串
–tamper=TAMPER 用给定脚本修改注入数据
6、检测
以下选项用于自定义检测方式
–level=LEVEL 设置测试等级(1-5,默认为1)
–risk=RISK 设置测试风险等级(1-3,默认等级为1)
–string=STRING 用于确定查询结果为真时的字符串
–not-string=NOT… 用于确定查询结果为假时的字符串
–regexp=REGEXP 用于确定查询结果为真时的正则表达式
–code=CODE 用于确定查询结果为真时的 HTTP 状态码
–text-only 只根据页面文本内容对比页面
–titles 只根据页面标题对比页面
7、技术
以下选项用于调整特定 SQL 注入技术的测试方法
–technique=TECH 使用的 SQL 注入技术(默认为“ BEUSTQ”,译者注:
B: Boolean-based blind SQLinjection(布 尔型盲注))
E: Error-based SQL injection(报错型注入)
U: UNION query SQL injection(联合查询注入 )
S: Stacked queries SQL injection(堆查询注 入)
T: Time-based blind SQL injection(时间型 盲注)
Q: inline Query injection(内联查询注入)
–time-sec=TIMESEC 延迟 DBMS 地相应秒数(默认为 5)
–union-cols=UCOLS 设置联合查询注入测试地列数目范围
–union-char=UCHAR 用于暴力破解列数的字符
–union-from=UFROM 设置联合查询注入 FROM 处用到的表
–dns-domain=DNS… 设置用于 DNS 渗出攻击的域名(推荐阅读《在SQL注入中使用DNS获取数据》 http://cb.drops.wiki/drops/tips-5283.htm)
–second-order=S… 设置二阶响应的结果显示页面的 URL.(该选项用于二阶 SQL 注入)
8、指纹识别
-f, --fingerprint 执行广泛的 DBMS 版本指纹识别
9、枚举
以下选项用于获取后端数据库管理系统的信息,结构和数据表中的数据。
此外,还可以运行你输入的 SQL 语句
-a, -all 获取所有信息、数据
-b, --banner 获取 DBMS banner
–current-user 获取 DBMS 当前用户
–current-db 获取 DBMS 当前数据库
–hostname 获取 DBMS 服务器的主机名
-is-dba 探测 DBMS 当前用户是否为 DBA(数据库管理员)
–users 枚举出 DBMS 所有用户
–passwords 枚举出 DBMS 所有用户的密码哈希
–privileges 枚举出 DBMS 所有用户特权级
–roles 枚举出 DBMS 所有用户角色
–dbs 枚举出 DBMS 所有数据库
–tables 枚举出 DBMS 数据中的所有表
–columns 枚举出 DBMS 表中所有列
–schema 枚举出 DBMS 所有模式
–count 导出数据库数目
–dump 导出 DBMS 数据库表项
–dump -all 导出所有 DBMS 数据建库表项
–search 搜索列,表和/或数据库名
–comments 获取 DBMS 注释
-D DB 指定要枚举的 DBMS 数据库
-T TBL 指定要枚举的 DBMS 数据表
-C COL 指定要枚举的 DBMS 数据列
-X EXCLUDECOL 指定要排除的 DBMS 数据列
-U USER 指定枚举的 DBMS 用户
–exclude-sysdbs 枚举所有数据表时,指定配出特定系统数据库
–pivot-column=P… 指定主列
–where=DUMPWHERE 在转储表时使用 WHERE 条件语句
–start=LIMITSTART 指定要导出的数据表条目开始行数
–stop=LIMITSTOP 指定要导出的数据表条目结束行数
–first=FIRSTCHAR 指定获取返回查询结果的开始字符位
–last=LASTCHAR 指定获取返回查询结果的结束字符位
–sql-query=QUERY 指定要执行的 SQL 语句
–sql-shell 调出交互式 SQL shell
–sql-file=SQLFILE 执行文件中的 SQL 语句
10、暴力破解
以下选项用于暴力破解测试
–common-tables 检测常见的表明是否存在
–common-columns 检测常用的列明=名是否存在
11、用户自定义函数注入
以下选项用于创建用户自定义函数
–udf-inject 注入用户自定义函数
–shared-lib=SHLIB 共享库的本地路径
12、访问文件系统
以下选项用于访问后端数据库管理系统的底层文件系统
–file-read=RFILE 读取后端 DBMS 文件系统中的文件
–file-write=WFILE 写入后端 DBMS 文件系统中的文件
–file-test=DFILE 使用文件绝对路径写入到后端 DBMS
13、访问操作系统
以下选项用于访问后端数据库管理系统的底层操作系统
–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 框架的本地安装路径
–tmp-path=TMPPATH 远程临时文件目录的绝对路径
14、访问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 注册表键值类型
15、一般选项
以下选项用于设置通用的参数
-s SESSIONFILE 保存和恢复检索会话文件的所有数据
-t TRAFFICFILE 记录所有HTTP流量到一个文本文件中
–batch 从不询问用户输入,使用所有默认配置。
–binary-fields=… 结果字段具有二进制值(e.g.“digest”)
–charset=CHARSET 强制字符编码
–crawl=CRAWLDEPTH 从目标URL爬行网站
–crawl-exclude=… 正则表达式从爬行页中排除
–csv-del=CSVDEL 限定使用CSV输出 (default",")
–dump-format=DU… 转储数据格式(CSV(default), HTML or SQLITE)
–eta 显示每个输出的预计到达时间
–flush-session 刷新当前目标的会话文件
–forms 解析和测试目标URL表单
–fresh-queries 忽略在会话文件中存储的查询结果
–hex 使用DBMS Hex函数数据检索
–output-dir=OUT… 自定义输出目录路径
–parse-errors 解析和显示响应数据库错误信息
–save=SAVECONFIG 保存选项到INI配置文件
–scope=SCOPE 从提供的代理日志中使用正则表达式过滤目标
–test-filter=TE… 选择测试的有效载荷和/或标题(e.g. ROW)
–test-skip=TEST… 跳过试验载荷和/或标题(e.g.BENCHMARK)
–update 更新sqlmap
16、其他选项
-z MNEMONICS 使用短记忆法 (e.g.“flu,bat,ban,tec=EU”)
–alert=ALERT 发现SQL注入时,运行主机操作系统命令
–answers=ANSWERS 当希望sqlmap提出输入时,自动输入自己想要的答案(e.g. “quit=N,follow=N”),例如:sqlmap.py -u"http://192.168.22.128/get_int.php?id=1"–technique=E–answers=“extending=N” --batch
–beep 发现sql注入时,发出蜂鸣声。
–cleanup 清除sqlmap注入时在DBMS中产生的udf与表。
–dependencies Check formissing (non-core) sqlmap dependencies
–disable-coloring 默认彩色输出,禁掉彩色输出。
–gpage=GOOGLEPAGE 使用前100个URL地址作为注入测试,结合此选项,可以指定页面的URL测试
–identify-waf 进行WAF/IPS/IDS保护测试,目前大约支持30种产品的识别
–mobile 有时服务端只接收移动端的访问,此时可以设定一个手机的User-Agent来模仿手机登陆。
–offline Work inoffline mode (only use session data)
–purge-output 从输出目录安全删除所有内容,有时需要删除结果文件,而不被恢复,可以使用此参数,原有文件将会被随机的一些文件覆盖。
–skip-waf 跳过WAF/IPS / IDS启发式检测保护
–smart 进行积极的启发式测试,快速判断为注入的报错点进行注入
–sqlmap-shell 互动提示一个sqlmapshell
–tmp-dir=TMPDIR 用于存储临时文件的本地目录
–web-root=WEBROOT Web服务器的文档根目录(e.g."/var/www")
–wizard 新手用户简单的向导使用,可以一步一步教你如何输入针对目标注入
四、sqlmap进行sql注入常规使用步骤

五、常规细节知识点
1、sql注入分为:GET注入、POST注入、Cookie注入
2、level选项
–level=LEVEL 要执行的测试级别(1-5,default 1)
默认:始终测试GET和POST参数
2级:测试HTTP cookie头值
3级:测试HTTP User-Agent / Referer头的值
检测SQL注入越难,则必须将–level设置得越高。
3、sql-shell(利用sql注入进入命令终端)
–sql-shell 进入sql终端后可执行任意的sql命令
–os-shell
更详细的可以看这里