php $ _GET это интерпретируется как одинарные или двойные кавычки? - PullRequest
3 голосов
/ 15 октября 2019

Я делаю предположение, что переменные $ _GET интерпретируются как строки в одинарных кавычках (а не строки в двойных кавычках).

Я считаю, что это так из-за следующего теста (пытающегося самостоятельно атаковать через каталог):

$file = "../test.php";
/**
* same as file1 but using hexadecimal encoding, which is a feature
* only available to double quoted strings
* https://www.php.net/manual/en/language.types.string.php
*/
$file2 = "\x2e\x2e\x2ftest.php"; 

include $file1; // will succeed in my environment
include $file2; // will succeed in my environment

Однако, если я передаю шестнадцатеричную нотацию через $ _GET, произойдет сбой, включая файл:


$file3 = $_GET["path"]; // (string) \x2e\x2e\x2ftest.php
include $file3; // will fail in my environment

Поэтому мой вопрос: действительно ли это так, что $_GET переменные интерпретируются как строки в одинарных кавычках? (потому что если так, то, возможно, простое удаление двух последовательных точек из пользовательского ввода предотвратит любую атаку обхода каталога)

И если так, написано ли это где-нибудь в руководстве по php?

1 Ответ

0 голосов
/ 15 октября 2019

Краткий ответ: $ _GET ['path'] - это переменная. PHP будет интерпретировать escape-последовательности, только если он найден в двойных кавычках, а не в переменной. -> Strings Manual .

$get = "\x2e";
var_dump($get);  
//string(1) "."

$get = "\\"."x2e";
var_dump($get);
//string(4) "\x2e"
...