SQL注入简介

结构化查询语言(Structured Query Language,缩写︰SQL),是一种特殊的编程语言,用于数据库中的标准数据查询语言。

SQL注入(SQL Injection)是一种常见的Web安全漏洞,主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱库、被删除、甚至整个服务器权限陷)。

  • sql注入在安全问题中排行第一

  • sql注入攻击是输入参数未经过滤,然后直接拼接到sql语句当中解析

  • sql注入是一种将sql代码添加到输入参数中,传递到服务器解析并执行的一种攻击手法

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

SQL注入原理

web应用程序在接收相关数据参数时未做好过滤,直接将其带入到数据库中查询,从而攻击者可以拼接执行构造的sql命令,导致了sql注入的发生。其成因可以归结外以下原因叠加造成的:

  1. 攻击者在页面提交恶意字符(例如单引号、空格、1=1等)

  1. 服务器未对提交参数进行过滤或过滤不足

  1. 攻击者利用拼接sql语句方式获取数据库敏感信息

SQL注入危害

攻击者利用SQL注入漏洞,可以获取数据库中的多种信息(例如︰管理员后台密码),从而脱取数据库中内容(脱库)。在特别情况下还可以修改数据库内容或者插入内容到数据库,如果数据库权限分配存在问题,或者数据库本身存在缺陷,那么攻击者可以通过SQL注入漏洞直接获取webshell(脚本木马,是通过服务器开放的端口获取服务器的某些权限)或者服务器系统权限

  • 获取web网页数据库--数据泄露

  • 用户数据被非法买卖

  • 危害web应用安全

sql注入分类

sql注入漏洞根据不同的标准,有不同的分类。

从数据类型分类来看,sql注入分为数字型和字符型。

数字型注入:注入点的数据,拼接到sql语句中是以数字型出现的,即数据两边没有被单引号、双引号包括。

字符型注入:注入点的数据两边有单引号、双引号括起来

根据注入手法分类,大致可分为以下几个类别:

  • UNION query SQL injection (可联合查询注入) union联合查询注入

  • Error-based SQL injection(报错型注入) 报错注入 这两种属于正常注入

  • Boolean-based blind SQL injection(布尔型注入) 布尔盲注

  • Time-based blind SQL injection(基于时间延迟注入) 延时注入 这两种属于盲注类别

  • Stacked queries SQL injection(可多语句查询注入) 主要目的是增删改,也叫堆叠查询

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

  1. 报错注入:攻击者在攻击时常根据错误回显进行判断,都是现在很多web应用程序没有正常得错误回显,我们就需要利用报错注入来进行sql注入

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

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

根据提交数据的位置进行分类:

可以分为get注入、post注入、cookie注入 GPC

sql注入点存在位置

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

  • GET 数据

  • POST 数据

  • HTTP 头部(HTTP 请求报文其他字段)

  • Cookie 数据

SQL注入点的判断

变换id参数

?id=1 变换id参数+1/-1,前提是有sql注入漏洞,页面发生变化则考虑为联合查询

也就是说,数据库中的内容会回显到网页中来。

初步判定,id参数会带入数据库查询,根据不同的id查询数据库,得到不同的网页内容。

猜测后台执行的SQL语句大致结构为:

select * from tbName where id=1;

单引号

【?id=1'】 判断sql注入类型,是字符型还是数字型

执行的SQL主语则变为

select * from tbName where id=1'

