SQL注入类型

2023-11-18

SQL注入类型详解
SQL 注入是指web应用程序对用户输入数据控制不严格,导致用户输入数据被拼接到SQL语句中被数据库执行导致的安全问题,按照注入方式可以分为联合注入、布尔盲注、时间盲注、堆叠注入以及报错注入等五种注入方式。在sql注入时影响返回单行的不仅仅是sql 语句的问题,有时是代码层面的问题。

判断注入是否存在
and 1=1,and 1=2 返回页面数据不同
?id=3-1,返回数据内容不同
添加’、""以及其他特殊符号报错

联合注入
前提要求:数据会进行回显,页面有显位符,在一个在一个网站的正常页面,服务端执行SQL语句查询数据库中的数据,客户端将数 据展示在页面中,这个展示数据的位置就叫显示位

在判断注入点是否存在后,首先可以使用联合查询判断当前数据库类型、版本信息以便于进一步进行注入

因为联合查询要求两个语句所查询的字段数与类型需要一致,因此,在进行联合查询之前首先应当判断查询语句中涉及的字段数为多少,使用order by 字段加数字的方法进行测试,order by 原本用来对查询结果进行排序,后面跟上的字段或者数字表示根据那一列来进行排序,若超出结果,则会进行报错,因此可以判断出原本查询中涉及多少个字段。


select * from user where id=1 order by 5;
1
判断列数之后,可以首先判断该网站数据库类型,版本等信息进行进一步的注入,因为程序在获取返回数据时,有时只会获取第一列返回内容,这时,我们便需要在id出填入根本查询不出内容的数值或者字符,使得程序返回我们需要的结果


以下实验以mysql 为例。
查询数据库名

select * from user where id =1 union select 1, schema_name from infornamtion_schema.schemata;
1


查询某个数据库中的表名

select * from user where id=1 union select 1,table_name from information_schema.tables where table_schema="test";
1


查询student 中的字段名

select * from user where id =1 union select 1,column_name from information_schema.columns where table_schema="test" and table_name="student";
1


查询student 表中的内容,限制返回行数时,使用limit一行行单个的取值,也结合使用concat 同时取多个字段的值。


布尔盲注
布尔为计算机中的一种数据类型,分为true、False两种类型,盲注则是表示注入过程中数据不会回显,只能根据页面返回两种内容的的不同来判断注入语句判断的内容是否正确。

在布尔盲注中通常需要使用连接符号and、or等字符来连接两个字符串,根据上面联合注入的步骤

布尔盲注时的语句结构

select * from user where id= 1 and (select substr((select schema_name from information_schema.schemata limit 1,1),1,1)="m"); 
1
首先查询数据库名,

select schema_name from information_schame.schemata limit 1,1;
1
可以见到查询结果为mysql,下面将使用布尔盲注的方法对那个字段进行猜解


首先猜解之前应当判断内容的长度


下面对mysql 对局库每个字段进行猜解,猜解错是不返回内容


猜解正确是返回内容,


可能页面返回内容不是根据数据是否回显来判断,但是正确与错误总会存在不同。
之后根据步骤一步步进行猜解即可,猜解内容时若是遇到单双引号过滤的情况,可以使用ord(),ascii()进行ascii转码之后再进行猜解。
错误


正确


时间盲注
时间类型的盲注本质是利用插入的SQL语句执行造成时间延迟;在猜解正确或者失败时执行造成时间延迟的语句,辅助判断是否内容猜解正确。

常用sql盲注时造成时延的方法
sleep()
benchmark()
笛卡尔积
get_lock()函数
sleep()使用

sleep()函数造成时间延迟十分简单,直接在函数中填写响应的秒数即可,如sleep(5);

benchmark()使用

用法benchmark(count,expr),会重复计算expr表达式count次,通过这种方式就可以评估出mysql执行这个expr表达式的效率。多次执行即可造成时间延迟

笛卡尔积

具体的方式就是将简单的表查询不断的叠加,使之以指数倍运算量的速度增长,不断增加系统执行 sql 语句的负荷,直到产生攻击者想要的时间延迟,这就非常的类似于 dos 这个系统,由于每个数据库的数据量差异较大,并且有着自己独特的表与字段,所以为了使用这种方式发起攻击,我们不能依赖于不同数据库的特性而是要依赖于数据库的共性,也就是利用系统自带的表和字段来完成攻击,下面是一个能够在 SQL SERVER 和 MYSQL 中成功执行的模板

