但是,几乎每个有关混淆PHP的帖子都可以以几乎相同的方式回答。我认为我们可以将大多数将黑名单文件混淆的方法浓缩为一个问题和答案线程。
这引出了很多人问的问题:如何对服务器上发现的恶意PHP代码进行模糊处理,它是如何发生的,该怎么办?!
#1 楼
幸运的是,几乎所有的PHP脚本都可以通过4种简单的方法进行模糊处理。我们将使用这四种方法来创建一个规范的答案。在开始之前,我们先收集有助于消除这些恶意文件混淆的常用工具列表,以便我们自己完成工作。 br />
用于反混淆的常用工具
UnPHP。这极大地帮助消除了对嵌套混淆超过100个嵌套函数的脚本的混淆。在许多情况下,该网站以及类似的网站应该是您第一个访问的网站。但是,在某些情况下,UnPHP无法对初始有效负载进行模糊处理。在这种情况下,我们将列出的其他工具就足够了。
PHP Beautifier。这是拆分单行文件的极好工具,否则很难读取它们。
Base64解码器。我正在链接到Google搜索此网站。这些Base64网站中的一些看起来有些阴暗,因此,如果您更喜欢在不访问那些网站的情况下使用脱机版本,我会推荐一个适用于Windows的快速工具(获取Base64Decode.exe)。源代码也可用。
PHP沙箱。您也可以在Google上查找其他沙箱。我们将在需要时使用它来运行
echo
命令。或两者:eval
。这可能是一个邪恶的功能,因为它允许任意执行PHP代码。只是在您的网站上发现正在使用的此功能可能表明您已被黑客入侵。preg_place
。经常与eval()
一起使用以允许执行任意代码。 preg_replace()
有很多好的用途,但是如果您不知道它是如何到达那里的,尤其是如果它与混淆的代码一起出现,则表明您已被黑客入侵。附加信息。为了防止这个答案变得太大,我将链接到这个有关常用的PHP函数的问题。此外,请查看OWASP PHP备忘单。在我们遇到的几乎所有hacks中都使用过,主要用作混淆层。
常见混淆格式
有几种不同的方式黑客混淆了他们的代码。让我们列出一些常见的技术,以便我们知道如何发现它们然后对其进行解码:
十六进制编码。您将在该表列表中寻找十六进制数字。在PHP中,这些可以用反斜杠x表示,后跟数字或字母。示例:
eval()
= H preg_replace()
= 4 base64_decode
= x 但是,它们不一定仅由
\x48
表示。它们也可以是\x34
。 Unicode字符串。几乎与上述相同,但使用
\x78
而不是\x
。示例:\#
= M \u#
= e \x#
= \u004D
(空格)\u0065
= p \u0020
= l
= s Base64编码。 Base64与上述混淆方法略有不同,但仍相对容易解码。示例字符串:
\u0070
=我喜欢甜甜圈\u006c
= \u0073\
SSBsaWtlIGRvbnV0cw==
=假设直接控制存储在字符串中的垃圾,由for循环,正则表达式等分割。由于它们之间的差异很大,因此您必须自己对其进行解码。幸运的是,许多上述方法应该可以帮助您消除混淆。
我如何自己对PHP文件进行反混淆?
因为我们无法为每一个PHP恶意软件代码片段提供帮助(我们可以,但我不会,!P),所以最好教您如何做。
自己学习如何做将有助于您了解有关PHP的更多信息,以及有关正在发生的事情的更多信息。让我们使用我们的工具,并在此网站上使用两个先前的PHP反混淆示例。复制代码并将其粘贴到UnPHP中:笨蛋我们将不得不做一些额外的工作。注意字符串以及它的串联。啊!这是如此丑陋和令人困惑!我们将如何处理这些字符串?这就是PHP沙箱发挥作用的地方。
<?php preg_replace("\xf4\x30\x1f\x161\x42\x45"^"\xd7\xf2","3\x495\xa92\xc0\x7217057\xb43\x6c\x69\x6d\x722\xe17\x67\x86\xc77\x640\x31\x78\x99\x9c0\x4"^"32\x965\x16\xbc\x98\xbf\x134\xd1\x7b\x4b\x84\xf6\xbe53\xa324\x9251\xbb\xb51","6\x30\x2f0\x2\x56\x25\x9a\xf\x6\xec7\xeb\x10\x86\x0445\x57\x53\xf3\x8d\xb9\x5c2\xc5\x97572\x83\x747\x28\x2e\xd1\x36\x7273\x3c\xb2\x1a\x9617\x3b7\xcf77\xb741\xb25\xa6\x3d5576\xd6\x7c"^"2\x581\x12\x552610607\x9b\x22\xdf7\xcc\x9e\xe14\x11244\x73\x2c334\xf8\xe903\xf0\x385\x6e\x54\xb2\x24\x4f0532\xf4\xee\x4d5\x886\xa15\x355\xc3\xd0\xca7\xd5\x5f\xc6\xe04\x55\xb5\x41"); ?>
现在我们已经回显了内容,我们可以对其进行重建以得到以下结果: >
注意字符串
ZXZhbChiYXNlNjRfZGVjb2RlKCJoYXgiKSk7
吗?看起来很像我们之前提到的Base64编码!让我们尝试对其进行解码,看是否正确: <?php
echo "\xf4\x30\x1f\x161\x42\x45"^"\xd7\xf2" . "<br/>";
echo "3\x495\xa92\xc0\x7217057\xb43\x6c\x69\x6d\x722\xe17\x67\x86\xc77\x640\x31\x78\x99\x9c0\x4"^"32\x965\x16\xbc\x98\xbf\x134\xd1\x7b\x4b\x84\xf6\xbe53\xa324\x9251\xbb\xb51" . "<br/>";
echo "6\x30\x2f0\x2\x56\x25\x9a\xf\x6\xec7\xeb\x10\x86\x0445\x57\x53\xf3\x8d\xb9\x5c2\xc5\x97572\x83\x747\x28\x2e\xd1\x36\x7273\x3c\xb2\x1a\x9617\x3b7\xcf77\xb741\xb25\xa6\x3d5576\xd6\x7c"^"2\x581\x12\x552610607\x9b\x22\xdf7\xcc\x9e\xe14\x11244\x73\x2c334\xf8\xe903\xf0\x385\x6e\x54\xb2\x24\x4f0532\xf4\xee\x4d5\x886\xa15\x355\xc3\xd0\xca7\xd5\x5f\xc6\xe04\x55\xb5\x41" . "<br/>";
?>
哦,没有!
如果通过UnPHP运行文件内容,则得到解码结果。看一下代码:
<?php
preg_replace("#(.+)#ie", "@include_once(base64_decode(""));",
"L2hvbWU0L21pdHp2YWhjL3B1YmxpY19odG1sL2Fzc2V0cy9pbWcvbG9nb19zbWFsbC5wbmc";
?>
将其复制并粘贴到UnPHP中。结果输入后,我们终于可以看到它在做什么,但是看起来它们都粉碎了。让我们将其粘贴到PHP Beautifier中。现在,它更容易阅读!
反混淆变量名
如果您无法通过前面提到的任何方法对变量名进行模糊处理,那么对这些变量名进行模糊处理可能是一个手动的,耗时的过程。幸运的是,使用
eval(base64_decode("hax"));
或QXNzdW1pbmcgZGlyZWN0IGNvbnRyb2w=
进行混淆处理,寻找常见的恶意软件模式(例如关闭日志文件),则表明存在问题。 ,您应该假设自己已被黑客入侵。您不应混淆您的代码。以可用性为代价的安全不是安全。反混淆风险
出于很多原因,尝试在自己的Web服务器上解码这些文件并不安全。 ,其中一些可能是我们所不知道的。不要尝试对自己的Web服务器上的PHP文件进行模糊处理。您可能会无意中引入其他后门程序,或者由于许多脚本会远程加载功能而协助恶意软件传播自身。 br />如果没有我们对您的Web服务器上所有内容(包括日志)的访问权限,此答案的确太广泛了。
您的内容管理系统(CMS)安装可能不正确,或者Web堆栈中某处存在漏洞。如果它们是CMS的一部分,则可以检查这些链接:
Joomla安全清单
WordPress强化
Drupal安全清单
如果您的CMS未列出,请查找CMS安装的强化/安全性清单。如果您不使用CMS,而是使用自己的代码,则必须由您来解决安全漏洞。 OWASP备忘单是查找和修复常见漏洞的良好起点。请记住,只有您才能阻止外壳程序访问。
发生这种情况的原因可能有很多...但是最重要的是:您的网络主机已被黑客入侵,或者您的网站上存在一个利用漏洞,允许恶意程序插入其他代码并完全控制他们您的网站...同时,他们正在攻击您的访客。
那我该怎么办?服务器受损?
评论
我对\ u004D和朋友不是十六进制代码的想法很感兴趣。粗体的“ HEX”是否具有我不知道的某些特定含义?
–user54862
16-2-23在15:01
@ WumpusQ.Wumbley我不好。我试图表明您没有在表格中查找十六进制代码列,就像在第一个网站上那样。这纯粹是一个化妆品。固定。
–马克·布法罗(Mark Buffalo)
16-2-23在15:03
动画GIF令人分心。我认为应该用没有动画的东西代替它。
– JonasCz-恢复莫妮卡
16-2-24在11:11
@JonasCz因此进行编辑。 :)
–马克·布法罗(Mark Buffalo)
16-2-24在11:36
似乎已经出现的一个新的有趣的变体是采用$ nm3 =“ dba4ce6_ospt”这样的字符串,然后使用子字符串匹配来重建函数名称,例如“ $ {$ nm3 [1]。$ nm3 [2]”。 。$ nm3 [9] ...}()“ ...因为字符串可以以任何顺序排列,所以grep确实很痛苦。
–凯塔尔
16年2月24日在16:12
#2 楼
马克(Mark)的出色答案是处理混淆相对简单的情况。这可以解决99%的情况,但有时您可能会遇到一些更恶意的情况,例如也使用源代码加密。执行代码(或至少执行其中的一部分)比手动对源代码进行逆向工程是一种更快地找出代码在做什么的方法,但这样做非常危险!您可以采取一些措施来限制/限制损害。始终使用vm
另请参阅此问题。
禁用功能
PHP .ini具有disable_functions选项,使您可以有选择地阻止对特定功能位的访问。 Mark已经提到过eval和preg_replace()(后者已在PHP 7中删除),但是流程执行功能也提供了一个有用的杠杆点:
扩展名这使您可以重新定义函数,包括PHP的内置函数。请注意,runkit沙箱的目的不是提供太多的隔离-确实允许您与在不同线程/环境中运行的PHP代码进行编程交互。
评论
我认为是eval()已从PHP7中删除,preg_replace()仍然存在:php.net/manual/en/function.preg-replace.php
–马斯塔奇
16-2-23在12:51
我在7中删除了“ e”正则表达式修饰符-php.net/manual/en/reference.pcre.pattern.modifiers.php我相信eval仍然存在(正确处理了有用的结构)
–symcbean
16-2-23在13:01
@mastazi是的,但是他们删除了e(eval)修饰符。
–user2428118
16-2-23在13:02
VM很棒,尽管对于真正的偏执狂,您可能需要一台无间隙的机器。如果真的很感兴趣,您可能会创建一个小的dockerized网络,并使用该网络准确地了解正在发生的步骤,如果无论如何,攻击都会更高级。
–Wayne Werner
16年2月24日在15:00
eval是语言构造,不是函数,因此无法使用disable_functions禁用
–MilošĐakonović
19年7月30日在9:11
评论
它肯定会混淆//在这里做坏事