get方式传了一个text和file参数,判断text有没有以及text的值要等于I have a dream,上面成立就输出text的字符串
file_get_contents(读取的文件,) 函数是用于将文件的内容读入到一个字符串中的首选方法。遇到这个就用php://input, post部分用等号右边的字符串。
然后再过滤file参数,不允许有flag,如果没有就包含file参数,后面还提示next.php
显然在tetx参数中用php://input协议,post中I have a dream;既然提升了next.php那就读去一下源码,用php://filter来读取。
解一下base64
对一个正则表达式模式或部分模式 两边添加圆括号 将导致相关 匹配存储到一个临时缓冲区 中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每个缓冲区都可以使用 ‘\n’ 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。
这个里面关键是Preg_Replace函数使用了/e模式,根据链接里说的,我们想要cmd参数进行命令执行就要调用getFlag函数,而在/e模式下我们可以控制第一第三个参数,第二个会被当作代码执行。
foreach($array as $key => $value) 循环用于遍历数组。每进行一次循环,当前数组元素的值就会被赋值给 $value 变量(数组指针会逐一地移动),将键名赋给$key
就是把传进去的值变成数组形式,循环
strtolower("\\1")表示\1,也就是第一个子匹配项,这里要用${....}也就是$a,这样的形式来包裹代码,如果不用代码之会被当作字符串而不是代码,因为\\1在双引号里,它会解析变量,而单引号就不会。
在=号左边传的是匹配模式,右边是要调用的函数或命令,要让匹配模式匹配得到右边的内容,才可以,\S 匹配所有非空白符,不包括换行。
左边用\S*,表示匹配任意多个非空白符,右边用getFlag,但是为了成功调用函数,加${getFlag},使之不认为是字符串而是变量从而解析。
\S*=${getFlag()}&cmd=system("ls");