SELECT count(*) FROM information_schema.columns A,information_schema.columns B,information_schema.columns C;
1
根据数据库查询的特点,这句话的意思就是将 A B C 三个表进行笛卡尔积(全排列),并输出 最终的行数

get_lock()函数使用限制条件
连续使用两次get_lock(str,time),若是第一次执行成功,那个第二次将延时对应填写的时间。

限制条件就是数据库的连接必须是持久连接,我们知道 mysql_connect() 连接数据库后开始查询,然后调用 mysql_close() 关闭与数据库的连接,也就是 web 服务器与数据库服务器连接的生命周期就是整个脚本运行的生命周期,脚本结束连接即断开,但是很明显这里我们要利用的是前一个连接对后一个连接的阻碍作用导致延时,所以这里的连接必须是持久的。

时间盲注实战。
在时间盲注中,需要一个sql语句的结果能够在猜解正确或者错误是执行延时方法来验证,可以使用 and、or ,也可以使用if()函数来进行时间盲注,还可以使用elt()函数来做时间盲注,但是过程可能要更过复杂。

and 与 or

select * from user where id =1 and (select substr((select database()),1,1)="t") and sleep(5); 
select * from user where id =1 and (substr((select database()),1,1)="t") and sleep(5); //这样也行
1
2


使用and 与 or的主要根据就是他俩的逻辑

and X and sleep(3)   //若X 为假则不会执行,为真则执行sleep()函数

or X  or sleep(3)  //若X 为真则不会执行,为加则执行sleep()函数
1
2
3
if 函数的使用较未加单

if(x,真,假)
select * from user where id =1 and if(SUBSTR((select database()),1,1)="t",sleep(3),1);
1
2


sleep(),多种方法嵌套到上面提到的格式中

select * from user where id =1 and if(SUBSTR((select database()),1,1)="t",sleep(3),1);
1
benchmark()

benchmark(100000,sha(1))
1
笛卡尔积

SELECT count(*) FROM information_schema.columns A,information_schema.columns B,information_schema.columns C;
1
get_lock()

X and get_lock('th1e',5);%23
X and get_lock('th1e',1);%23
1
2
堆叠注入

堆叠注入的使用条件十分有限,其可能受到 API 或者数据库引擎,又或者权限的限制只有 当调用数据库函数支持执行多条 sql 语句时才能够使用,利用 mysqli_multi_query()函数就支持多条 sql 语句同时执行,但实际情况中,如 PHP 为了防止 sql 注入机制,往往使用调用数据库的函数是 mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执行,所 以可以说堆叠注入的使用条件十分有限,一旦能够被使用,将可能对网站造成十分大的威胁。

堆叠注入即多语句注入,格式如下

select * from user where id = 1;select database();
1
报错注入
SQL报错注入就是利用数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。这种手段在联合查询受限且能返回错误信息的情况下比较好用,目前对于各种不同类型数据库,不同版本数据库报错注入时可能并不能通用,常用可以通用的报错注入的方式有两种,xpath注入和主键重复导致的报错

xpath报错注入
xpath报错注入主要依赖于两个函数extractvalue(),updatexml()这两个函数的主要作用是对xml文档进行操作。版本限制mysql5.1.5以及之后。

extractvalue()
语法:extractvalue(文档,路径)

select name from user where id =1 and extractvalue('1',concat('~',(select database())));
1


updatexml()除了语法与extractvalue()略有不同外,使用方法基本相同
语法 updatexml(文档,路径,更新的内容)

主键重复报错注入
count()和group by在遇到rand()产生的重复值时报错,具体解释可以参考https://xz.aliyun.com/t/253,

 select count(*) from user group by concat(version(),floor(rand(0)*2));
1


按照查询类型分类
按照另一种分类方式,sql注入又可以分为,数字型注入、字符型注入和搜索型注入,当注入点的值原本为整数等数值是,这时的注入为数字型注入,注入点数据为被引号包裹的字符串时,这时的注入则为字符型注入,搜索型注入其原形大致为:select * from 表名 where 字段 like ‘%关键字%’

其他类型的注入方式
目前主要测试注入时均是对查询型进行测试,其中删除、更新、插入数据时注入练习较少,所以也写一下。

