Удаление инъекции с помощью регулярных выражений

Я собираюсь включить эту конкретную строку из строки 1 из более чем 16 000 файлов.

Начало инъекции:

<?php if(!isset($GLOBALS`

Middle of the injection is:
`7860msvd`

And end of the injection is:
`oqggbrtstz-1; ?>

Этот контент только в 1 строке (первый)

Не уверен, как это сделать, но вот что я имею в виду:

sed -i -e '1 s/.*<\?php if\(\!isset\(\$GLOBALS\.*7860msvd.*oqggbrtstz-1; ?>//g'

error: sed: -e expression #1, char 67: Unmatched ( or \(

Любая помощь будет потрясающей.

1

Решение

Вы пропускаете буквально какой-то специальный символ, такой как ? и используя -r получить ожидаемый результат

sed -ri  '1 s/.*<\?php if\(\!isset\(\$GLOBALS.*7860msvd.*oqggbrtstz-1; \?>//g' File

-r, --regexp-extended

use extended regular expressions in the script.
1

Другие решения

@josifoski прав, не избегайте скобок. Небольшая поправка к его ответу, чтобы избежать удаления кода до инъекция:

sed -i -e '1 s/<\?php if(\!isset(\$GLOBALS.*7860msvd.*oqggbrtstz-1; \?>//g'

1

Один важный недостающий ответ — «не делай этого». Укрепите сайт, прежде чем делать что-либо еще. Затем восстановите сайт из заведомо исправных резервных копий или повторно разверните сайт из системы контроля версий.

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

1

исправление синтаксиса вашей команды

sed -i -e '1 s/.*<\?php if(\!isset(\$GLOBALS\.*7860msvd.*oqggbrtstz-1; \?>//g'

нет необходимости escape (), когда нет обратной ссылки и отсутствует экранирование?

0