SQL注入类型总结

发布 : 2019-04-15

Union注入

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

所以可以在存在注入的地方利用Union语句查询其他语句,注意要把id的值改为一个错误值,这样能返回出union后面查询的结果。

Boolean注入

代码根据数据库查询结果只返回正确和错误,而不返回任何数据,所以只能根据页面的正确和错误的特征来判断语句是否执行成功。

报错注入

当数据库语句执行错误时,会将错误信息输出出来,如果存在宝座注入,就可以想办法构造一些语句,使数据通过错误信息输出出来。

首先了解下updatexml()函数

1
2
> UPDATEXML (XML_document, XPath_string, new_value); 
>

第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc

第二个参数:XPath_string (Xpath格式的字符串)

第三个参数:new_value,String格式,替换查找到的符合条件的数据

作用:改变文档中符合条件的节点的值

改变XML_document中符合XPATH_string的值

报错注入的注入语句为updatexml(1,concat(0x7e,(SELECT user()),0x7e),1),其中的concat()函数是将其连成一个字符串,因此不会符合XPATH_string的格式,从而出现格式错误,爆出

1
ERROR 1105 (HY000): XPATH syntax error: ':root@localhost'

还有其他的用于报错注入的语句

ExtractValue
测试语句如下

and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));

floor

可以通过如下一些利用代码

and select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a);

and (select count(*) from (select 1 union select null union select !1)x group by concat((select table_name from information_schema.tables limit 1),floor(rand(0)*2)));

时间注入

时间注入和布尔注入非常类似,时间注入是根据页面相应的时间来进行判断,这里使用的是if判断语句和sleep()函数。

1
if(length(database())>1,sleep(5),1)

这个语句的意思是,如果数据库名字长度大于1,那么mysql休眠5秒钟,否则执行1,查询1的时间大约几毫秒,所以查看页面响应时间可以轻松知道语句是否正确执行。

堆叠查询注入

堆叠查询注入是执行多条语句,因为多个语句可以用分号隔开,所以可以利用这个特点来执行别的语句,堆叠注入语句为

1
';select if(substr(user(),1,1)='r',sleep(5),1) #

可以看出这里也用到了时间注入的盲注语句,使用堆叠注入时通常无法获得第二个语句的数据,所以大多使用盲注的语句来获得具体数据。

宽字节注入

当id是使用单引号包围的,但是处理程序会将传入的单引号被反斜线转义,这时,如果数据库的编码为GBK就可以使用宽字节注入,这是在地址后先加一个%df再加单引号,因为反斜杠的编码为%5c在GBK编码中,%df%5c是繁体字”運”,所以这时候单引号逃逸,导致mysql数据库错误。

Cookie注入

通过$_COOKIE能够获取浏览器cookie中的数据,所以如果网页是使用cookie传递数据,并且没有进行过滤,就会造成cookie注入,可以通过burp suite抓取数据包并进行修改。

base64注入

base64

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。

Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码具有不可读性,需要解码后才能阅读。

Base64由于以上优点被广泛应用于计算机的各个领域,然而由于输出内容中包括两个以上“符号类”字符(+, /, =),不同的应用场景又分别研制了Base64的各种“变种”。为统一和规范化Base64的输出,Base62x被视为无符号化的改进版本。

base64注入是针对传递的参数被base64加密后的注入点进行注入。这种方式常用来绕过一些WAF的检测。sqlmap的扩展模块–tamper base64encode就可用于base64注入

XFF注入

X-Forwarded-For简称XFF头,它代表了客户端的真实IP,通过修改他的值就可以伪造客户端IP。

1)判断是否存在注入

使用Burp的Repeater模块对请求进行修改,分别修改X-Forwarded-For的值如下所示:

X-Forwarded-for: 127.0.0.1

X-Forwarded-for: 127.0.0.1’

X-Forwarded-for: 127.0.0.1’ and 1=1#

X-Forwarded-for: 127.0.0.1’ and 1=2#

访问的结果如下,说明存在SQL注入漏洞。

本文作者 : W4rnIn9
原文链接 : http://joner11234.github.io/article/undefined.html
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!