update 注入
update user set name ="go" where name="" and updatexml(1,concat('~',(select version())),1);
1


delete 注入
DELETE from user  where id =6 and  X;//x 代表注入的语句。
1
insert 注入
报错注入出数据

insert into user(id,name) values(6,"" or updatexml('1',concat('~',(select database())),1) or "");
insert into user(id,name) values(6,"X") or "");//x代表语句,使用updatexml 时则可以嵌套sql语句
1
2


修复方式
预编译
安全函数的使用
最低权限原则
关闭数据库错误回显
用户输入内容判断
预编译可以预防sql注入的原因

预编译可以防止sql注入的原因是:采用了预编译,程序就会将sql语句:“select id, no from user where id=?” 预先编译好,也就是SQL引擎会预先进行语法分析,产生语法树,生成执行计划,也就是说,后面你输入的参数,无论你输入的是什么,都不会影响该sql语句的 语法结构了,因为语法分析已经完成了,而语法分析主要是分析sql命令,比如 select ,from ,where ,and, or ,order by 等等。所以即使你后面输入了这些sql命令,也不会被当成sql命令来执行了,因为这些sql命令的执行, 必须先的通过语法分析,生成执行计划,既然语法分析已经完成,已经预编译过了,那么后面输入的参数,是绝对不可能作为sql命令来执行的,只会被当做字符串字面值参数。所以sql语句预编译可以防御sql注入。

若有错误,请各位斧正。

