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

article/2025/9/16 22:23:22

目录

  • 1 SQL注入概述
    • 1.1 SQL注入简介
    • 1.2 SQL注入原理(掌握)
    • 1.3 SQL注入漏洞的危害(掌握)
  • 2 SQL注入漏洞分类
    • 2.1 注入位置分类(掌握)
    • 2.2 注入数据类型分类(掌握)
    • 2.3 注入手法分类(掌握)
  • 3 SQL语句基础
    • 3.1 简介
    • 3.2 注释
    • 3.3 MySQL 元数据库 information_schema 内容简介
    • 3.4 MySQL 常用函数
  • 4 总结
  • 参考文献

1 SQL注入概述

1.1 SQL注入简介

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

动态SQL语句:一般情况下,开发人员可以使用动态SQL 语句创建通用、灵活的应用。动态SQL语句是在执行过程中构造的,它根据不同的条件产生不同的SQL 语句。当开发人员在运行过程中需要根据不同的查询标准决定提取什么字段(如select语句),或者根据不同的条件选择不同的查询表时,动态地构造SQL语句会非常有用。

下面以PHP语句为例。由于这里的参数ID可控,且带入数据库查询,所以非法用户可以任意拼接SQL语句进行攻击。

$query =”SELECT * FROM users WHERE id= $_GET['id']";

注入流程:由于关系型数据库系统,具有明显的库/表/列/内容结构层次,所以我们通过SQL注入漏洞获取数据库中信息的时候,也依据这样的顺序。首先获取库名,其次获取表名,然后获取列名,最后获取数据

1.2 SQL注入原理(掌握)

目前,大多数Web编程语言提供了操作SQL的接口,以方便与数据库进行交互。但是在开发Web应用的过程中,由于忽视了代码的健壮性和安全性,攻击者可以构造巧妙的SQL语句从而获取到敏感数据,因此导致了SQL这种攻击方式的流行。
SQL 注入漏洞的产生需要满足以下两个条件:
(1)参数用户可控:前端传给后端的参数内容是用户可以控制的。
(2)参数带入数据库查询: 未对用户可控参数进行足够的过滤,导致传入的参数拼接到SQL语句,且带入数据库查询。

1.3 SQL注入漏洞的危害(掌握)

(1)攻击者未经授权可以访问数据库中的数据,盗取用户的隐私以及个人信息,造成用户的信息泄露。
(2)可以对数据库的数据进行增加删除操作,例如私自添加或删除管理员账号。
(3)如果网站目录存在写入权限,可以写入网页木马。攻击者进而可以对网页进行篡改,发布一些违法信息等。
(4)经过提权(利用mysql提权,有mof提权和udf提权)等步骤,服务器最高权限被攻击者获取。攻击者可以远程控制服务器,安装后门,得以修改或控制操作系统。

2 SQL注入漏洞分类

2.1 注入位置分类(掌握)

根据SQL注入漏洞原理,在用户“可控参数”中注入SQL语法,也就是说WEB应用在获取用户数据的地方,只要带入数据库查询,都有可能存在注入,这些地方通常包括:

(1)GET 数据

(2)POST 数据

(3)http请求头参数注入

  • HTTP Referer:是header的一部分,当浏览器请求网页时,会自动携带一个请求来源,如果后端存在交互,则会引发注入问题的产生。
  • User-Agent 请求头,该请求头携带的是用户浏览器的标识信息,如果此时带入数据库查询,则同样会触发注入问题的产生。
  • X-Forwarded-For:简称XFF头,它代表客户端,用于记录代理信息的,每经过一级代理(匿名代理除外),代理服务器都会把这次请求的来源IP追加在X-Forwarded-For中
  • Cookie:指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)
  • X-Real-IP:只记录真实发出请求的客户端IP。
  • Accept-Language:请求头允许客户端声明它可以理解的自然语言,以及优先选择的区域方言
  • HTTP_CLIENT_IP:该属性是PHP内置属性,同样取得的是客户端的IP,同样可控,如果带入数据库,则会产生注入问题。
    ……
    GET 、POST、 Cookie为与数据库进行交互时最常用的三种方法,一般称为GPC.与数据库有交互的地方均有可能存在注入。

