十种MYSQL显错注入原理讲解(一)

 开篇我要说下,在《代码审计:企业级Web代码安全架构》这本书中讲十种MYSQL显错注入,讲的很清楚。

感兴趣请去读完,若处于某种原因没读还想了解,那请继续往下。

1、count,rand,floor

select * from test where id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a);

函数解释:

  count:是用来统计表中或数组中记录的一个函数。

  rand:调用可以在0和1之间产生一个随机数。

  floor:函数只返回整数部分,小数部分舍弃。

原理详解:

  首先在select floor(rand(0)*2) 执行时候会返回固定的序列(表中内容10左右,你就能看出来了)。用的别人的截图,莫怪。

  所谓固定的序列就是返回的01101100....这串是固定的,这个要记牢,后面要用到。

  然后,由于count(*)统计,采用的是逐行判断式的统计,先建立虚拟表,判断存在相同字段如果存在,统计值+1,不存在返回0,开始搜索下个字段。

  这个我举个例子:

  例如表中有十个苹果,然后执行统计。

  第一次

  key    统计值

  苹果    1

  第二次

  key   统计值

  苹果    2

  ……

  最后由于floor(rand(0)*2)执行返回的是固定值,所以按照count(*)统计,在第4次执行后第5次执行统计会报错(返回不存在相同字段后,下一次返回相同字段的统计,导致主键相同,所以报错)。

  同时这也说明,表中的内容需要大于3条。

2、updatexml()

select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));

函数解释:

  updatexml:XML文档进行查询和修改的函数。

  UPDATEXML (XML_document, XPath_string, new_value);

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

  第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。 

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

  concat:返回结果为连接参数产生的字符串。

原理解释:

  通过concat将查询到的信息拼接成字符串,由于updatexml函数的第二个参数需要Xpath格式字符串。现在很显然不是,所以报错。

3、extractvalue()

select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));

函数解释:

  extractvalue():从目标XML中返回包含所查询值的字符串。

  EXTRACTVALUE (XML_document, XPath_string);

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

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

  concat:返回结果为连接参数产生的字符串。

原理解析:

  通过concat将查询到的信息拼接成字符串,由于extractvalue函数的第二个参数需要Xpath格式字符串。现在很显然不是,所以报错。

这回就到这里,记得关注。

时间: 12-30

十种MYSQL显错注入原理讲解(一)的相关文章

十种MYSQL显错注入原理讲解(二)

上一篇讲过,三种MYSQL显错注入原理.下面我继续讲解. 1.geometrycollection() select * from test where id=1 and geometrycollection((select * from(select * from(select user())a)b)); 函数讲解: GeometryCollection是由1个或多个任意类几何对象构成的几何对象.GeometryCollection中的所有元素必须具有相同的空间参考系(即相同的坐标系).对Ge

SQL注入之mysql显错注入

在我们实际渗透中,明明发现一个注入点,本以为丢给sqlmap就可以了,结果sqlmap只显示确实是注入点,但是数据库却获取不了,如图1所示,这时我们可以使用手工进行注入,判断出过滤规则以及基本过滤情况,然后再选择对应的sqlmap脚本(如果有的话),本文主要是讲述如何通过mysql函数报错来进行注入,另外如何使用手工进行全程注入的利用过程,如果你知道sqlmap里面有对应的脚本的话,烦请告知一下,谢谢!. 图1 获取数据库失败 此时我们可以考虑下是否是显错注入,对于显错注入我们可以使用mysql

Mysql报错注入原理分析(count()、rand()、group by)

0x00 疑问 一直在用mysql数据库报错注入方法,但为何会报错? 百度谷歌知乎了一番,发现大家都是把官网的结论发一下截图,然后执行sql语句证明一下结论,但是没有人去深入研究为什么rand不能和order by一起使用,也没彻底说明三者同时使用报错的原理. 0x01 位置问题? select count(*),(floor(rand(0)*2))x from information_schema.tables group by x; 这是网上最常见的语句,目前位置看到的网上sql注入教程,f

学习笔记 UpdateXml() MYSQL显错注入

在学习之前,需要先了解 UpdateXml() . UPDATEXML (XML_document, XPath_string, new_value); 第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc 第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程. 第三个参数:new_value,String格式,替换查找到的符合条件的数据 作用:改变文档中符合条件的节点的值 然后咱们再看看语句:

十种MySQL报错注入

以下均摘自<代码审计:企业级Web代码安全架构>一书 1.floor() select * from test where id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a); 2.extractvalue() select * from test where id=1 and (extractvalue(1,

sql注入--双查询报错注入原理探索

目录 双查询报错注入原理探索 part 1 场景复现 part 2 形成原因 part 3 报错原理 part 4 探索小结 双查询报错注入原理探索 上一篇讲了双查询报错查询注入,后又参考了一些博客,今天来探究其原理 实际上该报错是由于rand(),count(),group by 三个语句联合使用造成的,缺一不可. 上一篇的地址:https://www.cnblogs.com/laoxiajiadeyun/p/10278512.html part 1 场景复现 首先我们新建一个数据库,并创建一

SQL注入原理讲解,很不错!

SQL注入原理讲解,很不错! 原文地址:http://www.cnblogs.com/rush/archive/2011/12/31/2309203.html 1.1.1 摘要 日前,国内最大的程序员社区CSDN网站的用户数据库被黑客公开发布,600万用户的登录名及密码被公开泄露,随后又有多家网站的用户密码被流传于网络,连日来引发众多网民对自己账号.密码等互联网信息被盗取的普遍担忧. 网络安全成为了现在互联网的焦点,这也恰恰触动了每一位用户的神经,由于设计的漏洞导致了不可收拾的恶果,验证了一句话

又一种Mysql报错注入

from:https://rdot.org/forum/showthread.php?t=3167 原文是俄文,所以只能大概的翻译一下 这个报错注入主要基于Mysql的数据类型溢出(不适用于老版本的Mysql) mysql> SELECT 18446744073709551610 * 2; ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(18446744073709551610 * 2)' mysql> SELECT

MSSQL显错注入爆数字型数据的一点思考

Title:MSSQL显错注入爆数字型数据的一点思考 --2011-02-22 15:23 MSSQL+ASP 最近在弄个站点,密码是纯数字的,convert(int,())转换出来不报错,也不知道其他人用的什么函数或者类型来爆密码像"11111111"的这样的数据的,就自己想了下弄了个暂时可以用的方法. 数据库查询如图: 图一: 图二: 图三: 图四: 图五: 下面是实验 表Member 字段Password 语句 ' or 1=convert(int,(select top 1 p