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

课程目标:讲解什么是整型报错注入,以及四种报错函数。组织实验使学生学会使用整型报错注入获得网站后台的账户密码。
任务目标:了解什么是整型报错注入,以及四种报错函数。学会使用整型报错注入获得网站后台的账户密码。
A.什么是整型报错注入 整型报错注入
所谓整型报错注入,整型是注入点的数据类型,报错是信息的显示方式。
整型
一种PHP文件中关联MySQL的语句。
Id为字符型
Web安全|网络安全--SQL注入整型报错注入
文章图片

闭合字符报错
Web安全|网络安全--SQL注入整型报错注入
文章图片

字符型注入
Web安全|网络安全--SQL注入整型报错注入
文章图片

另一种PHP文件中关联MySQL的语句。
Id为整型
Web安全|网络安全--SQL注入整型报错注入
文章图片

整形注入
Web安全|网络安全--SQL注入整型报错注入
文章图片

报错
Web安全|网络安全--SQL注入整型报错注入
文章图片

联合查询可以把我们想要的数据展示在网页上,替代网页上原有的数据内容,但要是没有显示怎么办?
Web安全|网络安全--SQL注入整型报错注入
文章图片

信息出现在报错语句中。
Web安全|网络安全--SQL注入整型报错注入
文章图片

mysql_error()函数返回上一个MySQL操作产生的文本错误信息。
Web安全|网络安全--SQL注入整型报错注入
文章图片

不能用group_concat()一次性列出所有数据,只能用limit依次拆解。
B.报错函数 Updatexml()
UPDATEXML(XML_docement,XPath_string,new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,这一项可以输入一个十六进制形式的字符,如“0x23”等。
第二个参数:new_value,String格式,替换查找到的符合条件的数据,在注入中可以加入任意字符。
该函数的作用是改变文档中符合条件的节点的值,改变XML_document中符合XPATH_string的值。
Web安全|网络安全--SQL注入整型报错注入
文章图片

Floor()
payload:select count(),floor(rand(0)2)as a from information_schema.tables group by a;
先来解释一下count(*)与group by是如何共同工作的。首先,系统会建立一个虚拟表:
Web安全|网络安全--SQL注入整型报错注入
文章图片

假设有一个表
Web安全|网络安全--SQL注入整型报错注入
文章图片

执行count(*) from ... group by age的过程中,会形成这样的虚拟表:
Web安全|网络安全--SQL注入整型报错注入
文章图片

由于group by的是age,第一次读取的就是18,在虚拟表中寻找是否已经存在18,由于表是空的,直接插入一条新数据,这时虚拟表变成下图这样,
Web安全|网络安全--SQL注入整型报错注入
文章图片

下一个是19,由于虚拟表中依旧没有key为19的字段,故插入。再下一个是20,继续插入。再下一个又是20,由于已经有了20,故将key为20的字段的count(*)值加1,变为了2.剩下的以此类推,最后形成了这个虚拟表:
Web安全|网络安全--SQL注入整型报错注入
文章图片

先来回顾一下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...吧?下面开始运算。
首先,建立一张虚拟表:
Web安全|网络安全--SQL注入整型报错注入
文章图片

接着,进行group by floor(rand(0)2)。floor表达式第一次运算的值为0,在表中没有找到key为0的数据,故插入,在插入的过程中需要再取一次group by后面的值(即再进行一次floor运算,结果为1),取得了1,将之插入,并将count()置1。
Web安全|网络安全--SQL注入整型报错注入
文章图片

再进行group by floor(rand(0)2)。进行floor表达式运算,由于这是第三次运算了,故值为1。刚好表中有了key为1的数据,故直接将其对应的count()加1即可。
Web安全|网络安全--SQL注入整型报错注入
文章图片

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

Extractvalue()
EXTRACTVALUE (XML_document,XPath_string);
第一个参数:XML_document是String格式,为XML文档对象的名称,这一项可以输入一个十六进制形式的字符,如“0x23”等。
第二个参数:XPath_string是Xpath格式的字符串,报错注入时需要写入错误的格式来显示错误的信息。
该函数的作用是从目标XML中返回包含所查询值的字符串。
Web安全|网络安全--SQL注入整型报错注入
文章图片

Exp()
exp()函数返回e(自然对数的底)的x次方的值。
当向exp()传递一个大于709的值时,函数exp()就会引起一个溢出错误。
Web安全|网络安全--SQL注入整型报错注入
文章图片

~是一个位运算符,它的作用是按位取反。将0按位取反就会返回“18446744073709551615”,再加上函数成功执行后返回0的缘故,我们将成功执行的函数取反就会得到最大的无符号BIGINT值。
我们通过子查询与按位求反,造成一个报错,并借由此注出数据。
Web安全|网络安全--SQL注入整型报错注入
文章图片


本文参考:网络安全培训、网络安全工程师(奇安信)收藏夹吃灰系列_哔哩哔哩_bilibili
【Web安全|网络安全--SQL注入整型报错注入】

    推荐阅读