[VOTING] XH 1.6.10

Discussions and requests related to new CMSimple features, plugins, templates etc. and how to develop.
Please don't ask for support at this forums!
Gert
Posts: 3075
Joined: Fri May 30, 2008 4:53 pm
Location: Berlin
Contact:

Re: [VOTING] XH 1.6.10

Post by Gert » Tue May 26, 2020 10:37 am

frase wrote:
Mon May 25, 2020 3:09 pm
Vergisst der User das Passwort sofort zu ändern (Unterbrechung durch Telefon usw.), dann können wir auch nix mehr tun.
Für dieses Problem habe ich eine Lösung gefunden:

Die setup.php prüft als erstes das Alter der setupControl.php. Ist die älter als 5 min, wird sie gelöscht und Setup ist inaktiv.

Code: Select all

<?php /* utf8-marker = äöü */

if(file_exists('setupControl.php') && (time() - filectime('setupControl.php') > 300)) unlink('setupControl.php');

...
Wenn man nun das ganze mit setupControl.php im CMSimpleRoot ausliefert, bleiben nach dem Upload 5 min zur sofortigen Ausführung des Setup (Aufrufen der setup,php und Passwort ändern). Das dürfte im Normalfall ausreichen.

Wird man irgendwie unterbrochen (Telefon klingelt), muss man dann halt die setupControl.php per ftp wieder in das CMSimpleRoot hochladen, und man hat wieder 5 min Zeit.

Bleiben also die paar Sekunden bis zum Abschluss des Setup für einen Angriff, maximal aber 5 min.

So ist die Kompromisslösung dann schon eher akzeptabel.
Gert Ebersbach | CMSimple | Templates - Plugins - Services

olape
Posts: 1175
Joined: Fri Mar 13, 2015 8:47 am
Contact:

Re: [VOTING] XH 1.6.10

Post by olape » Tue May 26, 2020 10:55 am

Gert wrote:
Tue May 26, 2020 10:37 am
Die setup.php prüft als erstes das Alter der setupControl.php. Ist die älter als 5 min, wird sie gelöscht und Setup ist inaktiv.
Der Gedanke ist gut. Den hatte ich auch schon. Nur, FTP und Timestamp ..., das muss nicht immer funktionieren.

frase
Posts: 3352
Joined: Thu Apr 21, 2016 6:32 am
Location: Saxony
Contact:

Re: [VOTING] XH 1.6.10

Post by frase » Tue May 26, 2020 11:21 am

Gert wrote:
Tue May 26, 2020 10:37 am
Für dieses Problem habe ich eine Lösung gefunden: ...
olape wrote:
Tue May 26, 2020 10:55 am
Der Gedanke ist gut. Den hatte ich auch schon. ...
Nochmal: Daumen hoch!
Macht nur weiter so ... :D

Gert
Posts: 3075
Joined: Fri May 30, 2008 4:53 pm
Location: Berlin
Contact:

Re: [VOTING] XH 1.6.10

Post by Gert » Tue May 26, 2020 12:36 pm

olape wrote:
Tue May 26, 2020 10:55 am
Nur, FTP und Timestamp ..., das muss nicht immer funktionieren.
Jetzt lehne ich mich mal weit hinaus, weil ich das auch nicht im vollen Umfang durchdrungen habe, und auch keine Lust zu einer aufwändigen Recherche habe.

<edit> gelöscht, neue Erkenntnisse siehe "PS:" unten ;) </edit>

Wer meine Preview schon heruntergeladen hat, hier die neue setup.php zum spielen:

Code: Select all

<?php /* utf8-marker = äöü */

// timeout in seconds
$setup_timeOut = 300;

if(file_exists('setupControl.php') && $setup_timeOut - (time() - filectime('setupControl.php')) > 0)
{
	$remainingSeconds = $setup_timeOut - (time() - filectime('setupControl.php'));
}
else
{
	$remainingSeconds = 1;
}

if(file_exists('setupControl.php') && (time() - filectime('setupControl.php') > $setup_timeOut)) unlink('setupControl.php');

