\documentclass[a4paper, 11pt]{article}
\renewcommand{\familydefault}{\sfdefault}
\usepackage{a4wide}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{color}
\usepackage{graphicx}
\usepackage{setspace}
\usepackage{ulem}
\usepackage{listings}
\usepackage{float}
\usepackage[rflt]{floatflt}
\usepackage{tabularx}
\setlength{\parindent}{0pt}
\title{JavaScript im GIF als Script Source}
\usepackage[
pdftitle={JavaScript im GIF als Script Source}
pdfsubject={Sicherheislücke}
pdfauthor={Udo Schmal}
pdfkeywords={}
]{hyperref}
\definecolor{darkblue}{rgb}{0,0,.5}
\hypersetup{pdftex=true, colorlinks=true, breaklinks=true, linkcolor=darkblue, menucolor=darkblue, pagecolor=darkblue, urlcolor=darkblue}
\begin{document}JavaScript im GIF als Script Source
\singlespacing
{\LARGE \textbf{\label{sec:title}JavaScript im GIF}}

 Kaum zu glauben aber wahr, ein \&quot;Hallo Welt\&quot; geschrieben in JavaScript in einem GIF.

Offenbar kann man beim src-Attribute des script-Tags auch ein Bild angeben, in diesem Fall ein GIF.

Der Trick an der Sache ist einen gültigen GIF-Header zu erzeugen der auch als JavaScript interprepiert werden kann.\newline
In JavaScript wird die Kennung \&quot;GIF89a\&quot; als Variable betrachtet und in der Breitendefinition einen Kommentar begonnen \&quot;/*\&quot; der am Ende der Farbtabelle geschlossen wird \&quot;*/\&quot; und anschließend wird der Variable (GIF89a) der Wert 1 zugewiesen \&quot;=1\&quot;. Das Ende des Gif-Headers \&quot;;\&quot; schließt diese Zuweisung ab, nun kann der eigentliche JavaScirpt Code folgen.\newline
Man beachte allerdings die Größendefinition, eine Breite von \$2A2F entspricht der Breite von10799 Pixel was nicht nur für ein GIF schon beträchtlich ist!
\begin{figure}[h]
\centering



[GIF Hexdump]
\end{figure}

\begin{tabularx}{0.9\textwidth} { | >{\raggedright\arraybackslash}X | >{\raggedright\arraybackslash}X | >{\raggedright\arraybackslash}X | }
\hline
Offset & Length (bytes) & Content \\
\hline
00 & 3 (\$47 \$49 \$46) & \&quot;GIF\&quot; \\
\hline
03 & 3 (\$38 \$39 \$61) & \&quot;87a\&quot; oder \&quot;89a\&quot; \\
\hline
06 & 2 (\$2f \$2a) & Breite \\
\hline
08 & 2 (\$64 \$2e) & Höhe \\
\hline
0a & 1 (\$2e) & Farbtabellen Infos \\
\hline
0b & 1 (\$2e) & Hintergrund Farb-Index \\
\hline
0c & 1 (\$2e) & Pixel Seitenverhältnis \\
\hline
0d & 9 (\$2c \$2e \$2e \$2e \$2e \$2a \$2f \$3d \$31) & Globale Farbtabelle / Blöcke \\
\hline
16 & 1 (\$3b) & Ende \\
\hline
17 & document.getElementById(\&quot;box\&quot;).innerHTML=\&quot;Hallo Welt\&quot;; & JavaScript-Block \\
\hline
4c & 1 (\$3b) & Ende \\
\hline
\end{tabularx}
\begin{lstlisting}[breaklines]\&lt;div id=\&quot;box\&quot;\&gt;\&lt;/div\&gt;
\&lt;script src=\&quot;/media/XSS-Sicherheitsluecke.gif\&quot; type=\&quot;text/javascript\&quot;\&gt;\&lt;/script\&gt;\end{lstlisting}

Sicherheitslücke geschlossen:
\begin{lstlisting}[breaklines]Skript von \&quot;\href{http://www.gocher.me/media/XSS-Sicherheitsluecke.gif}{https://www.gocher.me/media/XSS-Sicherheitsluecke.gif}\&quot; wurde wegen eines unerlaubten MIME-Typs (\&quot;image/gif\&quot;) blockiert.
Laden fehlgeschlagen für das \&lt;script\&gt; mit der Quelle \&quot;\href{http://www.gocher.me/media/XSS-Sicherheitsluecke.gif}{https://www.gocher.me/media/XSS-Sicherheitsluecke.gif}\&quot;.\end{lstlisting}
\end{document}