2.2 注入数据类型分类(掌握)

数据类型分类来看,SQL注入分为数字型字符型

(1)数字型注入:注入点的数据拼接到SQL语句中是以数字型出现的,数据两边没有单引号、双引号括起来。
(2)字符型注入:注入点的数据两边有单引号、双引号括起来。
因此在sql注入时判断是数字型注入还是字符型注入非常有必要,因为要考虑到单引号、双引号的闭合问题,sql注入语句要逃出引号的包围。

2.3 注入手法分类(掌握)

(1)union联合查询注入
union查询注入是最基础的注入。在SQL中, UNION 操作符用于合并两个或多个 SELECT 语句的结果。union 查询注入利用 UNION 关键字可以追加一条或者多条额外的 SELECT 查询,并将结果追加到原始查询中。

(2)盲注
盲注指的是在不知道数据库返回值的情况下对数据中的内容进行猜测,实施SQL注入。主要分为布尔盲注基于时间的盲注

(3)报错注入
黑客攻击时常根据错误回显进行判断,但是现在非常多的Web程序没有正常的错误回显,这样就需要我们利用报错注入的方式来进行SQL注入了。

(4)堆叠查询注入
堆叠注入为攻击者提供了很多的攻击手段,通过添加一个新的查询或者终止查询,可以达到修改数据和调用存储过程的目的。

(5)二次注入
在将数据(一次注入的)存入到了数据库中之后,开发者就认为数据是可信的。在下一次进行需要进行查询的时候,直接从数据库中取出了脏数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入。比如在第一次插入数据的时候,数据中带有单引号,直接插入到了数据库中;然后在下一次使用中在拼凑的过程中,就形成了二次注入。

(6)宽字节注入
在使用PHP连接MySQL的时候,当设置“set character_set_client = gbk”时会导致一个编码转换的问题,这就是常说的宽字节注入。

(7)base64注入
base64注入是针对传递的参数被base64加密后的注入点进行注入。除了数据被加密以外,其中注入方式与常规注入一般无二。

3 SQL语句基础

为了更好地进行SQL注入,需要对SQL有所了解,在之前专栏学过的SQL基础语句后,此处对与SQL注入相关性较大的知识做一个温习。

3.1 简介

结构化查询语言(Structured Query Language,缩写SQL)是一种特殊的编程语言,用于数据库中的标准数据查询语言。1986年10越,美国国家标准学会对SQL进行规范后,以此作为关系式数据库管理系统(MYSQL、ACCESS、MSSQL、SQLSERVER、ORACLE)的标准语言。关系式数据库管理系统具有非常明显的层次结构,库名|表名|字段名|字段内容。

3.2 注释

mysql数据库的注释大概有以下几种:

#
-- (杠杠空格)
/*......*/
/*!......*/  内联查询

3.3 MySQL 元数据库 information_schema 内容简介

information_schema 数据库跟 performance_schema 一样,都是 MySQL 自带的信息数据库。其中 performance_schema 用于性能分析,而 information_schema 用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列的数据类型、访问权限等。
在这里插入图片描述
在该数据库中,有三个表对SQL注入帮助较大,分别是schemata表、tables表、和columns表。.
(1)schemata:记录当前 mysql 中所有数据库的信息。该表中字段名SCHEMA_NAME记录着所有数据库的名字。

(2)tables存储 mysql 中的所有表的信息。该表主要字段名如下:

  • TABLE_SCHEMA记录该表属于哪个数据库。
  • TABLE_NAME记录该表的名字。

(3)colunms存储 mysql 中所有字段信息。该表主要字段名如下:

  • TABLE_SCHEMA记录该字段名属于哪个数据库。
  • TABLE_NAME记录该字段属于哪个表。
  • COLUMN_NAME记录该字段名。
  • 在这里插入图片描述