参考
https://www.cnblogs.com/SCHAOGES/p/10889654.html
https://www.anquanke.com/post/id/170626
https://bealright.github.io/2019/07/25/sql%E6%B3%A8%E5%85%A5%E5%AD%A6%E4%B9%A0%E2%80%94%E2%80%94%E6%97%B6%E9%97%B4%E7%9B%B2%E6%B3%A8/
https://zhuanlan.zhihu.com/p/35245598
https://cloud.tencent.com/developer/article/1631808 https://blog.csdn.net/whatday/article/details/63683187
https://blog.csdn.net/weixin_42277564/article/details/80583959
https://www.cnblogs.com/digdeep/p/4715245.html
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL注入类型 的相关文章

  • IIF(...) 不是公认的内置函数

    我正在尝试在 Microsoft SQL Server 2008 R2 中使用它 SET SomeVar SomeOtherVar IIF SomeBool value when true value when false 但我收到一个错误
  • mysql表中的数据非常大。即使 select 语句也需要很多时间

    我正在开发一个数据库 它是一个相当大的数据库 有 13 亿行和大约 35 列 这是我检查表状态后得到的结果 Name Table Name Engine InnoDB Version 10 Row format Compact Rows 1
  • 使用连接池后如何处理过多的并发连接?

    Scenario 假设您有一个拥有大量流量的网站或应用程序 即使使用数据库连接池 性能也会受到真正的打击 站点 应用程序甚至可能崩溃 因为并发连接太多 Question 人们有什么选择来处理这个问题 我的想法 我在想有这个问题的人可以创建多
  • 将布尔参数传递给 SQL Server 存储过程

    我早些时候问过这个问题 我以为我找到了问题所在 但我没有 我在将布尔参数传递给存储过程时遇到问题 这是我的 C 代码 public bool upload false protected void showDate object sende
  • 如何使用原始 SQL 查询实现搜索功能

    我正在创建一个由 CS50 的网络系列指导的应用程序 这要求我仅使用原始 SQL 查询而不是 ORM 我正在尝试创建一个搜索功能 用户可以在其中查找存储在数据库中的书籍列表 我希望他们能够查询 书籍 表中的 ISBN 标题 作者列 目前 它
  • 如何为我的整个 Node.js 应用程序使用相同的 MySQL 连接?

    我有一个app js 我从那里运行我的整个应用程序 在 app js 内部 我require许多文件中都有代码 对于每个文件 我都这样做 var mysql require mysql var mclient mysql createCon
  • 使用来自另一个数据库的选择查询更新 mysql 表

    我有两个数据库 我想用另一个数据库表中的值更新一个表 我正在使用以下查询 但它不起作用 UPDATE database1 table1 SET field2 database2 table1 field2 WHERE database1 t
  • PDO语法错误

    我在一个项目中使用 PDO 但提交时出现语法错误 这是我的代码
  • 连接到 OpenShift (Redhat Paas) mysql 实例

    我正在尝试将我的 C 应用程序与 openshift 数据库连接 但我得到了这个例外conn Open Eccezione gt MySql Data MySqlClient MySqlException 0x80004005 Unable
  • MySQL 和 PHP 参数 1 作为资源

    好吧 当我运行下面提到的代码时 PHP 向我抛出此错误 在日志中 Error mysql num rows 期望参数 1 为资源 第 10 行 place 中给出的字符串 9 11号线 queryFP SELECT FROM db coun
  • SQL查询查找具有特定数量关联的行

    使用 Postgres 我有一个架构conversations and conversationUsers Each conversation有很多conversationUsers 我希望能够找到具有确切指定数量的对话conversati
  • JDBC 错误:在结果集开始之前[重复]

    这个问题在这里已经有答案了 我在 Java Eclipse 中收到错误消息 我在 MySql 中有一个数据库 它有列 String user name int id time int id desk int user password 我想
  • Dapper 或 MySql 未找到包含句号“.”的存储过程。

    我有一个简单的 C 控制台 它使用 Dapper ORM 调用本地 MySql 数据库 以执行名为的存储过程users UserCreate 但是 当运行查询时 我收到一个异常 在数据库 用户 中找不到过程或函数 UserCreate Bu
  • 显示和随机化 php 数组

    我有一个显示结果的数组 如下所示 Array 0 gt 71 1 gt 56 2 gt 64 3 gt 82 4 gt 90 5 gt 80 6 gt 65 7 gt 62 8 gt 14 9 gt 3 我的代码是 while row my
  • MySql 视图脚本中的注释

    可以这样做吗 我尝试过多个 gui mysql workbench navicat toad for mysql 但没有一个保存这样的注释 something important select something else importan
  • SQL Server 中离线索引重建和在线索引重建有什么区别?

    重建索引时 有一个选项ONLINE OFF and ONLINE ON 我知道当ONLINE模式打开时 它会复制索引 切换新查询以利用它 然后重建原始索引 使用版本控制跟踪两者的更改 如果我错了 请纠正我 但是 SQL 在离线模式下会做什么
  • 使用 MYSQL 将 h:mm pm/am 时间格式插入数据库

    我正在尝试将以 h mm am pm 格式写入的时间插入到存储为标准 DATETIME 格式 hh mm ss 的数据库中 但我不知道如何将发布的时间转换为标准格式所以数据库会接受它 这是我到目前为止一直在尝试的 title POST in
  • MySQL 概念:会话与连接

    我对 MySQL 的概念有点困惑 会话与连接 当谈论连接到 MySQL 时 我们使用连接术语 连接池等 然而在 MySQL 在线文档中 http dev mysql com doc refman 4 1 en server system v
  • 使用用户定义函数 MySql 时出错

    您好 请帮我解决这个问题 提前致谢 我在数据库中定义了这些函数 CREATE FUNCTION levenshtein s1 VARCHAR 255 s2 VARCHAR 255 RETURNS INT DETERMINISTIC BEGI
  • 需要在 SQL Server 中透视字符串值

    我有一个包含值的表 描述为 Occupation String Name String Developer A Developer B Designer X Coder Y Coder Z 我需要数据透视格式的值 Designer Deve