(报错显示有1是字符型注入,未显示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语句是由单引号包裹的

因此,此注入点(可能)为字符型注入。

【and 1=1】

[?id=1' and 1=1 --+]

可能得SQL语句为

select * from tbName where id=1' and 1=1 --+

页面正常。

【and 1=2】

[?id=1' and 1=2 --+]

可能得SQL语句

select * from tbName where id=1' and 1=2 --+

页面没有内容,并且数据库没有报错。由于1=2是恒假式,也就是查询条件[where id=35and 1=2--+]恒假,这样的SQL语句在数据库中执行后,没有返回结果,没有网页内容。

反过来看,页面没有内容,也就是SQL语句查询条件为假。也就是说,我们写的语句[and1=2 --+],起到了将查询条件置为假的作用。

那么,可以通过构造语句来控制SQL语句的查询结果并且,SQL语句查询条件真假性,在页面回显中有体现。

?id=35 and 1=1               是否有布尔类型的状态(如果是布尔类型的状态,则
?id=35 and 1=2               这两次页面的状态不同,如果相同则没有布尔类型 )
select * from tbName where id=35 and 1=1         True
select * from tbName where id=35 and 1=2         False

【and sleep(5)】

[?id=1' and sleep(5)] 是否有延时响应

注入sleep(5)语句,可以通过网络时间线看到延时。

说明sleep(5)语句起到了作用

综上,此连接存在SQL注入漏洞(除了变换id参数之外,其他判断条件出现其中任意一个,则存在sql注入)。

SQL语句

结构化查询语言(Structured Query Language)简称SQL,1974年由Boyce和Chamberlin提出,是一种关系型数据库查询的标准编程语言,用于存取数据以及查询、更新、删除和管理 关系型数据库。为什么强调标准语言?我们知道关系型数据的主要三大实现者分别是,Mysql,MS SQLServer,Oracle。

它们实现数据存储的底层引擎或许不同,但提供出来管理数据的编程语言必须遵循 SQL 规范,但可以定制添加属于自己的额外语法,这些额外的、SQL 之外的语法又被称作它们各自的『SQL方言』。

所以如果你拿着 SqlServer 的方言跑到 Mysql 里去执行,那很大程度上是会报错的。因为sqlserver和mysql虽然都遵循着sql规范,但是它们又添加了属于自己的语法。所以语法是有区别的

关系型数据库系统:具有非常明显的层次结构,库名/表名/字段名/字段内容.

MySQL注释

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

  • #

  • --(杠杠空格) (注入中经常用到的)

  • /* ..... */

  • /*! .... */ 内联查询

MySQL基础详情——>MySQL基础

MySQL元数据库information_schema

MySQL 5.0版本之后产生了一个虚拟数据库information_schema,在这个数据库中有三个很重要的表:

information_schema: 该数据表存储了mysql数据库中的所有数据库的库名
information_schema.tables: 该数据库存储了mysql数据库中的所有数据库的表名
information_schema.columns: 该数据库存储了mysql数据库中的所有列的列名

MySQL常用函数与参数

=/>/>=/<=/<> 例:select 1<>2;        比较运算符(等于、大于、大于等于、小于等于、不等于)
and(&/&&/与运算)/or(|/||/或运算)   逻辑运算符(例:select true and false;)
select version()                        返回MySQL数据库版本
select database()                       返回当前数据库名
select user()                           返回用户名
select current_user()                   返回当前用户名
select system_user()                    返回系统用户名
select @@datadir                          返回数据库路径
select @@version_compile_os               返回操作系统版本
select length()例:select('123456');    返回字符串的长度{例:select length(database());}select substring()                         返回截取字符串
substr()例:select substr(database(),1,1)   截取字符串{例:select substr(database(),1,1)
mid()                                      截取字符串1.截取的字符串2.截取起始位置,从1开始计数3.截取长度left()例:select left("123456",4);                    从左侧开始取指定字符个数的字符串
concat()例: select concat('a','b','c');                没有分隔符的连接字符串
concat_ws()例:select concat_ws("-",'a','b','c');       含有分隔符的连接字符串
group_conat()例:select group_conat(id) from student;  连接一个组的字符串
select ord()例:select ord('a');          返回ASCII码
select rand()例: select rand();          返回0-1之间的随机浮点数 最近的那个整数select left(rand(),3);
hex()                             将字符串转换为十六进制
unhex()                           hex的反向操作
select md5()                             返回MD5值
select floor(x)                          返回不大于x的最大整数 向下取值
select round()                           返回参数x接近的整数
load_file(文件的绝对路径)            读取文件,并返回文件内容作为一个字符串
sleep()例:select sleep(5);         睡眠时间为指定的秒数
if(true,t,f)例:select if(true,1,2);   if判断
select find_in_set()                       返回字符串在字符串列表中的位置
benchmark()                       指定语句执行的次数
select name_const()                        返回表作为结果

@逻辑运算

在SQL语句中逻辑运算与(and)比或(or)的优先级高

【select 1=2 and 1=2 or 1=1;】

注入流程:

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

首先获取数据库名,其次获取表名,然后获取列名,最后获取数据。

sql注入中的常见函数汇总

ascii(str) :                     返回给定字符的ascii值     如 ascii("a")=97
length(str) :                    返回给定字符串的长度,如  length("string")=6substr(string,start,length)      对于给定字符串string,从start位开始截取,截取length长度 ,如  substr("chinese",3,2)="in"substr()、stbstring()、mid()      三个函数的用法、功能均一致concat(username):                将查询到的username连在一起,默认用逗号分隔group_concat(字段1,'*',字段2):   将字段1和字段2的数据查询到一起,中间用*连接
count(table_name)                 返回表的个数if(expr1,expr2,expr3)             如果expr1的值为true,则返回expr2的值,如果expr1的值为false,则返回expr3的值。

【SQL注入漏洞-01】SQL注入漏洞原理及分类相关推荐

  1. 【XXE漏洞01】XML漏洞原理及实验

    目录 1 XML语言 2 XXE 漏洞简介 3 XXE 漏洞实验 3.1 实验环境 3.2 实验步骤 3.3 实验小结 4 XXE 漏洞修复建议 5 总结 1 XML语言 关于XML语言基础知识先了解 ...

  2. 【XSS漏洞-01】XSS漏洞简介、危害与分类及验证

    目录 1 XSS漏洞简介 2 XSS漏洞危害 3 XSS漏洞分类 3.1 反射型XSS 3.2 存储型XSS 3.3 DOM型XSS 3.3.1 节点树模型 3.3.2 DOM型XSS 4 漏洞验证 ...

  3. WEB漏洞攻防- SQL注入原理、判定方式、过滤及修复

    文章目录 SQL注入漏洞原理 结合简单的代码案例分析SQL注入漏洞是如何产生的 判断是否存在注入 最原始的判断是否存在注入的方式 传入的字符对页面内容存在影响极有可能存在注入 如何过滤.修复SQL注入 ...

  4. 墨者学院01 SQL手工注入漏洞测试(MySQL数据库)

    问题描述 鉴于我已经两周没能成功运行攻防世界的靶场环境...于是昨天又搜了一些网站,感觉墨者学院的题目还可以~ SQL手工注入虽然是一个已经被安全博主讲烂的主题,但是我之前很少有从头到尾实践手工注入的 ...

  5. sql md5函数_【学习笔记】常见漏洞:SQL注入的利用与防御

    第   21 课   SQL注入的利用与防御 课程入口(付费) 个人背景 李,本科,电子信息工程专业,毕业一年半,有JavaScript的,PHP,Python的语言基础,目前自学网络安全中. SQL ...

  6. 米斯特白帽培训讲义 漏洞篇 SQL 注入

    米斯特白帽培训讲义 漏洞篇 SQL 注入 讲师:gh0stkey 整理:飞龙 协议:CC BY-NC-SA 4.0 原理与危害 SQL 注入就是指,在输入的字符串中注入 SQL 语句,如果应用相信用户 ...

  7. 安全漏洞之SQL注入和shell注入

    SQL注入 发生部位 SQL注入安全漏洞发生于应用程序和数据库之间. 原理 当攻击者在输入的字符串之中注入SQL指令,由于程序没有设置相关的字符检查,那么这些指令就会被数据服务器认为是正常的SQL指令 ...

  8. WEB漏洞——SQL注入之简要SQL注入

    前言 sql注入是比较常见的网络攻击方式之一, 他不是利用操作系统的bug来实现攻击,而是针对程序员编写时的疏忽,通过sql语句,实现无账号登录,甚至篡改数据库. sql简介 sql是一门ANSI的标 ...

  9. web基础漏洞之SQL注入漏洞

    先看菜鸟教程中HTTP的知识,HTTP是为了保证客户端与服务器之间的通信.HTTP的请求方法有两种:GET和POST.GET是从服务器上获得数据,POST是向服务器传递数据. Web 程序三层架构: ...

最新文章

  1. 蚂蚁森林最高效的合种团队—招募有合作精神的队友云植树
  2. c# 4.0(vs2010)新特性一览
  3. LP Wizard 10.5破解步骤
  4. EJB 3.1全局JNDI访问
  5. python调用百度地图画轨迹图_[宜配屋]听图阁
  6. 《2021年度中国开发者有奖大调查》首批中奖名单火热出炉,下一个会是你吗?
  7. 怎么让图片居中php,怎么让CSS文件里图片居中
  8. sql 找不到oracle接口,sql-server – sql server链接服务器到oracle返回数据存在时找不到的数据...
  9. 使用servlet技术与前端进行交互,出现乱码的解决方案,创建一个类,如下:
  10. Python chardet
  11. java数据清洗_做数据分析必须了解的获取数据与清洗数据技巧
  12. Python处理 JSON 数据
  13. 食品进销存十大品牌排行榜新鲜出炉,来看看哪个最适合你
  14. mbedtls里面的rsa应用函数
  15. 【盘点】2014年跨境进口型电商十大模式
  16. php简单后台,ThinkPHP简单网站后台
  17. 在excel中如何筛选重复数据_Excel 在大量数据中快速筛选出重复数据
  18. python爬取音乐源码_手把手教你使用Python抓取QQ音乐数据(第一弹)
  19. js获取当前时间的年月日时分秒以及时间的格式化
  20. 学习笔记59—收藏这7个在线配色神器,再也不愁配色灵感了

热门文章

  1. nginx的日志放在哪里?
  2. JobIntentService
  3. 毫米波雷达的系统设计细节(1) - 从雷达方程到雷达威力图
  4. 基于Python的旅游数据可视化系统flask
  5. 布尔类型(boolean)常量与变量
  6. Verilog HDL高级数字设计 从零学习(一)
  7. mysql 前面7天时间_mysql获取7天前数据,日期比较
  8. F2FS文件系统架构与原理分析(五)——元数据组织及管理
  9. 系统软件和应用软件的划分
  10. Python3调用百度翻译API进行英文翻译