课程目标:讲解什么是整型报错注入,以及四种报错函数。组织实验使学生学会使用整型报错注入获得网站后台的账户密码。
任务目标:了解什么是整型报错注入,以及四种报错函数。学会使用整型报错注入获得网站后台的账户密码。
A.什么是整型报错注入
整型报错注入
所谓整型报错注入,整型是注入点的数据类型,报错是信息的显示方式。
整型
一种PHP文件中关联MySQL的语句。
Id为字符型
文章图片
闭合字符报错
文章图片
字符型注入
文章图片
另一种PHP文件中关联MySQL的语句。
Id为整型
文章图片
整形注入
文章图片
报错
文章图片
联合查询可以把我们想要的数据展示在网页上,替代网页上原有的数据内容,但要是没有显示怎么办?
文章图片
信息出现在报错语句中。
文章图片
mysql_error()函数返回上一个MySQL操作产生的文本错误信息。
文章图片
不能用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是如何共同工作的。首先,系统会建立一个虚拟表:
文章图片
假设有一个表
文章图片
执行count(*) from ... group by age的过程中,会形成这样的虚拟表:
文章图片
由于group by的是age,第一次读取的就是18,在虚拟表中寻找是否已经存在18,由于表是空的,直接插入一条新数据,这时虚拟表变成下图这样,
文章图片
下一个是19,由于虚拟表中依旧没有key为19的字段,故插入。再下一个是20,继续插入。再下一个又是20,由于已经有了20,故将key为20的字段的count(*)值加1,变为了2.剩下的以此类推,最后形成了这个虚拟表:
文章图片
先来回顾一下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...吧?下面开始运算。
首先,建立一张虚拟表:
文章图片
接着,进行group by floor(rand(0)2)。floor表达式第一次运算的值为0,在表中没有找到key为0的数据,故插入,在插入的过程中需要再取一次group by后面的值(即再进行一次floor运算,结果为1),取得了1,将之插入,并将count()置1。
文章图片
再进行group by floor(rand(0)2)。进行floor表达式运算,由于这是第三次运算了,故值为1。刚好表中有了key为1的数据,故直接将其对应的count()加1即可。
文章图片
继续进行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()就会引起一个溢出错误。
文章图片
~是一个位运算符,它的作用是按位取反。将0按位取反就会返回“18446744073709551615”,再加上函数成功执行后返回0的缘故,我们将成功执行的函数取反就会得到最大的无符号BIGINT值。
我们通过子查询与按位求反,造成一个报错,并借由此注出数据。
文章图片
本文参考:网络安全培训、网络安全工程师(奇安信)收藏夹吃灰系列_哔哩哔哩_bilibili
【Web安全|网络安全--SQL注入整型报错注入】
推荐阅读
- 网络安全|【网络安全】XSS跨站脚本攻击专题讲解
- 项目中的那些事|Spark SQL执行多次join后越来越慢,最后出现OOM
- Spring|SpringBoot整合常用组件
- SQL注入|SQLmap的下载和安装,以及其参数大全和使用教程(值得收藏)
- 小技巧|csrf和ssrf的区别
- 黑客技巧|nmap在kali的使用方法和常见命令(入门)
- 安全|ISCC-WP
- 基本DOS命令|基本DOS命令用法
- database|17@MySQL数据库读现象详解(脏读、幻读、不可重复读)