3.4 MySQL 常用函数

可以利用select语句加上下列常用参数,来查询所需要的信息。比如select 1 <>2数据库将返回1,又比如select version()数据库将返回版本号 。常用参数如下,更多参数、运算符、函数参考文章《【SQL基础-2】SQL常用运算符及通配符》《【SQL基础-3】SQL常用函数》

(1)version() :返回当前数据库软件版本

select version();

在这里插入图片描述

(2)database() :返回当前数据库名

select database();

在这里插入图片描述

(3)user() :返回用户名

select user();

在这里插入图片描述
(4)current_user() :返回当前用户名

select current_user();

在这里插入图片描述
(5)system_user() :返回系统用户名

select system_user();

在这里插入图片描述
(6)@@datadir :返回数据库路径

select @@datadir;

在这里插入图片描述
(7)@@version_compile_os :返回操作系统版本

select @@version_compile_os

在这里插入图片描述
(8)字符串截取函数left()、right()、 mid()/substring()/substr();字符串连接函数concat()、concat_ws()、 group_concat();ord()返回第1个字符对应ASCII编码;rand()返回0-1之间的随机浮点数;sleep()睡眠时间为指定的秒数。具体参考《【SQL基础-3】SQL常用函数》。

4 总结

(1)掌握SQL注入漏洞的原理;
(2)掌握SQL注入漏洞的危害;
(3)掌握SQL注入分类方式及各分类方式的类型;
(4)加深SQL和数据库相关知识的理解。

参考文献

[1]《常见sql注入的类型》
[2] 《SQL注入及其危害、防御手段》
[3] 《十种MySQL报错注入》
[4] 《MySQL盲注:基于时间延迟注入9种方法》
[5] 《SQL注入-堆叠注入(堆查询注入)》
[6] 《MySQL 中的 information_schema 数据库》
[7] 《【SQL注入01】SQL注入漏洞简介、原理及类型》


http://chatgpt.dhexx.cn/article/8fE7oFcm.shtml

相关文章

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

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

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

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

数据库存储过程语法

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

存储过程语法--变量

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

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

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

Oracle存储过程语法学习

Oracle存储过程&#xff1a; 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申明变量&#xff1a; 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搬运工&#xff0c;实际开发中…

Oracle 存储过程语法

Oracle 存储过程语法 1. 创建表&#xff08;测试数据准备&#xff09; -- 创建用户表 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输入输出参数 本文小结 基本语法 存储过程就是具有名字的一段代码&#xff0c;用来完成一个特定的功能。创建的存储过程…

Oracle存储过程基本语法

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

存储过程常见语法

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

存储过程的语法讲解

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

子网掩码的作用

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

子网掩码使用详解

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

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

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

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

这里写目录标题 ip网络地址主机地址 子网子网掩码子网掩码的表示方法为什么要使用子网掩码&#xff1f;子网掩码的分类 网关默认网关 ip ip地址 网络地址 主机地址&#xff08;又称&#xff1a;网络号和主机号&#xff09;&#xff0c;我们把网络号相同的主机称之为本地网络…

子网划分和子网掩码

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

子网掩码详解

IP地址 IP地址被用来给Internet上的电脑一个编号。大家日常见到的情况是每台联网的PC上都需要有IP地址&#xff0c;才能正常通信。我们可以把“个人电脑”比作“一台电话”&#xff0c;那么“IP地址”就相当于“电话号码”&#xff0c;而Internet中的路由器&#xff0c;就相当于…

子网掩码的两种计算方式

&#xff08;尊重劳动成果&#xff0c;转载请注明出处&#xff1a;http://blog.csdn.net/qq_25827845/article/details/70946041冷血之心的博客&#xff09; 关注微信公众号&#xff08;文强的技术小屋&#xff09;&#xff0c;学习更多技术知识&#xff0c;一起遨游知识海洋~ …