草庐IT

#yyds干货盘点#sql注入总结

尼羲 2023-03-28 原文

一、介绍


1.什么是SQL注入?

sql 注入是一种将 sql 代码添加到输入参数中,传递到 sql 服务器解析并执行的一种GJ手法。

2.SQL注入的原理

SQL 是操作数据库数据的结构化查询语言,网页的应用数据和后台数据库中的数据进行交互时会采用 SQL。而 SQL 注入是将 Web 页面的原 URL、表单域或数据包输入的参数,修改拼接成 SQL 语句,传递给 Web 服务器,进而传给数据库服务器以执行数据库命令。

3.形成SQL注入的原因

用户输入的数据被 SQL 解释器执行。

4.SQL注入的危害

1、GJ者未经授权可以访问数据库中的数据,盗取用户的隐私以及个人信息,造成用户的信息泄露。2、通过操作数据库对某些网页进行篡改;3、修改数据库一些字段的值,嵌入网马链接,进行挂马GJ。4、服务器被远程控制,被安装后门。可以对数据库的数据进行增加或删除操作,例如私自添加或删除管理员账号。5、数据库被恶意操作:数据库服务器被GJ,数据库的系统管理员帐户被篡改。6、破坏硬盘数据,导致全系统瘫痪。

5.SQL注入基本知识

注:以下命令语句均基于 MySQL 数据库

(1)增删改查语句

增 Insert

基本语法 ​​INSERT INTO 表名称 VALUES (值1, 值2,....)​​例子 insert into student(name,sex,age) values('张三',18,'男')

删 delete

基本语法 ​​DELETE FROM 表名称 WHERE 列名称 = 值​​例子 delete from student where id=1
改 update

基本语法 ​​UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值​​列子 update student set name = '张三' where id=1

查 select

基本语法 ​​SELECT 列名称 FROM 表名称​​例子 select * from student

(2)系统函数

  • version()——MySQL 版本
  • user()——数据库用户名
  • database()——数据库名
  • @@datadir——数据库路径
  • @@version_compile_os——操作系统版本

(3)字符串连接函数

​concat(str1,str2,...)​​​没有分隔符地连接字符串
​​​concat_ws(separator,str1,str2,...)​​​含有分隔符地连接字符串
​​​group_concat(str1,str2,...)​​连接一个组的所有字符串,并以逗号分隔每一条数据

(4)一般流程

Mysql 有一个系统数据库 information_schema,存储着所有的数据库的相关信息,一般的, 我们利用该表可以进行一次完整的注入。以下为一般的流程。
猜数据库
​select schema_name from information_schema.schemata​

猜某库的数据表
​select table_name from information_schema.tables where table_schema=’xxxxx’​

猜某表的所有列
​Select column_name from information_schema.columns where table_name=’xxxxx’​

获取某列的内容
​​​Select *** from ****​

二、分类


根据输入参数分为

  • 数字型注入
  • 字符型注入
根据注入技巧分为

  • 联合注入
  • 盲注
  • 堆叠注入
  • 报错注入
  • 二次注入
  • 宽字节注入
根据提交类型分为

  • GET 注入
  • POST 注入
  • COOKIE 注入
  • HTTP 头部注入

1.根据输入参数分类的 SQL 注入

(1)数字型注入

我们经常可以看到这样的 url ​​http://xxx.com/users.php?id=1​​ 基于此种形式的注入,一般被叫做数字型注入,这是因为其注入点 id 类型为数字。这一类的 SQL 语句原型一般为 select * from 表名 where id=1。

(2)字符型注入

我们有时又会看到这样的 url ​​http://xxx.com/users.php?name=admin​​ 基于此种形式的注入,一般被叫做字符型注入,这是因为其注入点 name 类型为字符串。这一类的 SQL 语句原型一般为 select * from 表名 where name='admin'

2.根据注入技巧分类的 SQL 注入

(1)联合注入

什么是联合注入?

联合注入顾名思义,就是使用联合查询进行注入的一种方式,是一种高效的注入的方式,适用于有回显同时数据库软件版本是5.0以上的 MYSQL 数据库。

