网络安全--SQL注入整型报错注入

课程目标:讲解什么是整型报错注入,以及四种报错函数。组织实验使学生学会使用整型报错注入获得网站后台的账户密码。

任务目标:了解什么是整型报错注入,以及四种报错函数。学会使用整型报错注入获得网站后台的账户密码。

A.什么是整型报错注入

整型报错注入

所谓整型报错注入,整型是注入点的数据类型,报错是信息的显示方式。

整型

一种PHP文件中关联MySQL的语句。

Id为字符型

 

闭合字符报错

网络安全--SQL注入整型报错注入_第1张图片 

字符型注入

网络安全--SQL注入整型报错注入_第2张图片 

另一种PHP文件中关联MySQL的语句。

Id为整型

 

整形注入

网络安全--SQL注入整型报错注入_第3张图片 

报错

网络安全--SQL注入整型报错注入_第4张图片 

联合查询可以把我们想要的数据展示在网页上,替代网页上原有的数据内容,但要是没有显示怎么办?

网络安全--SQL注入整型报错注入_第5张图片 

信息出现在报错语句中。

网络安全--SQL注入整型报错注入_第6张图片 

mysql_error()函数返回上一个MySQL操作产生的文本错误信息。

网络安全--SQL注入整型报错注入_第7张图片 

不能用group_concat()一次性列出所有数据,只能用limit依次拆解。

B.报错函数

Updatexml()

UPDATEXML(XML_docement,XPath_string,new_value);

第一个参数:XML_document是String格式,为XML文档对象的名称,这一项可以输入一个十六进制形式的字符,如“0x23”等。

第二个参数:new_value,String格式,替换查找到的符合条件的数据,在注入中可以加入任意字符。

该函数的作用是改变文档中符合条件的节点的值,改变XML_document中符合XPATH_string的值。

 

Floor()

payload:select count(),floor(rand(0)2)as a from information_schema.tables group by a;

先来解释一下count(*)与group by是如何共同工作的。首先,系统会建立一个虚拟表:

网络安全--SQL注入整型报错注入_第8张图片 

假设有一个表

网络安全--SQL注入整型报错注入_第9张图片 

执行count(*) from ... group by age的过程中,会形成这样的虚拟表:

网络安全--SQL注入整型报错注入_第10张图片 

由于group by的是age,第一次读取的就是18,在虚拟表中寻找是否已经存在18,由于表是空的,直接插入一条新数据,这时虚拟表变成下图这样,

网络安全--SQL注入整型报错注入_第11张图片 

下一个是19,由于虚拟表中依旧没有key为19的字段,故插入。再下一个是20,继续插入。再下一个又是20,由于已经有了20,故将key为20的字段的count(*)值加1,变为了2.剩下的以此类推,最后形成了这个虚拟表:

网络安全--SQL注入整型报错注入_第12张图片 

先来回顾一下payload:select count(), floor(rand(0)2) as a from information_schema.tables group by a;

总体是一个group by语句,只不过这里group by的是floor(rand(0)2)。这是一个表达式,每次运算的值都是随机的。还记得我刚刚说的floor(rand(0)2)的值序列开头是011011...吧?下面开始运算。

首先,建立一张虚拟表:

网络安全--SQL注入整型报错注入_第13张图片 

接着,进行group by floor(rand(0)2)。floor表达式第一次运算的值为0,在表中没有找到key为0的数据,故插入,在插入的过程中需要再取一次group by后面的值(即再进行一次floor运算,结果为1),取得了1,将之插入,并将count()置1。

网络安全--SQL注入整型报错注入_第14张图片 

再进行group by floor(rand(0)2)。进行floor表达式运算,由于这是第三次运算了,故值为1。刚好表中有了key为1的数据,故直接将其对应的count()加1即可。

网络安全--SQL注入整型报错注入_第15张图片 

继续进行group by。这是第四次floor运算了,根据刚刚那个011011序列,这次的值为0,在表中找是否有key为0的数据。当然没有,故应当插入一条新记录。在插入时进行floor运算(就像第一次group by那样),这时的值为1,并将count(*)置1.可是你会说,虚拟表中已经有了key为1的数据了啊。对,这就是问题所在了。此时就会抛出主键冗余的异常,也就是所谓的floor报错。

 

Extractvalue()

EXTRACTVALUE (XML_document,XPath_string);

第一个参数:XML_document是String格式,为XML文档对象的名称,这一项可以输入一个十六进制形式的字符,如“0x23”等。

第二个参数:XPath_string是Xpath格式的字符串,报错注入时需要写入错误的格式来显示错误的信息。

该函数的作用是从目标XML中返回包含所查询值的字符串。

 

Exp()

exp()函数返回e(自然对数的底)的x次方的值。

当向exp()传递一个大于709的值时,函数exp()就会引起一个溢出错误。

网络安全--SQL注入整型报错注入_第16张图片 

~是一个位运算符,它的作用是按位取反。将0按位取反就会返回“18446744073709551615”,再加上函数成功执行后返回0的缘故,我们将成功执行的函数取反就会得到最大的无符号BIGINT值。

我们通过子查询与按位求反,造成一个报错,并借由此注出数据。

 

本文参考:网络安全培训、网络安全工程师(奇安信)收藏夹吃灰系列_哔哩哔哩_bilibili

你可能感兴趣的:(Web安全,sql,网络安全,mysql)