——志向和热爱是伟大行为的双翼。

昨天偷懒了没学什么东西,先自我反省一下 - -。

今天认真的学习了一下Mysql报错注入利用方法及原理,好久之前就像认真的学一下这个了,是在上海市大学生网络安全大赛中遇到的web100。当时懵逼状态,被学长提醒了一下才知道是Mysql报错注入,因为之前一直都没接触过,所以当时只是知道怎么用然后拿了flag。其实根本不知道什么原理怎么回事,直到今天才把一些常见的报错注入方法原理搞懂,所以写篇博客来加深记忆以便后期会议。

首先,SQL有一下几种:

1.UNION query SQL injection(可联合查询注入)

2.Boolean-based blind SQL injection(布尔型注入)

3.Error-based SQL injection(报错型注入)

4.Stacked queries SQL injection(可多语句查询注入)

5.Time-based blind SQL injection(基于时间延迟注入)

今天我们说的就是Mysql的报错注入(想了解其他的请移步这里),共有11中方法(最后一种不适用于老版本)。

1,floor() payload:

and select count(*) from information_schema.tables group by concat(user(),floor(rand(0)*2))--

2, extractvalue() payload:

and extractvalue(1,concat(0x7e,user(),0x7e))--

3, updatexml() payload:

and updatexml(1,concat(0x7e,(select user()),0x7e),1)--

4, geometrycollection() payload:

and geometrycollection((select * from(select * from(select user())a)b))--

5, multipoint() payload:

and multipoint((select * from(select * from(select user())a)b))--

6, polygon() payload:

and polygon((select * from(select * from(select user())a)b))--

7, multipolygon() payload:

and multipolygon((select * from(select * from(select user())a)b))--

8, linestring() payload:

and linestring((select * from(select * from(select user())a)b))--

9, multilinestring() payload:

and multilinestring((select * from(select * from(select user())a)b))--

10, exp() payload:

and exp(~(select * from(select user())a))--

11,基于Mysql的数据类型溢出(不适用于老版本的Mysql,5.5以后版本)

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

基本上一下午都耗在这里了,因为实在不是很容易懂,其实也不是,只是开始的时候浪费了很长时间在一些讲的不透彻的资料上,接下来我就说一下我自己的理解。

我们先来了解一下这三个函数的作用:

count():统计有select语句返回的记录。

rand():随机生成0-1之间的浮点数  rand()*2就是0-2之间的浮点数

group by:用于结合合计函数,根据一个或多个列对结果集进行分组。不懂的话具体例子看这里:GROUP BY

另外  floor()函数是取整的意思。

我们使数据库报错的payload有两种  1. and select concat(*) from information_schema.tables group by concat(database(),floor(rand(0)*2))--

2. and select concat(*) from information_schema.tables group by concat(database(),floor(rand()*2))--

这两个语法的区别在于 rand()函数有没有随机因子0,有随机因子的payload必定报错(因为有随机因子的语句生成的值固定——有规律),而没有随机因子的payload随机报错(随机生成值,无规律)。

原理:

当MySQL数据库执行该语句的时候会建立一个虚拟表,表中有主键key和count(*)。当从数据库提取数据时,执行一次payload,提取的值为0,接下来会访问虚拟表检查是否存在0,因为我们这是第一次执行,所以表中不存在数据,所以我们将数据插进虚拟表中,这时又执行了一次payload,这次的值为1,所以向虚拟表中插入key:1,count(*):1。接下来第二次提取数据,执行payload获得数据1,再次查询虚拟表,存在1,所以直接count(*)+1,这时我们已经执行了三次payload,继续第三次提取数据,执行语句,得到数据0,查询虚拟表中不存在0,所以向虚拟表中插入数据,执行payload得到1,插入表中,而虚拟表中此刻为: key:1,count(*):2。由于1已经存在,继续向数据表中插入1导致报错。其实简单来说,导致报错的原因就是数据库中主键的不可重复性。

这就是为什么有随机因子的payload在数据库表大于3的情况下一定会报错,而另一个随机报错。我建议自己安装一个MySQL,然后在命令行下试一试这几个函数的效果,非常有助于理解。不是很好理解,如果本片文章不能让你看懂的话,可以移步这里,我也是在这篇博客的教导下自己在虚拟机中实践学懂的,没那么难理解。

XML查询函数报错原理(extractvalue,updatexml):

这两个函数报错的原理其实都是一样的,因为函数的第二个参数要求为Xpath 的string格式,而我们用concat函数生成的是连接的字符串,因此报错。

UPDATEXML (XML_document, XPath_string, new_value); 
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc 
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。 
第三个参数:new_value,String格式,替换查找到的符合条件的数据 
作用:改变文档中符合条件的节点的值

extractvalue函数同理。

本文主要说了前三种报错注入的方法和原理,其余的因为我暂时还没遇到 感觉并不常用所以以后遇到的时候在补回来,如果对其他的报错注入有兴趣可以点这里。

最后希望自己在这条路上继续坚持下去,保持热情,路途遥远且行且珍惜,共勉。