union 操作符介绍

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

(2)盲注

什么是盲注?

盲注就是在注入过程中,获取的数据不能回显至前端页面。此时我们需要利用一些方法进行判断或尝试,这个过程称为盲注

盲注的分类

a.布尔盲注
什么是布尔盲注?

布尔盲注是指利用页面返回的对错信息来间接推测数据库中的信息的一种手段。(构造逻辑判断)

适用条件:布尔盲注一般适用于页面没有回显字段(不支持联合查询),且 web 页面返回 True 或者 false 时。

常用函数

截取函数:left() right() substr() mid()
转换函数:ascii() hex()
比较函数:if()
b.时间盲注
什么是时间盲注?

时间盲注又称延时注入,指通过页面执行的时间来判断数据内容的注入方式。

什么时候使用?

当注入时,无论我们传入什么值,网页正常或报错都显示一种页面时,那么网页的是否正常显示将不是我们用来判断是否注入成功的依据,就要用基于时间的盲注。

方法:通过if判断语句与 sleep 函数结合,通过网站访问的响应时间来判断sql语句的正确性

示例:​​if(left(database(),1)='s',0,sleep(3))​​这段 payload 的含义是如果数据库的第一位为's'时,网页正常执行,否则延时3秒

c.报错盲注
什么是报错盲注?

是指通过构造特定的SQL语句,让GJ者想要查询的信息通过页面的错误提示回显出来的注入方式

什么时候使用:当正常的回显注入无法显示结果,网页可以显示报错信息时,就可以使用报错注入

常见的报错函数

1)floor 报错注入

在进行报错注入时,floor()函数一般需要与rand()、count()、group by联用。

示例

​Select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2)) a from information_schema.columns group by a​

原理

rand() 随机产生0~1的数值,floor() 向下取整,所以 floor(rand()*2结果是0或1。

group by 用于分组,当同时执行count和group by函数时,MYSQL会创建一个虚拟表,虚拟表进行计数和分组。在执行group by语句的时候,group by语句后面的字段会被运算两次。

floor会报错的原因就是group by在向临时表插入数据时,插入重复主键导致的报错,又因为报错之前concat()里的语句已经执行过了,所以会直接爆出concat函数里执行后的结果

2)exp 报错注入

示例

​select exp(~(select * FROM(SELECT USER())a))​

原理

exp()即为以e为底的对数函数,exp中的函数成功执行后返回0,对0按位取反会返回一个无符号的BIGINT值,所以会造成Double型数据溢出错误从而报错,借此得到数据。

3)extractvalue 和 updatexml 报错注入

示例

​extractvalue(1,concat(0x7e,(select @@version),0x7e))​updatexml(1,concat(0x7e,(select @@version),0x7e),1)

原理

当使用 extractvalue(xml_frag, xpath_expr) 函数时,若 xpath_expr 参数不符合 xpath 格式,就会报错。而 ~ 符号(ascii 编码值:0x7e)是不存在 xpath 格式中的, 所以一旦在 xpath_expr 参数中使用 ~ 符号,就会产生 xpath syntax error (xpath语法错误),通过使用这个方法就可以达到报错注入的目的。
updatexml同理

(3)堆叠注入

什么是堆叠注入?

顾名思义,堆叠注入就是将一堆 sql 语句叠加在一起执行,使用分号结束上一个语句再叠加其他语句一起执行。

堆叠注入产生的原因?

服务器在访问数据端时使用了可同时执行多条 sql 语句的方法,比如 php 中的mysqli_multi_query()函数

联合注入与堆叠注入的区别

union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于 union 或者 union all 执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。

