什么是SQL注入

article/2025/9/16 22:24:08

什么是sql注入?

既然你会来看这篇文章,说明你和写这篇文章时的我一样,是个安全小白。不管你是以何种原因想要了解“什么是sql注入”,我都希望这篇文章尽可能地会给你一点收获。

两个通俗的概念

SQL 注入就是指 web应用程序对用户输入的数据合法性没有过滤或者是判断,前端传入的参数是攻击者可以控制,并且参数带入数据库的查询,攻击者可以通过构造恶意的 sql语句来实现 对数据库的任 意操作。

又或者说

通过把sql命令插入到Web表单提交或输入域名或页面请求的查询字符串中,最终欺骗服务器执行恶意的SQL命令
在这里插入图片描述
如果你有有一些开发的基础知识,会很容易地理解SQL注入地概念,笼统地说,当你动态地请求服务器器时,会有数据交互的过程。上图是PHP链接MySQL的源码,可以再任意SQL注入靶场中查看。总的来说,SQL注入就是可控变量,被带入数据库查询了。(2021.9.30加)

当你浏览一些网页,它们大都会提供一个查询的功能,比如你打开一个视频网站,你可以通过搜索“xxxx”,来获得你想要的视频。这期间大概发生了这样一些事:你按下回车键,一个带有你输入的关键字的HTTP请求发送到服务器,业务逻辑层的Web服务器通过脚本引擎解析你的请求,动态地构造sql语句,并请求DBMS,执行SQL语句。DBMS返回SQL执行结果给Web Server,Web Server将页面封装成HTML格式响应给浏览器,浏览器解析HTML,将内容呈现给你。
要看懂上面这段话,你得需要一点计网、数据库和中间件的知识。现在,你只需要把不懂的知识封装成一个黑盒子,这个黑盒子提供了一些需要的功能。
在这里插入图片描述
那么,sql注入,就是发生在动态构造SQL语句,并将执行结果返回Web Server的这个过程。因为没有对用户输入的数据进行过滤,把恶意构造的参数带入了DBMS进行查询,实现第数据库的恶意操作。

SQL注入是怎么发生的?

如果你读懂了上面的话,你会说,哦,这就是SQL注入啊。当转念一想,你还是发现自己不懂“什么是SQL注入”。接下来,你可能需要一点数据库的知识,特别是MySQL。

MySQL有一个系统库 information_schema,存储着所有的数据库的相关信息。
可以利用该库进行一次完整的注入。以下为一般流程:
猜数据库:
select schema_name frominformation_schemata
select database()
猜某库的数据表 select table_name from information_schema.tables where table_schema=‘xxxx’
猜某表的所有列 select column_name from information_schema.columns where table_name=‘xxxxx’
获取某列的内容
select **** from *****

开始我们的SQL注入:
你最好在自己下载的数据库里尝试。
假设有一张学生表,你想查询名字为张三的学生,你会这样写:

select * from student where name = '张三'; 

也许在前端界面,你只是输入了一个“张三“,浏览器获取你的输入存在一个变量$input里,将这个变量传给脚本引擎,脚本引擎不做任何处理,直接将你的输入值动态地构造一条SQL语句,比如:

$sql = "select * from student where name = 'input'";
$result = mysql_query($sql);

上面这句代码是PHP语言对数据库的操作,不懂为什么可以这样?可以学一下ODBC或JDBC,现在,它只是个黑盒子。通过mysql_query()这个函数,$sql变量的语句被传入MySQL数据库进行执行。一切都那么完美。但是,如果你输入的是

张三'    //仅仅多了一个单引号

那么上面的语句就会变为

$sql = "select * from student where name = '张三''";

相当于在数据库进行了如下查询:

select * from student where name = '张三'';

你输入的单引号,闭合了前面原语句的单引号,后面的单引号就多出来了,此时报错。
那这有什么用呢?这太有用了。因为你可以闭合前面的子句,后面就可以拼接一切你自己构造的合法语句,并在最后加一个“ --+” 以注释后面复杂的内容,比如

select * from student where name = '张三' union select 1,2,x,x --+

这下来,你可能真的懂得了“什么是SQL注入”


http://chatgpt.dhexx.cn/article/fHonK174.shtml

相关文章

SQL注入(一)—— sql手动注入实操

SQL SQL注入sql 注入的核心 SQL 手注的一般流程判断注入点 —— 第一步判断字段数 —— 第二步判断回显点 —— 第三步查询相关内容 —— 第四步判断库名判断表名判断列名查询具体信息 总结 SQL注入 SQL注入攻击是目前web应用网络攻击中最常见的手段之一,曾被冠以 “…

【SQL注入-01】SQL语句基础及SQL注入漏洞原理及分类

目录 1 SQL注入概述1.1 SQL注入简介1.2 SQL注入原理(掌握)1.3 SQL注入漏洞的危害(掌握) 2 SQL注入漏洞分类2.1 注入位置分类(掌握)2.2 注入数据类型分类(掌握)2.3 注入手法分类&…

SQL注入详解(全网最全,万字长文)

漏洞原因 一些概念: SQL:用于数据库中的标准数据查询语言。 web分为前端和后端,前端负责进行展示,后端负责处理来自前端的请求并提供前端展示的资源。 而数据库就是存储资源的地方。 而服务器获取数据的方法就是使用SQL语句进…