SQL注入之Mysql报错注入的更多相关文章

  1. SQL注入之MySQL报错注入整理

    看大佬们的文章看得我虎躯一震,精神抖擞,于是心血来潮,整理一下MySQL报错注入常见的手段和方法,再举几个例子 <代码审计:企业级Web代码安全架构>一书中介绍过报错注入十大方法,依次是: ...

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

    Mysql报错注入原理分析(count().rand().group by) 0x00 疑问 一直在用mysql数据库报错注入方法,但为何会报错? 百度谷歌知乎了一番,发现大家都是把官网的结论发一下截 ...

  3. sql注入--双查询报错注入

    sql注入--双查询报错注入 背景:在sqli-labs第五关时,即使sql语句构造成功页面也没有回显出我们需要的信息,看到了有使用双查询操作造成报错的方式获得数据库信息,于是研究了一下双查询的报错原 ...

  4. sql盲注之报错注入(附自动化脚本)

    作者:__LSA__ 0x00 概述 渗透的时候总会首先测试注入,sql注入可以说是web漏洞界的Boss了,稳居owasp第一位,普通的直接回显数据的注入现在几乎绝迹了,绝大多数都是盲注了,此文是盲 ...

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

    目录 双查询报错注入原理探索 part 1 场景复现 part 2 形成原因 part 3 报错原理 part 4 探索小结 双查询报错注入原理探索 上一篇讲了双查询报错查询注入,后又参考了一些博客, ...

  6. 【菜鸟学注入】之MySQL报错注入详解

    本文转自:http://bbs.blackbap.org/forum.php?mod=viewthread&tid=6483&highlight=mysql%2B报错注入 用SQL注入 ...

  7. MySQL报错注入总结

    mysql暴错注入方法整理,通过floor,UpdateXml,ExtractValue,NAME_CONST,Error based Double Query Injection等方法. 报错注入: ...

  8. MySQL报错注入函数汇总及常用注入语句

    版权声明:本文转载自网络内容,下面附原创链接原创链接:https://blog.csdn.net/Auuuuuuuu/article/details/91415165 常用函数 字符串连接函数,将多个 ...

  9. 又一种Mysql报错注入

    from:https://rdot.org/forum/showthread.php?t=3167 原文是俄文,所以只能大概的翻译一下 这个报错注入主要基于Mysql的数据类型溢出(不适用于老版本的M ...

随机推荐

  1. 个人项目WordCount(C++/QT)

    个人项目WordCount(C++/QT) GitHub项目地址:https://github.com/Nova-cjp/Word-Count 百度云链接:https://pan.baidu.com/ ...

  2. Exploring Adversarial Attack in Spiking Neural Networks with Spike-Compatible Gradient

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! arXiv:2001.01587v1 [cs.NE] 1 Jan 2020 Abstract 脉冲神经网络(SNN)被广泛应用于神经形态设 ...

  3. Java面试题(JVM篇)

    JVM 194.说一下 jvm 的主要组成部分?及其作用? 类加载器(ClassLoader) 运行时数据区(Runtime Data Area) 执行引擎(Execution Engine) 本地库 ...

  4. react 有没有类似vue中watch这样的api?

    就是 当组件里state 里的数据发生变化可以监听到这个数据的变化 当数据发生变化的时候做一些事情 比如ajax请求 ?初学react 用vue的时候会用watch 和computed 去监听数据发生 ...

  5. 利用阿里云服务器免费体验word press博客、个人网站

    本文首发于我的个人博客:https://chens.life/create-wordpress-blog.html 前言 目前市面上有许许多多的虚拟云服务器ECS,例如阿里云.华为云.又拍云等等,他们 ...

  6. Google Kick Start 2020 Round B T4 Wandering Robot

    题意 一个\(n \times m\)的矩形空间,起点是\((1,1)\),终点是\((n,m)\). 假设当前位于\((x,y)\): 如果当前位于最后一行,那么下一步只能走向\((x,y+1)\) ...

  7. vue 在使用数组的时候,数组内部数据发生变化,视图却没有改变

    data(){ return{ todos: [ {name: 'aa', age: 22}, {name: 'bb', age: 23} ] } } methods:{ changeTodos(){ ...

  8. 支付-微信h5

    背景 h5支付分两种 1.浏览器 2.app 浏览器里的h5,最终也会跳转到app. 而app里的h5,本质是公众号.在微信里叫公众号,支付宝叫服务窗. 这里主要讲微信h5. 核心原理 最终目标是下单 ...

  9. NutUI 视频组件开发心得

    引子 说到在项目中引入一个视频,我们肯定会想到 HTML5 为我们提供的 Video 标签,它为我们提供了许多属性和方法,使用起来很方便,当然直接使用也会遇到各种兼容问题,在最初学习 Video 标签 ...

  10. JVM学习第三天(JVM的执行子系统)之类加载机制补充

    昨晚没看完,今天继续 系统的类加载器 对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间.这句话可以表达得更通俗一些: ...