下面的脚本test.php旨在放在我所有wordpress网站的特定目录中。它的目的是在下面的$ source地址获取文件并将其解压缩到它所在的目录。这就是它的全部意图。
例如,我的中央服务器上将有一个仪表板界面,列出了存在此脚本的所有站点。然后,我将执行一个cURL例程,该例程迭代每个站点并对此脚本执行调用,从而有效地将更新文件立即发送给所有站点。
这样的电话就是这样......
...processing site 1 update...
http://targetsite1.com/somedeepdirectory/test.php?query=updates.zip
...processing site 2 update...
http://targetsite2.com/somedeepdirectory/test.php?query=updates.zip
...etc until all my sites have been updated.
我的问题是(1)这个脚本的安全性(硬化)是多少。 (2)我应该做些什么检查以便做出更多......
我认为至少我会限制myquery的字符数,以及检查myquery中的有效负载是否存在恶意,意外的文件类型?
<?php
// TEST.PHP
$source = 'http://mycentralserver.com/protected/'.$_GET['myquery'];
$target = '.';
$out_file = fopen(basename($source), 'w');
$in_file = fopen($source, 'r');
while ($chunk = fgets($in_file)) {
fputs($out_file, $chunk);
}
fclose($in_file);
fclose($out_file);
$zip = new ZipArchive();
$result = $zip->open(basename($source));
if ($result) {
$zip->extractTo($target);
$zip->close();
}
?>
答案 0 :(得分:3)
此脚本在当前状态下的安全性非常好。我确实有一些顾虑。在NO CONDITION下,您必须意外下载.php文件并将其存储在Web根目录中。这是该脚本可能发生的最糟糕的事情,因为它将是一个远程代码执行漏洞。文件应该下载到一个特定的目录,如果你关心其他访问这个文件,你应该在该文件夹的.htaccess中“拒绝所有人”。如果此脚本中存在任何错误,则应删除下载的文件。事实上,我建议尽快删除下载的文件。
我担心的是脚本应该优雅地出错。你应该检查以确保你已经获得了你想要的东西。即使文件不是.php文件,它也可以包含php代码<?php ?>
,然后可以包含(),这会将本地文件包含(LFI)漏洞转变为完整的远程代码执行。
在安全的php配置中,allow_url_fopen应该关闭,PhpInfoSec同意我的意见。这意味着fopen()不能用于HTTP。 allow_url_fopen默认启用,我在所有生产系统上禁用它。原因是因为我亲自在Coppermine Photo gallery中编写了一个利用这种不安全默认值的远程代码执行漏洞。 CURL应始终用于PHP中的HTTP,它更安全,更稳定。
答案 1 :(得分:2)
我可以通过
http://targetsite1.com/test.php?query=/tmp/somefile.zip
并使用我可以设法在您的虚拟主机上获取的任何文件来破坏您的网站。
- 实际上我不确定。它必须可以在mycentralserver.com上访问。
答案 2 :(得分:2)
有问题的网站根据命令从中央服务器下载.ZIP文件。他们不会验证.ZIP文件是否来自您,或者您的中央服务器没有被泄露。
我会用GPG签名你的邮箱。它们不需要加密(但从不会受到伤害)但需要签名。
答案 3 :(得分:1)
考虑您的脚本正在做什么。您正在访问某种查询引擎,创建zip文件,以及来回传递数据到该文件和查询引擎。幸运的是,此代码在服务器而不是客户端计算机上执行,因此它至少与访问Web服务器一样不安全。在考虑了您的Web服务器之后,它只能访问运行该查询引擎的服务所需的网络体系结构,或者与访问脚本创建的zip文件一样安全。
除非这些数据存储库存储个人身份信息,否则没有人会想要弄乱您的代码,除非弄乱您的代码提供了一种简单的方法来破坏具有某种程度的流量或声誉的网站。那么,有哪些机制可以阻止人们自由地将恶意代码注入您的查询引擎或您的zip存档?
答案 4 :(得分:1)
考虑关闭fopen_wrappers并使用curl或http库来访问预期的HTTP内容。
这将使您的系统免受其他漏洞的攻击,在这些漏洞中,恶意攻击者可以访问您打算限制访问本地文件系统的脚本内的Web内容。关闭fopen_wrappers,文件表示(本地)文件,http表示http。
答案 5 :(得分:1)
还要考虑谁可以执行此脚本。我会以某种方式保护它,以便互联网上的随机人/机器人不能轻易地调用它。考虑通过源IP限制它,或者如果要以交互方式调用脚本,可以实施密码检查。
答案 6 :(得分:0)
这里的一个问题是你不检查目录遍历,所以可以将整个磁盘(原则上)复制到位置'。'
如果./可以通过网络访问,那么你就有一个大问题。
我的建议是递归删除..的所有实例,这样就可以避免目录遍历
更准确地说,如果我将传递为../../../../../../etc/passwd,则此文件将被复制到当前工作目录。由于您的脚本可以在那里写入,显然,passwd文件将被暴露。
也不是编码a。或者/可以用十几种不同的方式编码,所以不要进行硬编码搜索并替换为../