变量的值是否可以在PHP中反向削减?

时间:2018-04-08 21:01:17

标签: php

当我们检查时:

dir1/dir2/../file.txt  ==== this is same as =====>   dir1/file.txt

我感兴趣的是PHP中可用的相同内容,例如:

$name= "Hello ". $variable . "World";

如果我有$variable = "../Hi"(或类似的东西)那么,它会删除(如反斜杠)前一部分,打印Hi World

(p.s。我不控制php文件,我询问攻击者如何实现这一点。)

(第2页。关于这个问题,我没有对downvoters说过话。我认为你在结束之前分析问题时遇到了问题。)

1 个答案:

答案 0 :(得分:1)

PHP中,没有特殊的../(或任何其他字符串),当连接到另一个字符串时,会生成除了与新字符串连接的组合原始字符串以外的任何字符串。无论字符串的内容如何,​​连接始终会导致:

"<String1><String2>" = "<String1>"."<String2>";

任何东西都不会在字符串之类的标记之前或之前“擦除”并且完全无害。

警告!!!! 当然,如果字符串被用于某个特定方式解释它的地方,../中的任何字符或字符组都被视为特殊字符,例如:

  • 用于正则表达式
  • 的字符串
  • 在用作文件路径的字符串中(在这种情况下,当它被评估时,它将完全按照您键入的内容执行。
  • SQL查询中使用的字符串,没有正确转义(如通过预处理语句绑定params / values)
  • 等...

现在,如果你想在每个../出现一个单词的句子之前删除这个单词,那么复制路径中的..的方式,就会上升一级(实际上撤消了对它之前的路径中的目录所做的步骤。

这是一个基本的算法来启动你(如果你能够改变源代码):

  • 在字符串上使用带分隔符" "的爆炸。
  • 创建新阵列
  • 迭代返回的数组,如果不是../插入新数组的末尾
  • 如果条目以../开头,则删除第二个数组的结束元素
  • 在第二个数组的末尾插入../somestring,其中../字符串替换为空字符串""
  • 一旦到达数组末尾(处理完所有字符串),implode()带分隔符" "

以下是一个例子:

<?php

$variable = "../Hi";
$string = "Hello ". $variable . " World"; // Note: I added a space prior to the W 

$arr = array();

foreach(explode(" ", $string) as $word) {
   if (substr( $word, 0, 3 ) === "../") {
      if(!empty($arr)){
         array_pop($arr);
      }
      $arr[] =  str_replace("../", "", $word);
   } else {
      $arr[] = $word;
   }
}

echo implode(" ", $arr);