if (file_exists('setupControl.php') && file_exists('index.php')) 
{
	if(!class_exists('PasswordHash') && file_exists('cmsimple/PasswordHash.php'))
	{
		$pwHashPath = 'cmsimple/PasswordHash.php';
		$flagsFolder = 'userfiles/images/flags/';
		$configFolder = './cmsimple/';
	}

	if(!class_exists('PasswordHash') && file_exists('../cmsimple/PasswordHash.php') && (file_exists('cmsimplesubsite.htm') || file_exists('cmsimplelanguage.htm')) && !file_exists('../cmsimplesubsite.htm'))
	{
		$pwHashPath = '../cmsimple/PasswordHash.php';
		$flagsFolder = '../userfiles/images/flags/';
		$configFolder = './';
	}

	if(!class_exists('PasswordHash') && file_exists('../../cmsimple/PasswordHash.php') && file_exists('cmsimplelanguage.htm') && file_exists('../cmsimplesubsite.htm'))
	{
		$pwHashPath = '../../cmsimple/PasswordHash.php';
		$flagsFolder = '../../userfiles/images/flags/';
		$configFolder = './';
	}
	
	require $pwHashPath;
	$cmsimple_password_hasher = new PasswordHash(8, true);
	
	if (file_exists('cmsimplesubsite.htm') || file_exists('cmsimplelanguage.htm'))
	{
		$fileConfigSetup = './config.php';
	}
	else
	{
		$fileConfigSetup = $configFolder . 'config.php';
	}
	
	$passwordhint = '';
	if (isset($_POST['submit_password']))
	{
		if (strlen($_POST['password']) > 4)
		{
			$hash = $cmsimple_password_hasher->HashPassword($_POST['password']);
			$hash = str_replace('$P$','\$P\$',$hash);
			$content = explode("\n", htmlspecialchars(file_get_contents($fileConfigSetup),ENT_QUOTES,'UTF-8'));
			$content[2] = '$cf[\'security\'][\'password\']="' . $hash . '";';
			$myfile = fopen($fileConfigSetup, "w") or die("Unable to open file!");
			fwrite($myfile, htmlspecialchars_decode(implode("\n", $content),ENT_QUOTES));
			fclose($myfile);
			unlink('setupControl.php');
			header("Location: ./?login");
		}
		else 
		{
			if(strlen($_POST['password']) < 5) $passwordhint.= '<p style="font-size: 15px; color: #900;"><b>Your password must have<br>5 or more characters!</b></p>';
		}
	}

	echo '<!DOCTYPE html>

<html lang="en">

<head>
<meta charset="utf-8">
<title>Welcome</title>
<meta name="robots" content="noindex, nofollow">
</head>

<body style="background: #333;" onload="countDown(true)">

<script type="text/javascript"> 
function countDown(init)
{
if (init || --document.getElementById( "counter" ).firstChild.nodeValue > 0 )
	window.setTimeout( "countDown()" , 1000 );
};
</script>

<div style="background: #ddd; color: #000; width: 294px; text-align: center; font-family: arial, sans-serif; font-size: 16px; border: 5px solid #fff; border-radius: 6px; padding: 6px 24px; margin: 24px auto;">
<br><span id="counter" style="font-weight: 900; color: #900;">' . $remainingSeconds . '</span> seconds remaining
<p><b>Enter your password!</b></p>
<p>Minimum: 5 characters</p>
<form method="POST">
<input type="password" name="password" style="border: 2px solid #999; border-radius: 3px; padding: 2px 6px 3px 6px;" value="test">
<input type="submit" name="submit_password" value="Submit" style="background: #080; color: #fff; border: 2px solid #080; border-radius: 3px; padding: 1px 6px 2px 6px;">
</form>
<p style="color: #900;">' . $passwordhint . '</p>
</div>
</body>

</html>';
}
else 
{
	echo '<!DOCTYPE html>

<html lang="en">

<head>
<meta charset="utf-8">
<title>Welcome</title>
<meta name="robots" content="noindex, nofollow">
</head>

<body>
<div style="width: 280px; text-align: center; font-family: arial, sans-serif; font-size: 16px; line-height: 1.6em; padding: 36px 16px; margin: 0 auto;">
<p><b>Setup is not active.</b></p>
<p>Please read the readme.php<br>for more information.</p>
<hr>
<p><a href="./">Go to the website &raquo;</a></p>
</div>
</body>

</html>';
}

?>
Mit Countdown ;)

===================================
olape wrote:
Tue May 26, 2020 10:55 am
Nur, FTP und Timestamp ..., das muss nicht immer funktionieren.
PS: Inzwischen habe ich mich ein wenig belesen, mit ftp hat die Ausgabe des timestamp nix zu tun. Die Metadaten der Dateien (inode) werden beim Upload erstellt. Deshalb hat eine Datei nach dem Upload auf den Server auch das Datum des Uploads auf den Server, sowohl für filemtime() als auch für filectime().

