Вопрос или проблема
Я видел, как кто-то использует это в инъекции php shell:
test | cat /var/backup/secret.txt
Почему они используют test |
? Как это не бесполезно здесь?
Это просто бесполезное значение, иногда команда, которую вы внедряете, требует каких-то специфических данных в строке, и некоторым командам нужно хотя бы один аргумент, иначе это может привести к ошибке канала и команда cat не выполнится.
В данном случае, я полагаю, это просто осталось, потому что они проводили тест и не потрудились это удалить. Как вы заметили, cat не читает из stdin, поэтому любые данные, переданные в cat, бесполезны, атакующий управляет выполнением после команды pipe, поэтому все, что происходит до этого, обычно не имеет значения.
Ответ или решение
Использование команды test
в контексте PHP Shell Injection может показаться на первый взгляд лишним, но в действительности это имеет свои причины, связанные с поведением командной оболочки и техническими требованиями исполняемой команды.
Контекст использования
В данном примере:
test | cat /var/backup/secret.txt
команда test
выступает в качестве генератора потока данных для команды cat
. Хотя cat
не использует стандартный ввод, наличие команды перед символом конвейера (|
) сохраняет синтаксическую корректность команды в оболочке. Это важно, поскольку некоторые команды требуют наличия хотя бы одного аргумента для успешного выполнения.
Причины использования test
-
Соблюдение синтаксиса: В командной оболочке
bash
и других оболочках синтаксис может требовать конкретной структуры для выполнения команд. Некорректно построенные команды могут привести к ошибкам. Командаtest
обеспечивает такую структуру, так как она представляет собой валидное выражение. -
Параметризация: Некоторые команды требуют наличия входных параметров. Использование
test
(или любой другой команды) перед|
позволяет избежать ситуаций, когда команда не выполняется из-за отсутствия аргументов. -
Производительность и возвращаемое значение: Несмотря на то, что вывод
test
в этом контексте не используется, важно понимать, что команда запускается, и ее код выхода (0 для успешного выполнения) может быть важен для последующих команд или для обработки ошибок. -
Потенциал для манипуляций: В более сложных сценариях, злоумышленник может использовать вывод команды
test
для манипуляции или фильтрации данных, если это необходимо. В данном случае,cat
просто читает содержимое файла, но атакующий может варьировать команды в зависимости от контекста.
Заключение
Хотя использование test
в данном примере может показаться избыточным, оно выполняет важные функции в работе командной оболочки. Это позволяет избежать ошибок синтаксиса и обеспечивает правильное выполнение команды. В контексте PHP Shell Injection это может быть критически важно для успешной манипуляции системой и получения доступа к данным, придерживаясь при этом структурных требований оболочки.
Таким образом, даже на первый взгляд незначительные детали, такие как использование команды test
, могут сыграть ключевую роль в успешной реализации атакующего кода в условиях уязвимого приложения, основанного на PHP.