b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

mysql存储过程分析

电脑杂谈  发布时间:2020-04-08 15:06:42  来源:网络整理

mysql 存储过程调用存储过程_mysql 调用存储批量过程_mysql存储过程怎么调用

去年的强劲杯赛中,有一次mysql堆栈注入,称为random note. 一年来,很多游戏都在玩这个问题. 到现在为止,仍然有各种各样的新姿态,但是今天我突然想到这个问题似乎没有答案. 有一个非常认真的分析,因此,这里总结了本主题的意图和预期的原始做法:

堆栈注入

堆叠式进样: 堆叠式进样. 从名词的含义mysql存储过程怎么调用,您可以看到应该一起执行一堆SQL语句(多个). 实际使用中也是如此. 我们知道在mysql中,主要是在命令行中添加;在每个语句的末尾指示语句的末尾. 因此,我们考虑了是否可以一起使用多个句子. 这称为堆叠注射. 代码和常规查询之间的区别在于,使用了multi_query函数

在SQL中,分号(;)用于指示SQL语句的结尾. 假设我们在sql语句结束后继续构造下一条语句,它将一起执行吗?因此,这个想法也创建了堆栈注入. 联合注入(联合注入)也是将两个语句合并在一起,两者之间有什么区别吗?区别在于,由union或union执行的所有语句类型都是有限的,可以用来执行查询语句,而堆栈注入可以执行任意语句.

源代码分析

<? php

$ inject = $ _GET ['inject'] ??错误;

如果(注入$){

$ preg_match ='return preg_match(“ /选择|更新|显示|使用| updatexml | extractvalue | exp | pow | char |删除| ascii | substr | sleep | if | strcmp | left | mid | concat | drop |插入|其中| \ ./ i“,$ inject); ';

if(eval($ preg_match)){

回显“您输入了敏感字符!”;

退出();

}

if(stristr($ inject,“ set”)&& stristr($ inject,“ prepare”)){

回显“请不要同时输入设置和准备”;

退出();

}

mysql 存储过程调用存储过程_mysql 调用存储批量过程_mysql存储过程怎么调用

当时强大的网罩似乎没有在stristr函数中错过i,导致每个人都使用大写字母绕过它,但这没关系. 这不是重点(转义)

过滤掉了很多查询关键字,例如select(选择),例如用于盲注的函数,基本上没有办法,但是这里有一个堆栈注入,这使我们有机会执行多个SQL语句.

许多学生自然想到了set + prepare的prepared语句,但规定不可能同时输入set和preparee,并且被阻止,但是mysql也有可以执行的语句分别相等执行的效果,这里介绍积极的解决方案,mysql存储过程.

存储过程

存储过程(Stored Procedure)是一个对象,用于将复杂程序存储在中,以便外部程序可以调用它们.

存储过程是一组用于完成特定功能的SQL语句. 它是通过编译创建的,并存储在中. 用户可以通过指定存储过程的名称并提供参数(在需要时)来调用执行.

存储过程非常简单,即的SQL语言级别的代码打包和重用. 类似的面向对象编程. 坦率地说,存储过程是一段带有用于完成特定功能的名称的代码.

看看这个非常熟悉的示例,该示例是Internet上的一个教程示例,以使您熟悉它. 就是进进出出.

创建一个存储过程,然后调用.

鉴于许不了解进出之间的区别,让我们简要地提及一下.

in——传入参数(仅要求提供,未给出)

调用者可以给“过程”一个值,但是该过程不会将该值返回给您. 例如

mysql>分隔符$$

mysql>设置@ p_in = 1;

mysql>创建过程in_param(在p_in int中)

->开始

->选择p_in;

->设置p_in = 2;

mysql 存储过程调用存储过程_mysql存储过程怎么调用_mysql 调用存储批量过程

->选择p_in;

->结尾$$

mysql>分隔符;

mysql>调用in_param(@p_in);

+ ------ +

| p_in |

+ ------ +

| 1 |

+ ------ +

设置1行(0.00秒)

#因为首先在此处设置了p_in = 1,所以存储过程中的select p_in的值为1

+ ------ +

| p_in |

+ ------ +

| 2 |

+ ------ +

设置1行(0.00秒)

#然后设置p_in = 2,因此存储过程中的第二个选择p_in为2

mysql存储过程怎么调用_mysql 存储过程调用存储过程_mysql 调用存储批量过程

查询确定,受影响的0行(0.00秒)

mysql>选择@ p_in;

+ ------ +

| p_in |

+ ------ +

| NULL |

+ ------ +

设置1行(0.00秒)

#执行存储过程后,他将不会调用该值. 调用者无法在过程之外使用此更改的值

in参数只能输入,不能输出. 执行该过程后,in参数将保持不变.

out——输出参数(不要求,仅给出)

The

out参数恰好相反. 无论调用方如何为参数分配初始值,“进程”都将以空值开始处理,然后将处理后的值返回给调用方.

单独准备的语句

好的,到目前为止,我们仍然需要看一下这个主题. 这里的主题显然是要使用预处理集并做好准备,但不能同时输入. 经过上面的解释,我们可以认为尽管不能同时输入set和prepare,但是只要将set封装到一个“进程”中,我可以使用存储过程代替set吗?

再一次,如何编写每个人都熟悉的设定的preare注入poc:

mysql 存储过程调用存储过程_mysql存储过程怎么调用_mysql 调用存储批量过程

此位置的字符串是我们要执行的SQL语句的十六进制表示形式,而stmt是准备好的语句的别名. 然后我们将他分为两部分:

首先,我们需要创建一个包含该集合的存储过程,然后分析输入和输出参数:

The

in参数是SQL注入语句的十六进制,因为我们需要绕过敏感字符过滤,并且需要输入此十六进制以供进程使用;在set-pre-processing语句中,out参数为@string. 在“ process”中分配了值之后,将其取出并用于准备. 因此我们的poc可以这样写: 下面的uuid代表php代码生成的随机数. 首次输入存储过程的定义:

114514';

创建过程“ {$ uuid}”(字符串文本(1024),十六进制文本(1024))

开始

SET字符串=十六进制;

END;

;-

第二次调用该存储过程(@decoded实际上是将参数传递到上一个poc的字符串位置. 为了与字符串区别开来,使用了另一个名词):

然后,设置+准备注射将正常执行.

摘要

实际上,如果您真的不知道输入和输出,可以使用inout代替. inout参数可以是输入,也可以是输出.

坦白说,存储过程是SQL语句中的一个函数,可以封装代码,因此,如果遇到无法在游戏中一起使用的关键字mysql存储过程怎么调用,则可以尝试使用存储过程将它们分开.

和田互联网安全实验室的推荐实验==绕过UNION&SELECT过滤(对于过滤,我们必须充分利用编码来绕过关键字过滤. 该实验主要介绍绕过UNION&SELECT过滤的技术. )


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-168329-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 李宗皋
        李宗皋

        因为下—次来的胡朋狗友二流子比这一次多的多

      热点图片
      拼命载入中...