SQL注入简单总结

news2024/11/20 20:29:01

一、SQL注入是什么

      SQL注入即:是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

本质上来说 SQL注入就是 将用户输入的数据当作代码来执行 

这其中包含两个关键的条件:1、用户能够控制输入  2、原本程序要执行的代码 拼接了用户输入的数据。

二、SQL注入会在那些地方出现

如图  总结一句话:一切可以与数据库进行交互的地方

三、SQL注入的分类

根据数据的传输方式

GET类型 POST类型 COOKIE类型

根据数据的类型

数字型 字符型

根据注入的模式

基于联合查询的注入模式  基于报错的注入模式  基于布尔的盲注  基于时间的盲注  推查询的注入模式

四、SQL注入的一般步骤

注:根据注入类型的不同 步骤也会有不同

以下是联合查询会经常用到的语句 要记一下

例如:

select table_name from information_schema.tables where table_schema ='lizhi';//查询名为‘lizhi’的数据库的所有表
select column_name from information_schema.columns where table_schema ='lizhi' and 'table_name'= 'lizhi_jett'//查询名为‘lizhi’的数据库中的名为‘lizhi_jett’的表中的所有列名

SQL注入读写文件的根本条件:

数据库允许导入导出(secure_file_priv)
当前用户文件操作权限(File_priv)


五、实战演练

(不管何种注入模式 最开始都要先判断是否存在注入)

1、基于联合查询的注入

查列数

id=1 order by 4 --+

报错即没有这么多列 我们可以将4改为3 2 1以此类推根据回显得出有几列

得到列数后我们需要知道那几列可以回显 那么我们可以根据回显看是第几列可以回显 这个时候我们只需要把回显的列数字改为我们想要查询的数据 如database() 就可以知道数据库名了

id=1 and 1=2 union select 1,2,3,4 --+

知道数据库名了我们就可以查表了

例如:数据库名为 lizhi 那么 我们就可以用查询语句查出来我们的表名

id=1 and 1 = 2 union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema = 'lizhi'

表名知道了我们就可以查列名

例如:表名为lizhi_jett

id=1 and 1=2 union select 1,group_concat(column_name),3,4 from information.schema.column where table_schema='lizhi' and table_name='lizhi_jett' --+

求字段内容

例如:列名分别为 name password email

id=1 and 1=2 union select 1,group_concat(name,0x23,password),3,4 from lizhi.lizhi_jett --+

2、基于报错的注入

页面有报错信息时优先考虑使用报错注入

常用的报错函数

实例

SQL注入——sqli-labs第五关_sql注入第五关-CSDN博客

重点也是floor报错注入

select count(),(floor(rand(0)2))x from table group by x

利用 select count(),(floor(rand(0)2))x from table group by x,导致数据库报错,通过 concat 函数,连接注入语句与 floor(rand(0)*2)函数,实现将注入结果与报错信息回显的注入方式。

关键函数说明
1.rand函数

rand() 可以产生一个在0和1之间的随机数。

可见,直接使用rand函数每次产生的数都不同,但是当提供了一个固定的随机数的种子0之后

