当我们检查时:
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说过话。我认为你在结束之前分析问题时遇到了问题。)
答案 0 :(得分:1)
在PHP
中,没有特殊的../
(或任何其他字符串),当连接到另一个字符串时,会生成除了与新字符串连接的组合原始字符串以外的任何字符串。无论字符串的内容如何,连接始终会导致:
"<String1><String2>" = "<String1>"."<String2>";
任何东西都不会在字符串之类的标记之前或之前“擦除”并且完全无害。
警告!!!! 当然,如果字符串被用于某个特定方式解释它的地方,../
中的任何字符或字符组都被视为特殊字符,例如:
现在,如果你想在每个../
出现一个单词的句子之前删除这个单词,那么复制路径中的..
的方式,就会上升一级(实际上撤消了对它之前的路径中的目录所做的步骤。
这是一个基本的算法来启动你(如果你能够改变源代码):
" "
的爆炸。../
插入新数组的末尾../
开头,则删除第二个数组的结束元素../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);