随机推荐

  • 解决 ifconfig: command not found

    apt get install net tools
  • Swing简单的文件上传

    package com iss iaf codemanagement import javax swing JOptionPane 代码管理应用程序 项目的入口 author xinzhangah data 2016 12 02 publi
  • 区块链能否推进教育行业的发展?

    随着互联网时代的到来 现在教育行业的教学模式 已经脱离了原先的黑板板书以及书本就读 信息的传播化将传统的教育行业带入了快速接受信息的时代 而不管是网上选课还是课程的在线直播 都是要通过第三方的平台才可以获取这些信息的 但是在方便人们学习的时
  • Distributed System Transaction —— 2PL

    文章目录 2PL 并发控制常见的方式有2PL MVCC等方式 2PL 两阶段锁 two phase locking 是用来解决多线程之间的竞态条件的 其算法非常简单 数据库中的每一个数据对象都有两种锁 S hared lock 和 e X
  • 移动端表格组件

    最近在vue开发移动端过程中 需要用到表格展示 经过多方面对比感觉这个不错 https www csdn net tags Mtjacg4sOTk1NDctYmxvZwO0O0OO0O0O htmlhttps www csdn net ta
  • 软件测试系统学习流程和常见面试题

    在学习软件测试的时候你是否会感觉到不知从何下手 今天教导你们软件测试学习的系统流程和面试常见的问题 学习流程 一 必备技能 1 编程基础 能看懂前端页面 掌握一门语言 php python java等 2 数据库知识 建议准备好sql语言
  • 自然语言处理: 第七章GPT的搭建

    自然语言处理 第七章GPT的搭建 理论基础 在以transformer架构为框架的大模型遍地开花后 大模型的方向基本分成了三类分别是 decoder only架构 其中以GPT系列为代表 encoder only架构 其中以BERT系列为代
  • QT---UI的使用

    目录 一 UI的介绍 二 UI的使用 一 UI的介绍 UI的使用是指通过拖拽控件来绘制界面 二 UI的使用
  • Java设计模式——外观模式

    文章目录 外观模式 外观模式 外观模式是为了解决类与类之家的依赖关系的 像spring一样 可以将类和类之间的关系配置到配置文件中 而外观模式就是将他们的关系放在一个Facade类中 降低了类类之间的耦合度 该模式中没有涉及到接口 看下类图
  • 【自然语言处理

    文章目录 一 前言 二 详细介绍 2 1 token 2 2 embedding 2 3 encoding 一 前言 token 模型输入基本单元 比如中文BERT中 token可以是一个字 也可以是等标识符 embedding 一个用来表
  • python 判断字符串开头_python 怎么判断字符串开头

    函数 startswith 作用 判断字符串是否以指定字符或子字符串开头 python学习网 大量的免费python视频教程 欢迎在线学习 一 函数说明 语法 string startswith str beg 0 end len stri
  • Scanner类用法(学习笔记)

    Scanner类用法 学习笔记 后续会补充 1 next 用法 package com yushifu scanner import java util Scanner util java工具包 Scanner类 获取用户的输入 Scann
  • Java与Javascript比较(js入门)

    一 不同点 Java代码需要编译才能执行 而JS代码不需要编译就能执行 Java是基于服务端的语言 JS是基于客户端的语言 什么叫基于服务端和基于客户端 简单理解 就是需要在服务端执行的或需要在客户端执行的 js的基本语法 1 js的注释方
  • AndroidStudio显示Minimum supported Gradle version is 6.5

    AndroidStudio显示Minimum supported Gradle version is 6 5错误的解决办法 其实就是你导入的项目使用的Android gradle 插件 与当前你的Android studio 的Androi
  • 树状数组理论与实现

    理论 http www cnblogs com zhangshu archive 2011 08 16 2141396 html 今天听了大神的讲课 了解了点东西 发现是之前学过的 于是试着再写一遍 include
  • flutter text 左对齐_Flutter 基础布局Widgets之Wrap详解

    概述 Wrap好似Row和Column的结合 在横轴的表现和Row一致 而竖轴的表现和Column一致 比如当 this direction Axis horizontal 时 横轴 的child放置不下时就会在竖轴自动扩展一行 构造函数
  • webpack4 devServer 参数分析

    devServer module exports 各个参数 after function app server 在服务内部的所有其他中间件之后 提供执行自定义中间件的功能 allowedHosts array 此选项允许你添加白名单服务 允
  • Nginx路由--Location 的使用

    1 Location 语法规则 语法规则 location uri 首先匹配 其次匹配 其次是按文件中顺序的正则匹配 最后是交给 通用 匹配 当有匹配成功时候 停止匹配 按当前匹配规则处理请求 符号 含义 开头表示精确匹配 开头表示 uri
  • docker 与 k8s

    kubernetes 简称k8s 因为k和s 中间有 ubernete 8个单词 所以简称k8s 是一个开源的 用于管理云平台中多个主机上的容器化的应用 k8s 的目标是让部署容器化的应用简单并且高效 k8s 提供了应用部署 规划 更新 维
  • SQL注入类型

    SQL注入类型详解 SQL 注入是指web应用程序对用户输入数据控制不严格 导致用户输入数据被拼接到SQL语句中被数据库执行导致的安全问题 按照注入方式可以分为联合注入 布尔盲注 时间盲注 堆叠注入以及报错注入等五种注入方式 在sql注入时