0

我正在寻找使用以下正则表达式行从我的网站中删除恶意代码;

find -type f -name \*.php -exec sed -i 's/.*eval(base64_decode(\"CmVycm.*/<?php/g' {} \;

这将保留<?php我想要的,但我注意到许多注入都在多行的整个 php 文件中,这意味着不仅仅是第一个<?php 所以是否可以执行 if do else 语句,如果它在 php 文件的第 1 行保留php 标记,如果它在其他任何地方,否则删除整行?

4

2 回答 2

1

而不是说:

sed -i 's/.*eval(base64_decode(\"CmVycm.*/<?php/g'

说:

sed -i 's/eval[(]base64_decode[(]["]CmVycm.*//g'

这将保留<?php标签并从不存在标签的行中删除恶意代码!

编辑:正如Birei评论的,你可以说:

sed -i -e '1 s/.*eval[(]base64_decode[(]["]CmVycm.*/<?php/g' -e '2,$ s/.*eval[(]base64_decode[(]["]CmVycm.*//g'
于 2013-09-09T08:35:36.607 回答
1

不接受来自 devnull 的响应,所以这是我的

如果恶意代码占用一行,您可以轻松执行以下操作:

sed -i "/eval(base64_decode(/d" filename

这将删除所有行。

如果你担心第一个<?php

sed -i -e "/<?php/! {1 s/^/<?php /}" filename

<?php如果第一行不存在,它将添加一个标签。它是如何工作的 ?

/<?php/!将匹配没有<?php它的行。

{1 s/^/<?php /}在第一行,<?php在开头添加

更多的 ?

如果代码需要 2 行:

<?php
exec(base64_decode() ... ?>

sed -i '/<?php/{N;/exec(base64_decode/d;}' filename

如果一行匹配<?php并且下一行匹配exec(base64_decode,则删除这两行。

N;用于加载当前缓冲区中的下一行。d;删除当前缓冲区(= 两行)

如果代码需要 3 行:

<?php
exec(base64_decode() ...
?> 

sed -i '/<?php/{N;/exec(base64_decode/{N;d;};}' filename

N;d;同上,但在删除 ( )之前加载第三行

不够?

粘贴注入字符串的完整示例。

希望有帮助,加油

于 2013-09-09T11:37:58.233 回答