厦门建网站公司,怎么做服装外贸网站,免费创建一个网页,济南设计开发appSQL注入系列文章#xff1a;初识SQL注入-CSDN博客
SQL注入#xff1a;联合查询的三个绕过技巧-CSDN博客
目录
什么是报错注入#xff1f;
报错注入常用的3个函数
UpdateXML
ExtractValue
Floor
rand#xff08;随机数#xff09;
floor#xff08;向上取整…SQL注入系列文章初识SQL注入-CSDN博客
SQL注入联合查询的三个绕过技巧-CSDN博客
目录
什么是报错注入
报错注入常用的3个函数
UpdateXML
ExtractValue
Floor
rand随机数
floor向上取整
count统计
group by分组 前面两篇和大家分享了SQL注入的基本知识和用法还有联合查询的三个常用技巧。
那么在本篇中我会和大家通过复习练习的形式一起学习一下SQL注入中的报错注入那么花不多少我们开始ヾ(◍°∇°◍)
什么是报错注入
在SQL注入的过程中如果网站的web服务器开启了错误回显则会被攻击者提供极大的便利
比如说我们可以在sqli-labs的第一关中闭合但是不注释后面的其他数据则前端页面就会直接报错且将报错信息直接展现在页面中 还有就是部分数据库执行出错时hiatus将参数内容添加到错误信息中如UpdateXML、ExtractValue等函数的第二个参数必须是Xpath格式当其格式非法时错误信息中会包含参数的内容这样我们就可以将需要获取的信息从错误信息中显示出来
报错注入常用的3个函数
extractvalueupdatexmlfloor
那么下面就分别使用这三个函数来演示一下SQL的报错注入
UpdateXML
根据Mysql官网的介绍UpdateXML和ExtractValue这两个都是XML函数具体的描述如下
姓名描述ExtractValue()使用 XPath 表示法从 XML 字符串中提取值UpdateXML()返回替换的 XML 片段
错误处理。 对于ExtractValue()和 UpdateXML()使用的 XPath 定位器必须有效并且要搜索的 XML 必须包含正确嵌套和闭合的元素。如果定位器无效则会生成错误
传参格式UpdateXML(xml_target, xpath_expr, new_xml) xml_target此函数用新的 XML 片段 替换给定 XML 标记片段的单个部分new_xml然后返回更改后的 XML。被替换的部分 xml_target匹配用户提供的 XPath 表达式xpath_expr 。
这里不需要懂得它的每个参数的具体含义只需要知道它需要传入三个参数参数即可
从上面的介绍可以看出UpdateXML函数的xpath也就是第二个参数必须要符合规范否则就会报错那么就可以利用这一点来进行报错注入
我们来在sqli-labs的第一关尝试一下
payload ?id1%27 and updatexml(1,concat(0x7e,(select user()),0x7e),1) --
从报错信息中可以看到显示XPATH的语法错误了然后后面就是我们注入出的数据库额度用户名
这里我们能够注入成功的原因就是将updatexml的第二个参数传入了一个不符合规范的值因此就会产生报错然后我们利用报错来注入出了用户名
然后我们就可以利用这样的方式再注入出数据库名
有了数据库名称我们就可以利用information_schema数据库来依次注入出表名列名最后注入出具体的数据
ExtractValue
传参格式ExtractValue(xml_frag, xpath_expr) ExtractValue()采用两个字符串参数一个 XML 标记片段 xml_frag和一个 XPath 表达式 xpath_expr也称为 定位器它返回CDATA第一个文本节点的文本 ( )该文本节点是与 XPath 表达式匹配的一个或多个元素的子元素。
这里同样不需要懂得它的每个参数的具体含义只需要知道它需要传入两个参数即可
从上面的介绍可以看出ExtractValue函数的xpath也就是第二个参数必须要符合规范否则就会报错那么就可以利用这一点来进行报错注入
这里还是在sqli-labs在第一关进行测试一下
这里的payload就是与ExtractValue不同的就是少了一个参数但也是在第二个参数中进行查询 ?id1 and extractvalue(1,concat(0x7e,(select user()),0x7e))--
当然也可以通过同样的方式查询出数据库的名称
后面的就不用再说了直接注入其他数据即可
Floor
最后一个就是floor函数了
主要的利用语句是 select count(),(floor(rand(0)*2))x from table group by x导致数据库报错通过 concat 函数连接注入语句与 floor(rand(0)*2)函数实现将注入结果与报错信息回显的注入方式。
这里可以看到利用floor函数进行报错注入会使用几个别的关键字这里先分别介绍一下
rand随机数
rand() 可以产生一个在0和1之间的随机数。
我们可以在mysql中看一下 可以看到rand函数每次都会生成一个1的随机小数
但是当我们给rand函数传入一个参数后那么它的值就会变成固定的了 floor向上取整
那么再来看看floor函数floor() 函数的作用就是返回小于等于括号内该值的最大整数。
在mysql中简单使用一下 从结果中可以看出确实如定义的那样取最小的整数那么将它和rand函数配合起来在数据库中使用会有什么效果呢 可以看到结果全是0如果换成floor(rand(0)*2)应该就是产生的数就是返回 0 到 2 之间的随机数再配合 floor() 就可以产生确定的两个数了。也就是 0 和 1 。试试看 可以看到这样果然就变得有的只有0和1了
count统计
count函数的作用统计结果的记录数。
比如我们需要知道users表中一共有多少条记录就可以使用count来统计一下
group by分组
那么再来看那可能group by它就是mysql的一个用于分组的函数直接举一个例子来演示一下 现在基于password来进行一个分组
可以看到一共有18条记录
几个函数都已经介绍完了那么最后再来看一下我们的payload是怎么来的吧
既然是报错注入首先就需要先进行报错
这个报错的意思就是它说group_key的主键重复了
根据前面函数这句话就是统计后面产生随机数的种类并计算每种数量。
分别产生0 1 1 0 1 1... 这样0是7个1是11个但是最后却产生了报错。
下面分析一下报错的原因
这个整合然后计数的过程中中间发生了什么我们是必须要明白的。 首先mysql遇到该语句时会建立一个虚拟表。该虚拟表有两个字段一个是分组的 key 一个是计数值 count()。也就对应于实验中的 user_name 和 count()。
然后在查询数据的时候首先查看该虚拟表中是否存在该分组如果存在那么计数值加1不存在则新建该分组。
然后mysql官方有给过提示就是查询的时候如果使用rand()的话该值会被计算多次那这个被计算多次到底是什么意思就是在使用group by的时候floor(rand(0)*2)会被执行一次如果虚表不存在记录插入虚表的时候会再被执行一次我们来看下floor(rand(0)2)报错的过程就知道了从上面的函数使用中可以看到在一次多记录的查询过程中floor(rand(0)2)的值是定性的为011011 (这个顺序很重要)报错实际上就是floor(rand(0)2)被计算多次导致的。
到此三种常见的报错注入函数和报错注入就介绍和演示完毕了后面的文章还会和大家分享更多的关于SQL注入的技巧和实验(^▽^)