ik heb zelf een webservertje geschreven in php, heel simpel, hij kan ook alleen GET requests maar dat is voldoende
maar nu wil ik weten of ie echt veilig is, dus dat er geen enkele manier is om te hacken, en als die er wel is graag hoe je dat in dat geval doet
hoe ie werkt is als volgt:
- hij start 32 processes van zichzelf
- elk proces wacht op een connection
- als er een connection is word er gezocht naar de regel met 'GET'
- shell chars worden geescaped
- als wat opgevraagd word eindigd met / dan word er 'index.php' achter gezet
- er word gekeken of er geen '..' voorkomt in de file, anders foutmelding
- er word gekeken of de file bestaat, anders foutmelding
- als de file eindigt op .php word er 'php <file>' uitgevoerd
- de output van php of gewoon het file als het geen .php was word teruggestuurd
het gaat om de onderstaande code:
Code:
<?php
ob_implicit_flush ();
set_time_limit (0);
error_reporting(1);
$sock = socket_create (AF_INET, SOCK_STREAM, getprotobyname("TCP"));
socket_bind ($sock, "145.53.41.114", 82);
socket_listen($sock);
socket_accept($sock);
$pid = pcntl_fork();
if ($pid == -1) {
die("could not fork");
} else if ($pid) {
$pid = pcntl_fork();
if ($pid == -1) {
die("could not fork");
} else if ($pid) {
$pid = pcntl_fork();
if ($pid == -1) {
die("could not fork");
} else if ($pid) {
//en zo gaat dit dus nog 30x door
} else {
httpd($sock);
}
} else {
httpd($sock);
}
} else {
httpd($sock);
}
function httpd($sock) {
while (true) {usleep(1000);
$msgsock = socket_accept($sock);
// while(true){
usleep(5000);
$buf = socket_read ($msgsock, 2048);
if (empty($msgsock)){break;}
$buf = explode("\n", $buf);
$buf = $buf[0];
if (ereg("^GET", $buf)) {
$buf = explode(" ", $buf);
$buf = $buf[1];
$buf = trim($buf);
//if (!empty($buf)){echo $buf."\n";}
$buf = escapeshellcmd ($buf);
if (ereg("\.\.", $buf)){
$buf = "/nicetry.php";
}
if (ereg("/$", $buf) || empty($buf)){
$buf .= "index.php";
}
$filename = "/var/www/htdocs".$buf;
if(!file_exists($filename)){
$filename = "/var/www/htdocs/nicetry.php";
}
$fd = fopen ($filename, "r");
while (!feof ($fd)) {
$msg .= fgets($fd, 4096);
}
fclose ($fd);
$msg .= "\r\n";
if (ereg("\.php$", $filename)){
$msg = "";
$exec = "php ".$filename;
$msg = `$exec`;
$msg = substr($msg, 49)."\n";
}
socket_write ($msgsock, $msg, strlen ($msg));
}
//}
socket_close ($msgsock);
}
}
?>
let niet teveel op de rommel
wat overigens wel werkt is 32 connections openen, maar dan reageert de webserver alleen niet meer, je kan geen schade toebrengen aan de server waarop ie draait, en dat is waar het om gaat
hij draait op een netbsd of op een slackware linux