前言
在之前的BlackHat 2018大会上公布了一款针对PHP应用程序的全新攻击技术。我们将通过这篇文章简单介绍下。
来自Secarma的安全研究员Sam Thomas发现了一种新的开发技术,它可以导致PHP对象注入漏洞——而无需使用PHPunserialize()
函数。这项新技术是在BlackHat 2018大会上公布的,利用PHP反序列化漏洞升实现远程代码执行。我们在RIPS代码分析引擎中添加了对这种新型攻击的检测。
常见样式
大多数PHP文件操作允许在访问文件路径时使用各种url样式,如data://
、zlib://
或php://
。这些操作通常用于远程文件,攻击者可以在其中控制文件包含完整的文件路径。
远程文件包含漏洞利用:
include($_GET['file'])
include('php://filter/convert.base64-encode/resource=index.php');
include('data://text/plain;base64,cGhwaW5mbygpCg==');
Phar元数据
但到目前为止,很少有人关注phar://
这个点。Phar(PHP Archive)
文件的有趣之处在于它们包含序列化格式的元数据。让我们创建一个Phar文件,并添加一个包含一些数据作为元数据的对象:
// create new Phar
$phar = new Phar('test.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub('');
// add object of any class as meta data
class AnyClass {}
$object = new AnyClass;
$object->data = 'rips';
$phar->setMetadata($object);
$phar->stopBuffering();
我们新建的test.phar
文件有以下内容。我们可以看到对象被存储为一个序列化的字符串。
PHP对象注入
如果现在通过phar://
对我们现有的Phar文件执行文件操作,则其序列化元数据将被反序列化。这意味着我们在元数据中注入的对象被加载到应用程序的范围中。如果此应用程序具有已命名的AnyClass
类并且具有魔术方法destruct()
或wakeup()
定义,则会自动调用这些方法。这意味着我们可以在代码库中触发任何析构函数或wakeup方法。更糟糕的是,如果这些方法对我们注入的数据进行操作,那么这可能会导致进一步的漏洞。
class AnyClass {
function __destruct() {
echo $this->data;
}
}
// output: rips
include('phar://test.phar');
利用
首先,攻击者必须能够在目标Web服务器上植入一个Phar
文件。Sam Thomas发现了一个如何将Phar文件隐藏到JPG文件中的技巧,因此只要常见的图片上传功能就足够。但这并不重要,因为如果攻击者可以在ìnclude()
,fopen()
,file_get_contents()
,file()
等操作中控制完整的文件路径,那么将会造成严重的安全漏洞。因此,通常会在用户输入中验证这些功能。但是现在攻击者可以通过phar://
注入并获得代码执行。
到目前为止看起来无害的代码示例:
file_exists($_GET['file']);
md5_file($_GET['file']);
filemtime($_GET['file']);
filesize($_GET['file']);
总结
通过RIPS的分析,我们可以自动检测用户输入是否在PHP文件操作中未经验证。
这样,我们检测是否存在文件删除、文件泄露、文件写入,文件操作,文件创建、文件包含(等等)漏洞。
此外,RIPS对敏感字符串分析使我们能够精确评估文件路径是完全还是由攻击者控制,以及是否可以phar://
注入。最后,我们在RIPS代码分析器中添加了一个名为Phar Deserialization
的新漏洞类型,以检测这种新类型的代码风险。
*参考来源:rips,由周大涛编译,转载请注明来自FreeBuf.COM