有关#yyds干货盘点#sql注入总结的更多相关文章

  1. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

  2. Hive SQL 五大经典面试题 - 2

    目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类

  3. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  4. ruby - 这个 ruby​​ 注入(inject)魔术是如何工作的? - 2

    我今天看到了一个ruby​​代码片段。[1,2,3,4,5,6,7].inject(:+)=>28[1,2,3,4,5,6,7].inject(:*)=>5040这里的注入(inject)和之前看到的完全不一样,比如[1,2,3,4,5,6,7].inject{|sum,x|sum+x}请解释一下它是如何工作的? 最佳答案 没有魔法,符号(方法)只是可能的参数之一。这是来自文档:#enum.inject(initial,sym)=>obj#enum.inject(sym)=>obj#enum.inject(initial){|mem

  5. sql - 在 Rails Console for PostgreSQL 的表中显示数据 - 2

    我找到了这样的东西:Rails:Howtolistdatabasetables/objectsusingtheRailsconsole?这一行没问题:ActiveRecord::Base.connection.tables并返回所有表但是ActiveRecord::Base.connection.table_structure("users")产生错误:ActiveRecord::Base.connection.table_structure("projects")我认为table_structure不是Postgres方法。如何列出Postgres数据库的Rails控制台中表中的所有

  6. ruby - 防止SQL注入(inject)/好的Ruby方法 - 2

    Ruby中防止SQL注入(inject)的好方法是什么? 最佳答案 直接使用ruby?使用准备好的语句:require'mysql'db=Mysql.new('localhost','user','password','database')statement=db.prepare"SELECT*FROMtableWHEREfield=?"statement.execute'value'statement.fetchstatement.close 关于ruby-防止SQL注入(inject

  7. ruby-on-rails - 如何在 Rails 中的不同数据库上执行直接 SQL 代码 - 2

    我正在编写一个Rails应用程序,它将监视某些特定数据库的数据质量。为了做到这一点,我需要能够对这些数据库执行直接SQL查询——这当然与用于驱动Rails应用程序模型的数据库不同。简而言之,这意味着我无法使用通过ActiveRecord基础连接的技巧。我需要连接的数据库在设计时是未知的(即:我不能将它们的详细信息放在database.yaml中)。相反,我有一个模型“database_details”,用户将使用它来输入应用程序将在运行时执行查询的数据库的详细信息。因此与这些数据库的连接实际上是动态的,细节仅在运行时解析。 最佳答案

  8. Simulink方法总结和避坑指南(一)——Simulink入门与基本调试方法 - 2

    文章目录一、项目场景二、基本模块原理与调试方法分析——信源部分:三、信号处理部分和显示部分:四、基本的通信链路搭建:四、特殊模块:interpretedMATLABfunction:五、总结和坑点提醒一、项目场景  最近一个任务是使用simulink搭建一个MIMO串扰消除的链路,并用实际收到的数据进行测试,在搭建的过程中也遇到了不少的问题(当然这比vivado里面的debug好不知道多少倍)。准备趁着这个机会,先以一个很基本的通信链路对simulink基础和相关的debug方法进行总结。  在本篇中,主要记录simulink的基本原理和基本的SISO通信传输链路(QPSK方式),计划在下篇记

  9. Ruby:映射和注入(inject)之间的区别 - 2

    在此处阅读有关SO的各种解释,它们是这样描述的:map:Themapmethodtakesanenumerableobjectandablock,andrunstheblockforeachelement注入(inject):Injecttakesavalueandablock,anditrunsthatblockonceforeachelementofthelist.希望你明白为什么我觉得它们表面上看起来很相似。我什么时候会选择一个而不是另一个,它们之间有什么明显的区别吗? 最佳答案 如果您认为inject也别名为reduce,这

  10. sql - Rails:使用 Postgres 创建对象时重复 ActiveRecord::RecordNotUnique? - 2

    我正在使用Rails4应用程序,它需要创建大量对象以响应来自另一个系统的事件。当我调用create!时,主键列上出现非常频繁的ActiveRecord::RecordNotUnique错误(由PG::UniqueViolation引起)我的模型之一。我在SO上找到了其他答案,建议挽救异常并调用retry:beginTableName.create!(data:'here')rescueActiveRecord::RecordNotUnique=>eife.message.include?'_pkey'#Onlyretryprimarykeyviolationslog.warn"Retr

随机推荐