Wenn ich auf dem PC (also innerhalb eines Filesystems) eine Datei mit dem Explorer verschiebe, ändert sich nur filectime(), aber nicht filemtime(), weil die Datei nur innerhalb des Filesystems verschoben wurde und deshalb die Metadaten (inode) für filemtime(), also das Datum der letzten Änderung der Dateiinhalte, erhalten bleiben.
Gert Ebersbach | CMSimple | Templates - Plugins - Services

lck
Posts: 1999
Joined: Wed Mar 23, 2011 11:43 am
Contact:

Re: [VOTING] XH 1.6.10

Post by lck » Tue May 26, 2020 4:31 pm

Gert wrote:
Tue May 26, 2020 12:36 pm
Wer meine Preview schon heruntergeladen hat, hier die neue setup.php zum spielen:
Gemacht.
Gert wrote:
Tue May 26, 2020 10:37 am
Die setup.php prüft als erstes das Alter der setupControl.php. Ist die älter als 5 min, wird sie gelöscht und Setup ist inaktiv.
setupControl.php wird bei mir leider nicht gelöscht, erst nach einem Reload der Seite (manuell per F5 oder eben per Submit-Button). Getestet mit PHP 7.2.31.
„Bevor du den Pfeil der Wahrheit abschießt, tauche die Spitze in Honig!“   👉 Ludwig's XH-Templates for MultiPage & OnePage

Gert
Posts: 3075
Joined: Fri May 30, 2008 4:53 pm
Location: Berlin
Contact:

Re: [VOTING] XH 1.6.10

Post by Gert » Tue May 26, 2020 5:11 pm

lck wrote:
Tue May 26, 2020 4:31 pm
setupControl.php wird bei mir leider nicht gelöscht, erst nach einem Reload der Seite (manuell per F5 oder eben per Submit-Button).
Genau so funktioniert das ;)

Es wird ja alles in der setup.php geregelt.

Wenn Du also das setup abbrichst, und 5 min (+ 1s) nach hochladen der setupControl.php ruft irgendjemand mit bösen Absichten die setup.php auf, löscht die setup.php die setupControl.php, bevor irgendetwas anderes passiert. Das passiert natürlich auch, wenn Du das selbst tust, oder die offene setup.php nach Ablauf der 5 min reloadest, oder das Passwort erst nach Ablauf der 5 min abschickst, deshalb der Countdown.

Ich habe gerade eine neue Testversion hochgeladen, da wird vor den Löschvorgängen die setupControl.php sicherheitshalber noch auf 0777 gesetzt:

https://www.cmsimple.org/downloadcounte ... .php?id=40
Last edited by Gert on Tue May 26, 2020 6:49 pm, edited 1 time in total.
Gert Ebersbach | CMSimple | Templates - Plugins - Services

olape
Posts: 1175
Joined: Fri Mar 13, 2015 8:47 am
Contact:

Re: [VOTING] XH 1.6.10

Post by olape » Tue May 26, 2020 5:38 pm

Gert wrote:
Tue May 26, 2020 12:36 pm
Deshalb hat eine Datei nach dem Upload auf den Server auch das Datum des Uploads auf den Server, sowohl für filemtime() als auch für filectime().
Anmerkung 2020-05-26 193147.png
Es scheint Wege zu geben, daran vorbei zu kommen. filectime() allerdings sollte tatsächlich immer funktionieren. Zumindest habe ich das so verstanden.
Gert wrote:
Tue May 26, 2020 5:11 pm
da wird vor den Löschvorgängen die setupControl.php sicherheitshalber noch auf 0777 gesetzt:
Ich bin wieder nur am stänkern ... :roll:
Für eine Datei sollte 0666 vollkommen ausreichend sein.
Allerdings, wenn du das setzen kannst, dann hat php ja bereits Schreibrechte auf die Datei, kann diese also auch löschen.
Und wenn php keine Schreibrechte hat, dann kannst du die Berechtigung auch nicht ändern.
Im Prinzip also unnötig.
You do not have the required permissions to view the files attached to this post.

Gert
Posts: 3075
Joined: Fri May 30, 2008 4:53 pm
Location: Berlin
Contact:

Re: [VOTING] XH 1.6.10

Post by Gert » Tue May 26, 2020 6:00 pm

olape wrote:
Tue May 26, 2020 5:38 pm
Es scheint Wege zu geben, daran vorbei zu kommen. filectime() allerdings sollte tatsächlich immer funktionieren. Zumindest habe ich das so verstanden.
Nach dem ftp-upload auf den Server sind bei mir filemtime() und filectime() gleich, timestamp des uploads.