sql注入基础原理(超详细)

一、Sql注入简介 Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之一。 二、Web 程序三层架构 三层架构(3-tier architecture) 通常意义上就…

数据库存储过程语法

mysql 5.0存储过程学习总结 一.创建存储过程 1.基本语法: create procedure sp_name() begin ……… end 2.参数传递 二.调用存储过程 1.基本语法:call sp_name() 注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递…

存储过程语法--变量

目录 实例演示 定义默认值并使用 定义赋值再使用 定义2变量,通过查询表内数据进行赋值并使用 定义变量declare 变量名 数据类型 [default 默认值];变量赋值方式一set 变量名 变量值;变量赋值方式二select 列名 into 变量名 from 表名 [where 条件]; 实例演示 定义…

mysql 5.0存储过程(包括语法,符号)

一.创建存储过程 1.基本语法: create procedure sp_name() begin ……… end 2.参数传递 二.调用存储过程 1.基本语法:call sp_name() 注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递 三.删除存储过程 1.基本语法&a…

Oracle存储过程语法学习

Oracle存储过程: 1.1 第一个存储过程 --创建存储过程 create or replace procedure proc1( p_para1 varchar2, p_para2 out varchar2, p_para3 in out varchar2 )as v_name varchar2(20); begin v_name : 张三; p_para3 : v_name; …

sql存储过程语法详解

一、定义变量 使用关键字declare申明变量: declare 变量名 变量类型 /*简单赋值*/declare a intset a5print a/*select赋值*/declare b nvarchar(10) select b stu_name from dbo.student where stu_id6 print b/*update赋值*/declare c nvarchar(10) upd…

MySQL常用操作之创建存储过程语法详解

MySQL常用操作之创建存储过程语法详解 前言简介语法创建结构变量结构入参变量和出参变量流程控制判断(IF 语句)判断(CASE 语句)循环(LOOP 语句)循环(WHILE 语句)循环(REPEAT 语句)再次循环(ITERATE 语句) 总结参考链接 前言 场景介绍 作为一名Java搬运工,实际开发中…

Oracle 存储过程语法

Oracle 存储过程语法 1. 创建表(测试数据准备) -- 创建用户表 create table TT_USER (USERID NUMBER(10),USERNAME VARCHAR2(255),PASSWORD VARCHAR2(255),SEX VARCHAR2(1) );INSERT INTO TT_USER VALUES (101, zhang, 111, 1); INSERT INTO TT…

mysql存储过程基本语法

本文来说下mysql存储过程基本语法 文章目录 基本语法使用实例变量的使用变量定义declare语句变量赋值用户变量 存储过程的参数in 输入参数out 输出参数inout输入输出参数 本文小结 基本语法 存储过程就是具有名字的一段代码,用来完成一个特定的功能。创建的存储过程…

Oracle存储过程基本语法

后来者居上,不是easy的事情 尤其技术类work,更加如此。都是have one 投入的过程的。尤其开发,还是属于技术壁垒挺高的行业。 创建基本的存储过程 1 CREATE OR REPLACE PROCEDURE MyProName IS 2 BEGIN 3 NULL; 4 END; 行1:CREATE OR REPL…

存储过程常见语法

存储过程常见语法 一、存储过程的概念: 1、存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行 2、存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数…

存储过程的语法讲解

在上一篇文章:别再说不知道什么是存储过程和存储函数了 中简单的介绍了存储过程和存储函数以及其使用。其实存储过程是可以进行编程的,所以可以和其他的编程语言一样使用变量、表达式以及控制结构进行编程,从而实现一些复杂和有用的功能。这篇…

子网掩码的作用

IP地址由网络和主机两部分标识组成 IP地址由“网络标识(网络地址)”和“主机标识(主机地址)”两部分组成。在局域网内相互间通信的网络必须具有相同网络地址,也叫相同的网段,在同一个网段内每个设备的主机…

子网掩码使用详解

一、子网掩码 IP地址是以网络号和主机号来标示网络上的主机的,我们把网络号相同的主机称之为本地网络,网络号不相同的主机称之为远程网络主机,本地网络中的主机可以直接相互通信;远程网络中的主机要相互通信必须通过本地网关&…

什么是子网掩码 子网掩码的作用是什么?

什么是子网掩码 子网掩码的作用是什么? 网络工作人员经常需要与ip和子网掩码等打交道,相信绝大数的朋友都知道IP的意思,但是还不理解子网掩码的意思,下面装机之家小编来为大家介绍下关于子网掩码的相关知识,希望能够对…

ip、子网掩码、网关、默认网关

这里写目录标题 ip网络地址主机地址 子网子网掩码子网掩码的表示方法为什么要使用子网掩码?子网掩码的分类 网关默认网关 ip ip地址 网络地址 主机地址(又称:网络号和主机号),我们把网络号相同的主机称之为本地网络…

子网划分和子网掩码

目录 前言 1、IP地址 1.1 IP地址的内容 1.2 IP地址的分类 2、子网掩码的作用 2.1 主机间的通信 2.2 子网掩码 3.子网划分 3.1 子网划分的原因 3.2 子网划分的原理 3.3 IP地址汇总 总结 前言 知道IP地址的分类和基本使用,如果公司拥有300台计算机&#xf…