值就固定了  也可以称之为伪随机(产生的数据都是可预知的

2.floor(rand(0)*2)函数

floor() 函数的作用就是返回小于等于括号内该值的最大整数。

而rand() 是返回 0 到 1 之间的随机数,那么floor(rand(0))产生的数就只是0,无法产生报错。

因为我们刚才也看了 rand(0)出来的数字是固定的 且是0~1之间 floor函数是向下取整 这样我们就只能得到0
所以 我们使用了floor (rand(0)*2)来让我们的返回值不全为0

3.group by 函数

group by 主要用来对数据进行分组(相同的分为一组)。


首先我们在查询的时候是可以使用as(as可省略)用其他的名字代替显示的:

然后就可以用group by函数进行分组,并按照x进行排序
注意:最后x这列中显示的每一类只有一次,前面的a的是第一次出现的id值

4.count(*)函数

count(*)统计结果的记录数。

与group by结合使用看一下:

是对重复性的数据进行了整合,然后计数,后面的x就是每一类的数量。

综合使用产生报错:

select count(*),floor(rand(0)*2) x from users group by x;

按照我们刚才对函数的理解 这句语句应该执行后是出现 0 1 1 0 1 1然后被分组后只有0 1 然后被计数 所以应该呈现给我们的表为

0  2
1  4

但是最后却报错了

报错分析

这个整合然后计数的过程中,中间发生了什么我们是必须要明白的。 首先mysql遇到该语句时会建立一个虚拟表。该虚拟表有两个字段,一个是分组的 key ,一个是计数值 count()。也就对应于实验中的 user_name 和 count()。 然后在查询数据的时候,首先查看该虚拟表中是否存在该分组,如果存在那么计数值加1,不存在则新建该分组。
       然后mysql官方有给过提示,就是查询的时候如果使用rand()的话,该值会被计算多次,那这个"被计算多次"到底是什么意思,就是在使用group by的时候,floor(rand(0)*2)会被执行一次,如果虚表不存在记录,插入虚表的时候会再被执行一次,我们来看下floor(rand(0)*2)报错的过程就知道了,从上面的函数使用中可以看到在一次多记录的查询过程中floor(rand(0)*2)的值是定性的,为011011 (这个顺序很重要),报错实际上就是floor(rand(0)2)被计算多次导致的。

我们还原一下具体的查询过程:

建立虚拟表 取第一条记录执行floor(rand(0)*2)的时候发现结果为0(这里取前6次的数作为实验数据 前六次为 0 1 1 0 1 1)
这个时候查询虚拟表 发现0的键值不存在 此时要插入键值则会再次执行floor(rand(0)*2) 注意这个时候取到的值就变为1了  所以1 作为键值插入了虚拟表

PS:不知道为什么又执行了一次的话 再好好看一下报错分析

继续查询第二条记录 发现还是1 1的键值存在 则count数加1 虽然只插入了两次但这是第三次计算floor(rand(0)*2)了

再次查询虚表,(0 1 1 已经计算完了该第四个数了 又是0)发现键值没有0,则数据库尝试插入一条新的数据,在插入数据时floor(rand(0)*2)被再次计算, 算到第五个数字1 作为虚表的主键,其值为1(第5次计算),插入。

这个时候就出问题了 

然而1这个主键已经存在于虚拟表中,而新计算的值也为1(主键键值必须唯一),所以插入的时候就直接报错了。

整个查询过程floor(rand(0)*2)被计算了5次,查询原数据表3次,所以这就是为什么数据表中需要最少3条数据,使用该语句才会报错的原因。

3、布尔盲注

核心思想:利用判断语句来证明推测是否正确 推测正确时,页面正常显示;错误时 页面异常

一般来说猜值我们可以用到python写个脚本来爆库名表名

4、时间盲注

特点︰页面不存在异常,且即无回显也无报错信息
利用∶只能利用条件语句结合执行时间的长短来判断payload是否正确

六、WAF绕过

1.大小写混合

原因:服务器端检测时未开启大小写不敏感

形式:Unlon SeLecT

2.多重关键字/双写

原因:服务器端检测到敏感字符时替换为空

形式: ununionion selselectect

3.编码

原因:服务器端未检测或检测不严具有编码形式的关键字类型:十六进制编码、URL编码、Unicode编码
形式:0x61646d696e、%20、%u0020

4.注释

原因:服务器端未检测或检测不严注释内的字符串

形式:/*/,/*!*/,/*!12345*/,#,---等

5.等价函数

原因:服务器端黑名单不完整,过滤不严

形式:Mysql查询: Union distinct、updatexml、Extractvalue、floor

字符串截取函数: mid、substr、substring、left、reverse

字符串连接函数:concat、group_concat、concat_ws

字符串转换: char、hex、unhex

替换逗号: limit 1 offset 0,mid(version() from 1 for 1)替换等号: like

6.特殊符号

原因:数据库中效果相同,服务器端却没有限制
形式:
科学记数法 and 1e0 = 1e0
空白字符%0a %a0 %0b %20 %09
反单引号‘table_name'
括号 select *From (test.admin)

七、SQL注入常用工具

sqlmap 
阿D
穿山甲
Havij(胡萝卜)

SQLmap常用命令

Python sqlmap.py -h显示基本帮助信息

Python Sqlmap.py -hh显示高级帮助信息

Web安全工具—Sqlmap常用命令和参数(持续更新)_sqlmap常用指令和参数-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【论文推导】基于有功阻尼的转速环PI参数整定分析

前言 在学习电机控制的路上,PMSM的PI电流控制是不可避免的算法之一,其核心在于内环电流环、外环转速环的设置,来保证转速可调且稳定,并且保证较好的动态性能。整个算法仿真在《现代永磁同步电机控制原理及matlab仿真》中已详细给出…

前端项目中使用插件prettier/jscodeshift/json-stringify-pretty-compact格式化代码或json数据

同学们可以私信我加入学习群! 正文开始 前言一、json代码格式化-选型二、json-stringify-pretty-compact简单试用三、prettier在前端使用四、查看prettier支持的语言和插件五、使用prettier格式化vue代码最终效果如图: ![在这里插入图片描述](https://im…

3.8设计模式——State 状态模式(行为型)

意图 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 结构 Context(上下文)定义客户感兴趣的接口;维护一个ConcreteState子类的实例,这个实例定义当前状态。State(状态)定义…

[x86] OpenBMC简介

什么是 OpenBMC? OpenBMC 被设计为一个完整的开源 Linux 发行版,可以灵活地进行定制以支持不同的 SoC 或主板。 传统的BMC由固件提供商专有构建,是闭源的,这意味着它不具有在开放平台上修改的灵活性。 另一方面,OpenB…

链栈的基本操作(c语言实现)

栈的概念 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 栈的结构 定义栈…

做抖音小店,“自然流量”和“达人带货”,选择哪个更香?

大家好,我是电商笨笨熊 做抖音小店,关于选择自然流还是达人带货,从推出时就一直争吵到现在; 有人觉得自然流不需要佣金,一次性带来的爆单量很大; 有人觉得达人带货细水长流,虽然需要佣金&…

Docker 网络与资源控制

一 Docker 网络实现原理 Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根 据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默 认网关。因为在同…

2000-2022年各区县农产品产量数据

2000-2022年县域农产品产量数据 1、时间:2000-2022年 2、指标:统计年度、县域名称、所属地级市、所属省份、地区编码ID、县域代码、产品种类或名称、单位、产量、 3、来源:统计局、县域统计年鉴、各区县政府官网 4、范围:具体…

基于Linux的Ncurse库的贪吃蛇项目

贪吃蛇项目的意义 承上启下:从C语言基础的学习:数据结构链表基础、C变量、流程控制、函数、指针、结构体等。过渡到Linux系统编程:文件编程、进程、线程、通信、第三方等。 Linux终端图形库curses curses的名字起源于"cursor optimiz…

算法学习笔记Day8——回溯算法

本文解决几个问题: 回溯算法是什么?解决回溯算法相关的问题有什么技巧?回溯算法代码是否有规律可循? 一、介绍 1.回溯算法是什么? 回溯算法就是个多叉树的遍历问题,关键在于在前序和后序时间点做一些操作…

大学生在线考试|基于SprinBoot+vue的在线试题库系统系统(源码+数据库+文档)

大学生在线考试目录 基于SprinBootvue的在线试题库系统系统 一、前言 二、系统设计 三、系统功能设计 试卷管理 试题管理 考试管理 错题本 考试记录 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍&#…

wps屏幕录制怎么用?分享使用方法!

数字化时代,屏幕录制已成为我们学习、工作和娱乐中不可或缺的一部分。无论是制作教学视频、分享游戏过程,还是录制网络会议,屏幕录制都能帮助我们轻松实现。WPS作为一款功能强大的办公软件,其屏幕录制功能也备受用户青睐。本文将详…

【LLM多模态】Qwen-VL模型结构和训练流程

note 观点:现有很多多模态大模型是基于预训练(和SFT对齐)的语言模型,将视觉特征token化并对齐到语言空间中,利用语言模型得到多模态LLM的输出。如何设计更好的图像tokenizer以及定位语言模型在多模态LLM中的作用很重要…

LeetCode54. 螺旋矩阵

LeetCode54.螺旋矩阵 题解思路 代码 class Solution { public:vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> res;int n matrix.size();// 行int m matrix[0].size(); // 列vector<vector<bool>> st(n, v…

分步搭建HF区块链网络--部署fabric区块链--加入channel

一.搭建网络规划 采用容器环境&#xff0c;搭建1个排序节点(Orderer)、2个对等节点(Peer)&#xff0c;另外用 一个fabric-cli容器。实训中的绝大部分命令是通过该容器执行的。 容器名称设置 二. 配置HF网络证书 首先docker ps 检查镜像&#xff0c;确保镜像为空 1.生成crypto…

leaftjs+turfjs+idw纯前端实现等值面绘图

最近有个绘制等值面图的需求。我们一般的实现路径是&#xff1a; 1.后台绘图&#xff0c;用surfer绘制好&#xff0c;给前端调用叠加到地图。 2.后台用python绘图&#xff0c;绘制好给前端调用&#xff0c;叠加到地图。 3.后台进行插值计算、地图裁剪、最终生成geojson文件或…

[集群聊天项目] muduo网络库

目录 网络服务器编程常用模型什么是muduo网络库什么是epoll muduo网络库服务器编程 网络服务器编程常用模型 【方案1】 &#xff1a; accept read/write 不是并发服务器 【方案2】 &#xff1a; accept fork - process-pre-connection 适合并发连接数不大&#xff0c;计算任…

第一篇:Python简介:开启你的编程之旅

Python简介&#xff1a;开启你的编程之旅 在这个系列文章中&#xff0c;我将带领大家深入了解Python——一个极具魅力的编程语言。如果你对编程感兴趣&#xff0c;想要掌握一门既实用又强大的语言&#xff0c;那么Python无疑是一个绝佳的选择。本篇文章是这个系列的序章&#…

文件包含漏洞基础

php 中的文件包含函数&#xff1a; incude &#xff1a; require incude_once require_once 为了减少重复性代码的编写&#xff1b; 任意后缀的文件当中只要存在 php 代码就会被当作 php 执行&#xff1b; 本质&#xff1a;由于包含的文件不可控&#xff0c;导致文件包含…

S32K的JLINK与PE接线方法与刷程序失败问题

S32K的JLINK与PE接线方法与刷程序失败问题 1、PE的接线方法2、JLINK的接线方法3、刷程序失败问题 1、PE的接线方法 2、JLINK的接线方法 3、刷程序失败问题 出现如下问题&#xff1a; Secure Debug might be enabled on this device.lf so.please unlock the device via PEmic…