
去年的强劲杯赛中,有一次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”)){
回显“请不要同时输入设置和准备”;
退出();
}

当时强大的网罩似乎没有在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;

->选择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

查询确定,受影响的0行(0.00秒)
mysql>选择@ p_in;
+ ------ +
| p_in |
+ ------ +
| NULL |
+ ------ +
设置1行(0.00秒)
#执行存储过程后,他将不会调用该值. 调用者无法在过程之外使用此更改的值
in参数只能输入,不能输出. 执行该过程后,in参数将保持不变.
out——输出参数(不要求,仅给出)

The
out参数恰好相反. 无论调用方如何为参数分配初始值,“进程”都将以空值开始处理,然后将处理后的值返回给调用方.
单独准备的语句
好的,到目前为止,我们仍然需要看一下这个主题. 这里的主题显然是要使用预处理集并做好准备,但不能同时输入. 经过上面的解释,我们可以认为尽管不能同时输入set和prepare,但是只要将set封装到一个“进程”中,我可以使用存储过程代替set吗?
再一次,如何编写每个人都熟悉的设定的preare注入poc:


此位置的字符串是我们要执行的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
因为下—次来的胡朋狗友二流子比这一次多的多