二、SQLMap 渗透测试工具


数据库注入一般情况下采用两种方式 :SQLMap 工具注入 和 手工注入 ,SQLMap 核心 :获取数据库里的数据

实验环境 :Kali SQLMap 为攻击方,Windows 7 为被攻击方

一、SQLMap 打开方式

① 点点点 :采用这种方法打开的 SQLMap 终端是没有后接其它命令的,系统实际上默认执行的是 sqlmap -h 帮助命令,系统会列出相关使用方法

image.png

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

image.png

二、SQLMap 基本操作

网页传参方式多为 GET 和 POST 两种

1. GET 探测是否可被注入

 sqlmap -u [url?id=x]		# get方式探测当前页面是否可被注入,所有id参数值全部写上  sqlmap -u [url?id=x]		# 多个id值则需要使用引号引起来 # 实际执行命令时去掉[]大括号 

一些系统回显提示 :

① 系统已猜测到数据库为 Mysql ,询问是否需要跳过其它数据库类型验证 :

image.png

② 确认探测级别 :

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

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

image.png

第一次探测时耗时可能有点长,系统会将探测的数据缓存,后续再次探测时速度会有所提升

关注回显中的粗体字( INFO字段 ) ,这些内容基本上已被系统确定可被注入

image.png

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

image.png

2. GET 获取数据库字段(获取所有)

获取当前数据库所有库表列,适用于小站点(大站点内容太多)

 sqlmap -u [url?id=x] --dump	# 若没有接其它参数直接dump,表示一行一行拿所有数据 

一些系统回显:

① 抓到了第一张表,数据库名字 :test ,表 :person ,字段 :两行

image.png

② 继续往后抓,在 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 自带的一本常用字典

image.png image.png

③ 若顺利爆破,后续无其它需要手动确认的选项,则自动往后抓取并回显内容,直至抓取结束

获取当前数据库所在的数据库服务器上所有的数据库里的库表列,适用于小站旁站

 sqlmap -u [url?id=x] --dump-all	# 操作和dump类似 
image.png

3. GET 获取数据库字段(精确获取)

按照 库 - 表 - 列 的顺序依次精确获取

获取数据库名

① 获取当前站点使用的数据库名

 sqlmap -u [url?id=x] --current-db 
image.png

② 获取当前站点所在数据库服务器上所有数据库名

 sqlmap -u [url?id=x] --dbs 
image.png

针对库获取对应的表

 sqlmap -u [url?id=x] -D test --tables	# 获取test库里的表 
image.png

针对表获取里面的列

 sqlmap -u [url?id=x] -D test -T users --columns	# 获取test库里users表里的列 

按照开发命名规范,password 和 username 等敏感字符里存放的都是其对应的数据

image.png

缩小列的范围,只获取所需列里面的数据 :

 sqlmap -u [url?id=x] -D test -T users -C username,password --dump 
image.png

库表可以后可接 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后接参数值并使用引号引起 
image.png

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		# 列出当前网站使用的数据库用户 
image.png
 --users			# 列出数据库所有用户 
image.png
 --passwords		# 查询数据库用户的密码(弱口令) 
image.png

如果当前为 MYSQL 客户端,且对方数据库没有限制登陆来源,则此时拿到账户和密码之后可以远程登陆对方数据库

  sqlmap -d mysql://用户名:密码@ip:3306/库名		# 远程登陆对端数据库 
  --is-dba			# 检查当前用户是否为数据库管理员 
  --sql-shell		# 执行自定义SQL语句,使用q退出 
image.png
  --os-shell		# 执行任意操作系统命令(有权限限制) 
image.png

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

image.png image.png image.png
  --os-cmd		# 与--os-shell类似,但一次只能执行一条命令 
image.png
  --file-read 目标文件的绝/对/路/径		# 读取文件(下载文件) 
image.png
  --file-write 要上传文件的绝/对/路/径 --file-dest 目标地址的绝/对/路/径	   # 上传文件(写文件),权限可能只在当前家目录 

image.pngimage.png


四、课下 :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 ,或者直接关闭其防火墙)

image.png image.png image.png image.png

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

image.png

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

image.png

3. 关卡1:获取数据库信息

获取数据库名

  • 当前站点所在数据库服务器上所有的数据库 :

    image.png
  • 当前此站点使用的数据库 :

image.png

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

image.png

获取 users 表里的列 :

image.png

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

image.png

4. 关卡1:实验结果

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


5. 关卡11:探测是否可被注入

image.png

通过观察站点页面,要求输入账户密码,且在页面 URL 后添加参数时页面无任何变化,猜测此站点数据传输方式不是 GET

SQLMap 使用 POST 方法探测此站点是否可被注入 :

  • 当使用 --data 参数模型传递页面上显示的 username 和 password 参数时,结果显示这两个参数不是动态的,且探测结果失败,显然参数不对,使用 Wireshark 对其进行抓包并追踪流,得到实际参数 :
image.png image.png
  • 使用上方得到的参数再次使用 POST 方法,探测结果如下图 ,发现漏洞,可被注入 :
image.png

6. 关卡11:获取数据库信息

获取数据库名

  • 当前站点所在数据库服务器上所有的数据库 :
image.png
  • 当前此站点使用的数据库 :
image.png

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

image.png

获取 users 表里的列 :

image.png

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

image.png

7. 关卡11:实验结果

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