我会解释为什么我需要帮助才能达到最低限度。我的一个文件目录被XSS攻击,并在所有php
文件的开头放置了一个长字符串。我曾尝试使用sed
替换字符串,但它不起作用,因为要匹配的模式包含许多需要转义的字符。
我发现我可以使用fgrep
来匹配模式文件中保存的固定字符串,但我想在每个字符串中替换匹配的字符串( NOT THE LINE )文件,但是grep
的{{1}}反转了该行的结果,而不是匹配字符串的结尾。
这是我在包含被黑客攻击的示例文件上使用的命令
-v
我需要输出包含位于行尾的fgrep -v -f ~/hacked-string.txt example.php
(有时它是<?php
标记),但<style>
选项在该行的末尾反转,所以输出开头不包含-v
。
注意
我尝试使用<?php
或-o
而不输出任何内容:
--only-matching
grep中是否有另一个选项可用于在匹配模式的末尾反转,而不是模式匹配的行?或者,是否有更容易的选项来替换所有fgrep -f ~/hacked-string.txt example.php --only-matching -v
个文件中被黑客攻击的字符串?
以下是.php
中的内容的小片段(为了便于阅读而添加了换行符):
hacked-string.txt
提前致谢!
答案 0 :(得分:2)
我认为你问的是:
&#34;是否可以使用grep实用程序从文件中删除固定字符串的所有实例(可能包含许多正则表达式元字符)?&#34;
在这种情况下,答案是&#34;否&#34;。
我想你想问的是:
&#34;从文件中删除固定字符串的所有实例(可能包含大量正则表达式元字符)的最简单方法是什么?&#34;
这是一个相当简单的解决方案:
delete_string() {
awk -v s="$the_string" '{while(i=index($0,s))$0=substr($0,1,i-1)substr($0,i+length(s))}1'
}
delete_string 'some_hideous_string_with*!"_inside' < original_file > new_file
shell语法略显脆弱;如果字符串包含撇号(&#39; ),它将会中断。但是,您可以使用以下命令将stdin中的原始字符串读取到变量中:
$ IFS= read -r the_string
absolutely anything here
可以使用任何不包含换行符或NUL字符的字符串。在变量中包含字符串后,可以使用上面的函数:
delete_string "$the_string" < original_file > new_file
这是另一个可能的一个班轮,使用python:
delete_string() {
python -c 'import sys;[sys.stdout.write(l.replace(r"""'"$1"'""","")) for l in sys.stdin]'
}
这不会处理具有三个连续引号("""
)的字符串。
答案 1 :(得分:0)
每个文件中被黑网的字符串是否相同?
如果字符中被黑网字符串的长度为1234
,那么您可以使用
tail -c +1235 file.php > fixed-file.php
每个受感染的文件。
请注意tail c +1235
告诉输入文件的第1235个字符输出。
答案 2 :(得分:0)
使用perl:
perl -i.hacked -pe "s/\Q$(<hacked-string.txt)\E//g" example.php
注意:
$(<file)
位是用于读取文件内容的bash快捷方式。 \Q
和\E
位来自perl,它们将两者之间的内容视为普通字符,忽略正则表达式元字符。 -i.hacked
选项将就地编辑文件,创建备份“example.php.hacked”