Bei mir funktioniert filemtime() lokal nicht, weil das innerhalb eines Filesystems beim kopieren nicht verändert wird. Die Datei ist quasi IMMER älter als 5 min.

Also habe ich filectime() genommen.
olape wrote:
Tue May 26, 2020 5:38 pm
Ich bin wieder nur am stänkern ... :roll:
Für eine Datei sollte 0666 vollkommen ausreichend sein.
...
Ja, Gürtel und Hosenträger, mit Kanonen auf Spatzen geschossen, Angstlasche ... mir fällt da bestimmt noch mehr ein :lol:

Naja, Hauptsache, es schadet nicht ;)
Gert Ebersbach | CMSimple | Templates - Plugins - Services

olape
Posts: 1175
Joined: Fri Mar 13, 2015 8:47 am
Contact:

Re: [VOTING] XH 1.6.10

Post by olape » Tue May 26, 2020 7:49 pm

Aber, da fällt mir noch was anderes ein. Ich weiß jetzt nicht, ob es bereis vorhanden ist. Kann mit dem Tablet jetzt auch nicht nachsehen. Falls also schon daran gedacht wurde, dann ...

Wenn ich es richtig verstanden habe, erstellt das Setup von Gert eine Datei, die später per ftp umbenannt werden muss. (Erstellt oder ändert????)

Falls erstellt:
Weil viele Server eine Rechte- Vergabe oder -Anpassung nicht mehr erfordern verliert man das etwas aus den Augen. Aber es gibt auch noch Server, da haben ftp und php nicht die selben Rechte oder laufen nicht unter dem selben Benutzer. Es könnte also sein, dass die erstellte Datei vom ftp-user gar nicht verändert werden kann. Früher kannte man das oft, wenn man per ftp etwas löschen wollte, was vorher mit php angelegt wurde.
Hier wäre also ein chmod 0666 angebracht.

Falls geändert:
Könnte es natürlich andersherum sein, dass die Datei per ftp auf 0666 gesetzt werden muss, damit php diese auch ändern kann.

Gert
Posts: 3075
Joined: Fri May 30, 2008 4:53 pm
Location: Berlin
Contact:

Re: [VOTING] XH 1.6.10

Post by Gert » Wed May 27, 2020 6:10 am

olape wrote:
Tue May 26, 2020 7:49 pm
Wenn ich es richtig verstanden habe, erstellt das Setup von Gert eine Datei, die später per ftp umbenannt werden muss.
Nein, das war die "sichere Variante", die wurde nie veröffentlicht, nur diskutiert. Die fandest Du ja nicht so doll, weil "nicht simple" ;)

Die aktuell veröffentlichte Testversion ist die "Kompromissvariante", da wird das Passwort wieder direkt in der config.php geändert, was die besagte "Ein paar Sekunden Lücke" für Angreifer verursacht. Deshalb MUSS ja bei dieser Variante die setupControl.php nach dem Setup (oder eben nach 5 min beim erneuten Aufruf der setup.php) gelöscht werden.

In der readme.php steht geschrieben, dass man nach dem Setup überprüfen soll, ob Setup wirklich inaktiv ist, indem man die setup.php noch einmal aufruft. Ist Setup noch aktiv, soll man die setupControl.php per ftp löschen. Aber wer liest schon noch die readme.php, nachdem CMSimple läuft :mrgreen:

Deshalb werde ich noch folgendes tun:

1. Die setup.php prüft, ob die setupControl.php beschreibbar ist, ansonsten: Setup inaktiv

2. in der readme.php werde ich darauf hinweisen, dass die setupControl.php nach dem hochladen Schreibrechte (666) bekommen muss, sollte Setup trotz setupControl.php inaktiv sein.

Damit werde ich mich jetzt mal beschäftigen.

============================

PS: Funktioniert.

setupControl.php per ftp auf 444 gesetzt => Setup inaktiv.
setupControl.php per ftp auf 644 gesetzt => Setup aktiv (natürlich auch bei 666)

Setup ist jetzt nur dann aktiv, wenn die setupControl.php beschreibbar, also auch löschbar ist.

setup.php Zeile 21:

Code: Select all

if (is_writable('setupControl.php') && file_exists('index.php'))
Den Download habe ich aktualisiert.

PS2: Das ändern der Dateiberechtigungen per ftp ändert auch filectime(), man hat dann also wieder die 5 min Zeit.
Gert Ebersbach | CMSimple | Templates - Plugins - Services

Post Reply