Можно ли экранировать строку с помощью пользовательского ввода?

#php #security #escaping #concatenation #fopen

#php #Безопасность #побег #конкатенация #fopen

Вопрос:

Возьмем этот пример кода:

 $data = $_POST["data"];
$file = $_POST["file"];
$filename = $file. ".txt";          # <-- can this .txt be escaped? maybe not in PHP, but even by the file system
$file = fopen($filename, "a");
fwrite($file, $data);
fclose($file);
 

Здесь ничего не очищается, и пользователь имеет полное разрешение на имя файла, но не на расширение. a Флаг в fopen будет использоваться для создания файла или записи только в конец файла.

Если мы изменили это и сделали так $file , чтобы оно было указано с расширением, пользователь имеет полный контроль над вводом-выводом на сервере.

 $filename = $file;                # /.ssh/id_rsa
...
fwrite($data);                    # New RSA key
 

Итак, указав расширение, это предотвращает много вредоносных действий в данном случае, верно? На самом деле ничто не хранится в .txt формате, который стоит изменять.

Есть ли способ избежать этого? Здесь не происходит санитарной обработки, что дает пользователям возможность поместить номер 101 в here: каковы векторы атаки? Могут ли они избежать моей .txt силы?

Я понимаю, что они могли бы создать вредоносный код здесь, а затем потенциально использовать отдельную уязвимость, чтобы внедрить его непосредственно из файла. Я хочу больше узнать о конкатенации и векторе безопасности, стоящем за ней.

К вашему сведению: Это не лучшая практика и никогда не будет внедрено в производство. Я просто хочу концептуального понимания того, какие возможности на самом деле лежат здесь.

Я тестировал ее локально и пытался использовать PHP Strings документацию, чтобы экранировать ее в моем пользовательском вводе. В идеале я проверяю, смогу ли я создать PHP-файл на сервере.

Это было в значительной степени вдохновлено пониманием того , как пользовательский ввод может избежать SQL — запросов с помощью комментария like -- .

Комментарии:

1. Я не понимаю, как это жестко запрограммированное расширение можно обойти. Вполне допустимо иметь точки в имени файла, так file.exe.xls.whatever.txt что это все равно .txt файл. Параллель, которую вы проводите с SQL-инъекцией, здесь неприменима. Чтобы это сработало, PHP-код должен быть интерпретирован дважды: в первый раз для интерпретации значения переменной, а затем во второй раз для интерпретации символа из этого ввода как начала комментария.

2. Но, конечно, учетная запись пользователя сайта was не будет иметь доступа к snything за пределами корня документа, не так ли 🙂

3. См. Также PHP q amp; a по безопасности StackExchange .

4. @RiggsFolly это правда, хотя я видел несколько серверов с разрешениями 777 или даже root, потому что они неправильно размещают свои приложения

5. Смотрите также символ нулевого байта в имени файла