Spam-Versand über ein online-Formular
Christoph Schnauß
hallo Forum,
ja, ich weiß, wir haben ein ganz ähnlich gelagertes Thema schon in Bearbeitung im Thread https://forum.selfhtml.org/?t=119369&m=765586. Ich sehe aber keine Möglichkeit, mich dort mittels "Threaddrift" anzuhängen und mache dann eben einen neuen auf.
Folgendes: seit rund einer Woche bekomme ich immer mal zwischen Mitternacht und 2 Uhr morgens eine Sendung von nahezu zeitgleich über mein online stehendes Formular an mich addressierte mails mit entweder gar keinem oder aber idiotischem Inhalt. Das sind so zwischen fünf und fünfzehn Stück, also noch lange keine "Masse" und bisher hab ich die Dinger stillschweigend gelöscht. Jetzt fange ich aber doch an, zu überlegen, ob ich nicht etwas dagegen unternehmen sollte und könnte - schließlich benutzen auch ernstzunehmende Leute mein Formular und wollen mir irgendwas mitteilen. Die "Boardmittel" scheinen allerdings nicht auszureichen.
Die erste Hürde könnte sein, daß ich meinen "mailer" tatsächlich "mail.php" genannt habe und der "bot" das Formular tatsächlich nur aufgrund seines Namens findet. Das ist derzeit aber ein reines HTML-Formular (es heißt bloß *.php), das ich eh überarbeiten wollte. Es ruft ein weiteres PHP-Script namens "senden.php" auf, und das wiederum prüft, ob ein Absendername, eine Absender-Mailadresse (die valide sein muß) und ein Text ins Formular eingetragen wurde - ein paar optionale Eintragungen (URL, Wohnort ...) dürfen auch noch gemacht werden. Nur wenn diese drei Voraussetzungen "name", "mail" und "text" erfüllt sind, kriege ich eine Benachrichtigung - und gleichzeitig bekommt der Absender ein "response".
So ... wenn jetzt also offensichtlich irgendein "bot" unterwegs ist, muß er diese drei Bedingungen auch erfüllen können, sonst schickt mir mein beim Provider liegendes Script ja gar nix. Ich habe in meinen logs nachgesehen: das Script "mail.php" ist tatsächlich mehrtausendfach aufgerufen, aber ebenfalls mehrtausendfach mit einem "Error 403" beantwortet worden. Trotzdem kommen ein paar ganz wenige "durch", deren Inhalt allerdings völliger Unsinn ist.
Ich habe mir ein paar von diesen unsinnigen mails aufgehoben und kann bei Bedarf vollständige Quelltexte zur Verfügung stellen einschließlich aller Header (Sober oder ein anderer Bösewicht war in keiner dieser mails enthalten). Interessant ist, daß bei den jüngsten Spam-mails dieser Art eine lange Liste mit mehreren hundert mail-Adressen angefügt ist. Trotzdem kriege ich in meinem "mailer" überhaupt nichts angezeigt - egal, ob ich mir das sogar in WindowsXP mit OE anschaue oder in FreeBSD unter KMail.
Alle diese mails, die über mein Formular bei mir eintrudeln, tragen im übrigen als Absenderadresse sowas Ähnliches wie "out4826@christoph-schnauss.de". Mein Provider hat mir durchaus die Möglichkeit eingeräumt, unter "XXXXX@christoph-schnauss.de" beliebig viele Mail-Accounts einzurichten, ich habe davon bisher aber gar keinen Gebrauch gemacht. Das heißt, es gibt keine reale mail-Adresse, die "XXX@christoph-schnauss.de" heißen kann, dafür existiert kein Konto.
Ich kann mich selber relativ leicht gegen den Empfang solchen Spams schützen. Und mein Provider hat seit ein paar Tagen aufgrund ähnlicher Probleme seine "Filter" umgestellt und präzisiert, es kommen ja bei mir auch immer nur einige ganz wenige von vielen tausend an. Trotzdem: wie schaffen "die" das dann, und was soll mir eine mail, in der nix andres steht als
out4826@christoph-schnauss.de
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Subject: ivry distinguished painther iv modhren times
bcc: battsl1005@aol.com
3fe43b29ce27c839cc13d05f06b39ad6
sagen? Ich verstehe einfach nicht, was der Spamer von mir will bzw. wozu er meinen Provider zu mißbrauchen versucht.
Und schließlich: wie überwindet ein "bot" meine Abfragen und trägt immerhin in die Formularfelder etwas "Gültiges" ein, wenn ich alles mit regulären Ausdrücken in der Form
if ($_SERVER['QUERY_STRING'] == "temp" && $name && !preg_match("/[^a-zA-ZäöüÄÖÜß&; ]/",$name) && $text && !preg_match("/^[^a-zA-ZäöüÄÖÜ]/",$text) && !preg_match("/^[^http:\/\/]/",$url)) {
...
}
prüfen lasse? Das Ergebnis einer fehlerhaften Eingabe sollte jeder, der mir etwas zu mailen versucht, wegen
...
if ($_SERVER['QUERY_STRING'] == "temp" && preg_match("/^[^a-zA-ZäöüÄÖÜ]/",$name)) {
$kopftext = "<h3>Fehler: Namensangabe nicht korrekt</h3>"."\n".
"Ihre Namensangabe beginnt mit einem nicht zugelassenen Zeichen";
} elseif ($_SERVER['QUERY_STRING'] == "temp" && preg_match("/[^a-zA-ZäöüÄÖÜß&; ]/",$name)) {
$kopftext = "<h3>Fehler: ungültiges Zeichen im Namen</h3>"."\n".
"Ihr Name darf nur aus Buchstaben bestehen.";
} elseif ($_SERVER['QUERY_STRING'] == "temp" && !$text) {
$kopftext = "<h3>Fehler: kein Text eingegeben</h3>"."\n".
"Sie müssen schon Ihren Text eintragen. Nur die Angaben der mail-Adresse, des Wohnorts und einer URL sind optional.";
} elseif ($_SERVER['QUERY_STRING'] == "temp" && preg_match("/^[^a-zA-ZäöüÄÖÜ]/",$text)) {
$kopftext = "<h3>Fehler: Texteingabe nicht korrekt</h3>"."\n".
"Ihre Texteingabe beginnt mit einem an dieser Stelle nicht zugelassenen Zeichen";
} elseif ($_SERVER['QUERY_STRING'] == "temp" && preg_match("/^[^http:\/\/]/",$url)) {
$kopftext = "<h3>Fehler: URL nicht korrekt</h3>"."\n".
"Wenn Sie eine URL angeben möchten, so tun Sie das bitte in der Form <b>http://www.domainname.tld</b>.".
"Korrigieren Sie Ihre Angabe bitte entsprechend.";
...
und anderen Prüfungen (z.B. auf Validität der mail-Adresse) zu sehen bekommen, bei einem Fehler bricht das Script ab und sendet mir gar nix. Dieser "bot" schafft es trotzdem. Um 23.41 hat er mir exakt sieben unsinnige mails geschickt. Der Provider hat allerdings knapp 6500 geblockt.
Grüße aus Berlin
Christoph S.
PS: ihr müßt jetzt nicht unbedingt alle mein Formularscript daraufhin testen, ob es bei fehlerhaften Angaben tatsächlich nur Fehler meldet ... ;-)
hallo,
na klasse ... eben sind wieder zwei solche mails "durchgekommen" und jeweils 300 geblockt worden. Die zugehörigen Eintragungen im Severlog lauten:
202.82.116.53 - - [27/Nov/2005:01:39:38 +0100] "POST /kontakt/senden.php HTTP/1.1" 200 1666 "http://www.christoph-schnauss.de/" "-"
202.82.116.53 - - [27/Nov/2005:01:39:39 +0100] "POST /kontakt/senden.php HTTP/1.1" 200 2120 "http://www.christoph-schnauss.de/" "-"
61.251.10.63 - - [27/Nov/2005:01:39:51 +0100] "POST /kontakt/senden.php HTTP/1.1" 200 2120 "http://www.christoph-schnauss.de/" "-"
195.251.134.99 - - [27/Nov/2005:01:39:58 +0100] "POST /kontakt/senden.php HTTP/1.1" 200 1666 "http://www.christoph-schnauss.de/" "-"
Es macht keinen Sinn, nach der Herkunft der IP-Adressen zu forschen. 202.82.116.53 ist ein "asiatischer" Anbieter, 61.251.10.63 ist ein Koreaner, und 195.251.134.99 ist ein Grieche. Die haben bloß mit an Sicherheit grenzender Wahrscheinlichkeit keine Ahnung, daß einer ihrer "Kunden" mich grade vollzumüllen versucht hat.
Ich weiß zwar, daß die "1666" die Zahl der abgerufenen Bytes (oder Bits?) angibt, aber was konkret damit ausgegeben wurde, weiß ich nicht wirklich. Wegen der "200" kanns nicht meine Fehlerseite gewesen sein ...
Grüße aus Berlin
Christoph S.
Hi,
wenns gar nicht anders geht, probiers doch mal damit, das du ein Bild mit nem "Freischaltcode" erzeugst, wie es z.B. Xoops bei der Neuanmeldung macht.
Ist zwar für einen "normalen" Besucher etwas mehr Arbeit, aber ein Bot hat keine Chance, dein Formular zu missbrauchen, da ein entsprechend verzerrtes Bild nie von einer Software ausgewertet erden kann.
gudn tach!
[Bild mit nem "Freischaltcode"]
Ist zwar für einen "normalen" Besucher etwas mehr Arbeit,
und fuer fuer unnormale benutzer (z.b. text-browsernutzer, blinde und leute, die vermoege traffic-beschraenkungen oder langsamen internetverbindungen bilder deaktivieren) ist es erheblich mehr arbeit. haeufig ist es genug arbeit, um die website einfach wieder zu verlassen.
aber ein Bot hat keine Chance, dein Formular zu missbrauchen, da ein entsprechend verzerrtes Bild nie von einer Software ausgewertet erden kann.
"nie" ist falsch. so ziemlich alles, was ein mensch lesen kann, kann auch von einer maschine gelesen werden, wenn sie entsprechend programmiert wird.
allerdings machen sich die spammer wohl aeusserst selten die muehe eine gute ocr-software zu benutzen, was diese methode dann doch wieder sehr effektiv (sogar zu effektiv, siehe oben) macht.
nach meiner erfahrung ist die bild-methode aber (z.zt. noch) overkill. es genuegt z.zt. (weil es kaum jemand so macht) ein zusaetzliches textfeld mit einer beschriftung wie
"schreibe bitte in das nebenstehende textfeld 'schweinekotze' hinein"
oder etwas schwieriger so was wie
"wie kuerzt man umgangssprachlich das wort 'automobil' ab?",
um die meisten spam-bots abzuhalten.
prost
seth
Hi,
Die erste Hürde könnte sein, daß ich meinen "mailer" tatsächlich "mail.php" genannt habe und der "bot" das Formular tatsächlich nur aufgrund seines Namens findet.
Ist durchaus moeglich und sogar wahrscheinlich.
Ein Dateiname der Art 'head -c 16 /dev/random | md5sum' waere da schon eine ganz gute Erste-Hilfe-Massnahme.
(Eine kryptographisch saubere Loesung gibt es dafuer aber eh nicht)
Nur wenn diese drei Voraussetzungen "name", "mail" und "text" erfüllt sind,
Heissen die Formular-Felder evt auch so?
Trotzdem kommen ein paar ganz wenige "durch", deren Inhalt allerdings völliger Unsinn ist.
Du hast ja auch "Unsinn" nicht verboten! ;-)
Interessant ist, daß bei den jüngsten Spam-mails dieser Art eine lange Liste mit mehreren hundert mail-Adressen angefügt ist.
Das ist wenigstens noch normal, die wollen ja schliesslich Dein Formular als Relay missbrauchen; so ein Botnet ist teuer.
Trotzdem kriege ich in meinem "mailer" überhaupt nichts angezeigt - egal, ob ich mir das sogar in WindowsXP mit OE anschaue oder in FreeBSD unter KMail.
Ein Hexeditor wuerde da wahrscheinlich auch nicht helfen. Aber zumindest die Zeilenenden sichtbar machen.
Alle diese mails, die über mein Formular bei mir eintrudeln, tragen im übrigen als Absenderadresse sowas Ähnliches wie "out4826@christoph-schnauss.de".
Das ist normal, denn es ist an dem Punkt ja schon sicher, das die Domain christoph-schnauss.de existiert und hoechstwahrscheinlich auch einen MX besitzt. (Das duerfte aus Kostengruenden wohl kaum kontrolliert werden, aber man weiss ja nie)
Mein Provider hat mir durchaus die Möglichkeit eingeräumt, unter "XXXXX@christoph-schnauss.de" beliebig viele Mail-Accounts einzurichten, ich habe davon bisher aber gar keinen Gebrauch gemacht. Das heißt, es gibt keine reale mail-Adresse, die "XXX@christoph-schnauss.de" heißen kann, dafür existiert kein Konto.
Waere ja auch noch schoener, dann wuerde man ja noch schneller auffliegen! ;-)
Trotzdem: wie schaffen "die" das dann
Die probieren einfach, denn denen reicht eine Mail, da sie nicht Dir Spam
schicken, sondern Dein Formular missbrauchen wollen.
und was soll mir eine mail, in der nix andres steht als
out4826@christoph-schnauss.de
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Subject: ivry distinguished painther iv modhren times
bcc: battsl1005@aol.com
3fe43b29ce27c839cc13d05f06b39ad6sagen?
Das der Botnetbenutzer zu geizig ist ein profesionelles Programm einzusetzen.
Ich verstehe einfach nicht, was der Spamer von mir will bzw. wozu er meinen Provider zu mißbrauchen versucht.
Wie gesagt: er will wahrscheinlich Dein Formular als Spamrelay gebrauchen.
Und schließlich: wie überwindet ein "bot" meine Abfragen und trägt immerhin in die Formularfelder etwas "Gültiges" ein, wenn ich alles mit regulären Ausdrücken in der Form
Alles eine Frage der rechten Enthropie und eines guten PRNGs ;-)
BTW: Deine Fehlermeldungen vom Formular sind wenig aussagekraeftig. Sei doch nicht so sparsam mit den Worten!
Dieser "bot" schafft es trotzdem. Um 23.41 hat er mir exakt sieben unsinnige mails geschickt. Der Provider hat allerdings knapp 6500 geblockt.
Ja, sieht nach einem direktem Angriffsversuch aus.
PS: ihr müßt jetzt nicht unbedingt alle mein Formularscript daraufhin testen, ob es bei fehlerhaften Angaben tatsächlich nur Fehler meldet ... ;-)
Ja, noe, wieso? Du hast doch schon den Code gepostet, wir nutzen also die so veroeffentlichten Sicherheitsluecken direkt ;-)
so short
Christoph Zurnieden
hallo Christoph,
Ein Dateiname der Art 'head -c 16 /dev/random | md5sum' waere da schon eine ganz gute Erste-Hilfe-Massnahme.
Oha. Es ist mir tatsächlich neu, daß ich als Dateiname auch eine pipe angeben könnte.
Nur wenn diese drei Voraussetzungen "name", "mail" und "text" erfüllt sind,
Heissen die Formular-Felder evt auch so?
Öhm ... sie hießen bis vor kurzem auch so, ja. Das "Problem" hab ich ja erst seit rund einer Woche. Inzwischen sollten sie nicht mehr so heißen. Das Formular ist ein paar Jahre alt, und "früher" ist ja niemand auf die Idee gekommen, daraus Unsinn abzuleiten.
Trotzdem kommen ein paar ganz wenige "durch", deren Inhalt allerdings völliger Unsinn ist.
Du hast ja auch "Unsinn" nicht verboten! ;-)
Ganz einfach deshalb, weil ich selbst ein guter Mensch bin und mir einfach nicht vorstellen konnte, daß jemand eben "Unsinn" posten will. Das kann ich aber noch beheben und allerhand "Unsinn" kann ich auch verbieten. Definiere du aber bitte mal mit regExes "Unsinn".
Trotzdem kriege ich in meinem "mailer" überhaupt nichts angezeigt - egal, ob ich mir das sogar in WindowsXP mit OE anschaue oder in FreeBSD unter KMail.
Ein Hexeditor wuerde da wahrscheinlich auch nicht helfen. Aber zumindest die Zeilenenden sichtbar machen.
Naja, selbst im OE gibts die Möglichkeit, den "Quelltext" anzeigen zu lassen (wozu die mail allerdings erst vom Server runtergeladen werden muß), und da kriege ich dann schon allerhand zu sehen, und es braucht keinen Hexeditor.
es gibt keine reale mail-Adresse, die "XXX@christoph-schnauss.de" heißen kann, dafür existiert kein Konto.
Waere ja auch noch schoener, dann wuerde man ja noch schneller auffliegen! ;-)
Ok, dann hab ich an dieser Stelle wnigstens mal was richtig gemacht ;-)
Wie gesagt: er will wahrscheinlich Dein Formular als Spamrelay gebrauchen.
Ja, wahrscheinlich. Aber kann ich auch irgendwie rauskriegen, ob er das hingekriegt hat? Meine Sorge ist einfach, daß meine Adresse tatsächlich als "Spam-Schleuder" mißbraucht werden könnte, _obwohl_ alles, was ich selber an den logs usw. diagnostizieren kann, dagegenspricht und _obwohl_ mein Provider durchaus konziliant ist, das Problem kennt, und Gegenmaßnahmen probiert.
BTW: Deine Fehlermeldungen vom Formular sind wenig aussagekraeftig. Sei doch nicht so sparsam mit den Worten!
Och ...
PS: ihr müßt jetzt nicht unbedingt alle mein Formularscript daraufhin testen, ob es bei fehlerhaften Angaben tatsächlich nur Fehler meldet ... ;-)
Ja, noe, wieso? Du hast doch schon den Code gepostet, wir nutzen also die so veroeffentlichten Sicherheitsluecken direkt ;-)
Boah ... immer auf das Schlimme. Hehe, ich habe nicht wirklich alle Sicherheitslücken gepostet (es gibt noch mehr *g*). Aber ich arbeite dran.
Das Doofe ist ja, daß man auf eventuelle "Lücken" immer erst dann aufmerksam wird, wenns mal ein anderer mit irgendwelchem nervigen Zeugs testet.
Grüße aus Berlin
Christoph S.
Hallo Christoph,
Ein Dateiname der Art 'head -c 16 /dev/random | md5sum' waere da schon eine ganz gute Erste-Hilfe-Massnahme.
Oha. Es ist mir tatsächlich neu, daß ich als Dateiname auch eine pipe angeben könnte.
aber nicht doch. Christoph meinte nur, Du solltest Dir so einen Dateinamen erzeugen. Warum hast Du es nicht ausprobiert? Hast Du nach Deinem Boarddesaster keine einzige Linux- oder Unixkiste mehr laufen?
head -c 16 /dev/random
"head <dateiname>" gibt die ersten 10 Zeilen einer Datei aus.
Mit der Option "-c <anzahl>" wird stattdessen <anzahl> Bytes ausgegeben, d.h. hier 16 Bytes aus /dev/random.
/dev/random liefert eine kryptographisch sicheren Zufallsausgabe, siehe z.B. http://publib.boulder.ibm.com/infocenter/pseries/topic/com.ibm.aix.doc/files/aixfiles/random.htm.
Über die Pipe ermittelst Du die MD5-Prüfsumme dieser 16 Zufallszeichen. Das Ergebnis, die MD5-Prüfsumme einer 16-Zeichen-Zufallsausgabe, sollst Du als Dateinamen verwenden; das ist die Empfehlung von Christoph Z.
Prinzipiell gesehen "security by obscurity", weil der Aufwand für die Ermittlung des Skriptes steigt. Spammer könnten zwar grundsätzlich Webseiten auf das Action-Attribut des <form>-Tags abscannen, aber bei weitem nicht jedes Formular dient dem Mailversand :-) Wenn der Scriptname, das über das Formular aufgerufen wird, vermuten lässt, dass es sich um einen Formmailer handelt, dann ist es einen Angriffsversuch wert.
Freundliche Grüße
Vinzenz
hallo Vinzenz,
Oha. Es ist mir tatsächlich neu, daß ich als Dateiname auch eine pipe angeben könnte.
aber nicht doch.
Schon gut.
Christoph meinte nur, Du solltest Dir so einen Dateinamen erzeugen. Warum hast Du es nicht ausprobiert? Hast Du nach Deinem Boarddesaster keine einzige Linux- oder Unixkiste mehr laufen?
Doch, ich habs inzwischen probiert. Ich weiß bloß noch nicht, ob ich mit solchen Zufallsnamen in einer Hierarchie aus Verweisen arbeiten kann - es sollte eigentlich gehen, aber da muß ich noch ein paar Scriptbasteleien anstellen.
Und natürlich habe ich noch ein einstzfähiges Gentoo hier, auch eine SUSE und FreeBSD. Notfalls könnten mir noch zwei weitere Rechner "abstürzen", ehe ich arbeitsunfähig werde.
Wenn der Scriptname, das über das Formular aufgerufen wird, vermuten lässt, dass es sich um einen Formmailer handelt, dann ist es einen Angriffsversuch wert.
Ich habs noch nicht korrigiert, obwohl im Lauf des Tages nochmal elf mails durchgekommen sind. Es gibt da aber eine "Entwicklung": alle elf, die heute eintrafen, kamen zwar wieder über ukrainische, peruanische, bolivianische und südkoreanische IP-Adressen, aber mittlerweile haben sie Text. Ich soll mir in den USA Medikamente kaufen, damit ich nicht eines Tages an Diabetes mellitus sterbe ... Da hat sich der "bot" vermutlich eingeschossen und vorher bloß rumprobiert, ob er eine valide Adresse findet.
Ärgerlicherweise ist das eine "Spielwiese", die eigentlich nicht für dieses Wochenende vorgesehen war. Genausowenig wie mein Rechnercrash. Ich brauche eine Spende in Höhe von ca. 40,- Euro, um mir über ebay (per "SofortKauf") ein baugleiches Motherboard holen zu können. Vielleicht sollte ich ein paar Flaschen Holunderwein auf dem Weihnachtsmarkt feilbieten?
Grüße aus Berlin
Christoph S.
Hallo Christoph,
Ich brauche eine Spende in Höhe von ca. 40,- Euro, um mir über ebay (per "SofortKauf") ein baugleiches Motherboard holen zu können.
Das kommt mich ziemlich viel vor. OK, es hat 6 PCI-Steckplätze. Benötigst Du die wirklich alle? Oder käme auch ein anderes P-III-taugliches Board in Frage (mit der Konsequenz, dass Du ggf. Deine Betriebssysteme neu installieren müsstest)? Denn für den Preis solltest Du ja fast schon einen kompletten Rechner aus dem Jahr 2000 oder 2001 bekommen.
Vielleicht sollte ich ein paar Flaschen Holunderwein auf dem Weihnachtsmarkt feilbieten?
Das ist nicht die schlechteste Idee.
Freundliche Grüße
Vinzenz
hallo Vinzenz,
Das kommt mich ziemlich viel vor. OK, es hat 6 PCI-Steckplätze. Benötigst Du die wirklich alle? Oder käme auch ein anderes P-III-taugliches Board in Frage (mit der Konsequenz, dass Du ggf. Deine Betriebssysteme neu installieren müsstest)?
Das Problem ist, daß "andere" Motherboards auch andere Abmessungen haben können und sich dann nicht mehr in das Rechnergehäuse einschrauben lassen. An sich ist es mir wurscht, welches Motherboard ich da einsetze, es muß sich bloß in die "Kiste" einschrauben lassen.
Vielleicht sollte ich ein paar Flaschen Holunderwein auf dem Weihnachtsmarkt feilbieten?
Das ist nicht die schlechteste Idee.
Diesen Hinweis habe ich befürchtet :-(
Grüße aus Berlin
Christoph S.
Hi,
Ein Dateiname der Art 'head -c 16 /dev/random | md5sum' waere da schon eine ganz gute Erste-Hilfe-Massnahme.
Oha. Es ist mir tatsächlich neu, daß ich als Dateiname auch eine pipe angeben könnte.
Waeren die '/' nicht drin koenntest Du das sogar direkt als Dateiname nutzen, stimmt. So waere da natuerlich etwas mehr Arbeit noetig, da erst ein Verzeichnis namens 'head -c 16 ' angelegt werden muesste und darin dann das Verzeichnis 'dev' und darin erst die Datei 'random | md5sum'.
Mensch, Du bist aber auch kleinlich heute, nur weil ich da versehentlich Anfuehrungszeichen statt Backticks gesetzt habe,
Ts ts ts
;-)
Das Formular ist ein paar Jahre alt, und "früher" ist ja niemand auf die Idee gekommen, daraus Unsinn abzuleiten.
Die noetige Rechenkraft aber vor allem die Bandbreite steht noch nicht lange allgemein zur Verfuegung.
Ein Hexeditor wuerde da wahrscheinlich auch nicht helfen. Aber zumindest die Zeilenenden sichtbar machen.
Naja, selbst im OE gibts die Möglichkeit, den "Quelltext" anzeigen zu lassen (wozu die mail allerdings erst vom Server runtergeladen werden muß), und da kriege ich dann schon allerhand zu sehen, und es braucht keinen Hexeditor.
Naja, ein 'hexdump -C $DATEI |less' ist da auf jeden Fall schneller als ein OE gestartet ;-)
Wie gesagt: er will wahrscheinlich Dein Formular als Spamrelay gebrauchen.
Ja, wahrscheinlich. Aber kann ich auch irgendwie rauskriegen, ob er das hingekriegt hat?
Da die Zeit des Angriffes bekannt ist koenntest Du fuer die Zeit ein Full-Log einstellen, d.h. den POST irgendwohin wegschreiben.
Interessant ist dabei natuerlich auch, was abgewehrt wird, was also gar nicht erst funktioniert.
Das Doofe ist ja, daß man auf eventuelle "Lücken" immer erst dann aufmerksam wird, wenns mal ein anderer mit irgendwelchem nervigen Zeugs testet.
Nunja, ist doch auch 'ne Art von Peer-Review, oder? ;-)
so short
Christoph Zurnieden
hallo Christoph,
Mensch, Du bist aber auch kleinlich heute, nur weil ich da versehentlich Anfuehrungszeichen statt Backticks gesetzt habe
Nö, ich nehme dich lediglich beim Wort und traue dir eine ebenso hilfreiche wie ernstzunehmende Antwort zu ;-)
Wie gesagt: er will wahrscheinlich Dein Formular als Spamrelay gebrauchen.
Ja, wahrscheinlich. Aber kann ich auch irgendwie rauskriegen, ob er das hingekriegt hat?
Da die Zeit des Angriffes bekannt ist koenntest Du fuer die Zeit ein Full-Log einstellen, d.h. den POST irgendwohin wegschreiben.
Gut, das probiere ich mal.
Das Doofe ist ja, daß man auf eventuelle "Lücken" immer erst dann aufmerksam wird, wenns mal ein anderer mit irgendwelchem nervigen Zeugs testet.
Nunja, ist doch auch 'ne Art von Peer-Review, oder? ;-)
Sicher. Man muß halt immer mal was Neues lernen, dummerweise imemr genau an den Stellen, wo es nie vermutet wurde.
Grüße aus Berlin
Christoph S.
PS: es gibt immer noch ungefähr alle zwei Tage Zugriffe auf deinen Artikel. Trotzdem würde ich dich bitten, jetzt mal langsam ein Backup zu machen, weil ich ihn wieder runterschmeißen möchte- die "Mietfrist" ist ja mittlerweile deutlich überschritten.
Hi,
Das Doofe ist ja, daß man auf eventuelle "Lücken" immer erst dann aufmerksam wird, wenns mal ein anderer mit irgendwelchem nervigen Zeugs testet.
Nunja, ist doch auch 'ne Art von Peer-Review, oder? ;-)Sicher. Man muß halt immer mal was Neues lernen, dummerweise imemr genau an den Stellen, wo es nie vermutet wurde.
Ea natura hominum est >;->
PS: es gibt immer noch ungefähr alle zwei Tage Zugriffe auf deinen Artikel. Trotzdem würde ich dich bitten, jetzt mal langsam ein Backup zu machen, weil ich ihn wieder runterschmeißen möchte- die "Mietfrist" ist ja mittlerweile deutlich überschritten.
Habe ich Dir keinen Bescheid gegeben? Von wegen meiner kaputte Kiste, meiner herzlichen Unlust eine neue einrichten zu wollen und meinem merkwuerdigem Backupverhalten bezueglich privater Klamotten mitsamt damit verbundenem Verlust saemtlicher privater Korrespondenz und somit auch Passwort/Username?
Dann bitte ich herzlich um Entschuldigung. Ich koennte Dich ja bitte den Schisselameng zu entsorgen, aber mein privater Schluessel ist leider ebenfalls auf der Platte auf die ich gerade keinen Zugriff habe.
Hach ne, man hat et nich' leicht ;-}
so short
Christoph Zurnieden
Lieber Christoph,
Ein Dateiname der Art 'head -c 16 /dev/random | md5sum' waere da schon eine ganz gute Erste-Hilfe-Massnahme.
Das interessiert mich jetzt genauer! Kannst Du mir das mit der Pipe bitte etwas näher erklären? Wie würde denn dieser "Dateiname" genau eingesetzt? Ist das dann so eine Art <form action="head -c 16 /dev/random | md5sum" ...> ?
Mich interessiert dieses Thema sehr, da ich davon so absolut keine Ahnung habe, aber meine Scripte gerne sicher hätte. Alles das, was Christoph S. an Code gepostet hat, ist auch das, was ich noch verstehe (und deshalb daran auch nix unsicheres finden kann). Wie genau müsste ein Angreifer da jetzt vorgehen?
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Hi,
Ein Dateiname der Art 'head -c 16 /dev/random | md5sum' waere da schon eine ganz gute Erste-Hilfe-Massnahme.
Das interessiert mich jetzt genauer!
Das ist ein Scherz, der dahin zielt, das die Wahl des Dateinamens 'mail.php' einem Angreifer die Arbeit erleichtert und die Namensnennung deshalb geaendert werden sollte.
Das gilt aber nicht umgekehrt! Diese Namensaenderung, selbst wenn der Name aus Zufallsdaten besteht macht es _nicht_ sicherer!
(Ja, Vincent, das hast Du dem Sinn nach auch schon gesagt, ich wollte dem nur nochmal Nachdruck verleihen)
so short
Christoph Zurnieden
Hallo Christoph!
ja, ich weiß, wir haben ein ganz ähnlich gelagertes Thema schon in Bearbeitung im Thread https://forum.selfhtml.org/?t=119369&m=765586.
Dann bleibe doch bitte auch in diesem Thema.
Ich danke Dir.
Gruss, Werner Pechel
Moin,
Gruss, Werner Pechel
Wer ist Werner Pechel?
Und kann Werner Pechel lesen?
TomIRL
HI there,
Gruss, Werner Pechel
Wer ist Werner Pechel?
Und kann Werner Pechel lesen?
Wahrscheinlich wollte er auch einmal "Doppelposting" schreiben. Was mich in diesem Zusammenhang allerdings interessiert, wäre die Beantwortung der Frage, wofür in diesem Zusammenhang das "wer ist Werner Pechel" relevant ist...
Hallo Klawischnigg,
Was mich in diesem Zusammenhang allerdings interessiert, wäre die Beantwortung der Frage, wofür in diesem Zusammenhang das "wer ist Werner Pechel" relevant ist...
ist eigentlich egal, aber die Art und Weise von TomIRL war imho nicht sehr nett.
Mit freundlichen Grüßen,
André
hallo,
ja, ich weiß, wir haben ein ganz ähnlich gelagertes Thema schon in Bearbeitung im Thread https://forum.selfhtml.org/?t=119369&m=765586.
Dann bleibe doch bitte auch in diesem Thema.
Im "Thema" bin ich ja geblieben, bloß habe ich mich in den Thread nicht eingeschaltet.
Die Sache mit dem "Doppelposting" ist so: wenn jemand eine Frage stellt, macht er ja damit einen neuen Thread auf. Hier im Forum ist es sehr selten so, daß eine Frage unbeantwortet bleibt. Und innerhalb eines Threds können sich Titel und Thema ändern, das nennt man "Threaddrift". Wenn jetzt der OP (OP steht wahlweise für "Originalposter" oder "Originalposting") seine Frage eventuell am nächsten Tag nochmals stellt und wiederum einen neuen Thread eröffnet, so ist das ein "Doppelposting". In fast allen Fällen wird das auch bemerkt, und die Forumsmoderation reagiert, indem das Antwortformular gestrichen wird.
Wenn aber jemand anderes eventuell zu einem vergleichbaren Thema auch eine Frage hat und damit einen neuen Thread eröffnet, so ist das in der Forumsphilosophie kein "Doppelposting". Es gibt beispielsweise manchmal Tage, an denen fünf verschiedene Leute dieselbe Frage zum Thema "Frames" haben. Das mögen zwar inhaltliche Verdopplungen sein, es zeigt aber eher, daß an verschiedenen Schulen eben grade "Frames" im Lehrplan behandelt werden, und die cleversten Schüler wissen natürlich, wo man sich Rat holen kann bei Hausaufgaben. Niemandem ist bisher der Gedanke gekommen, dann einem Fragesteller gleich das böse Wort vom "Doppelposting" vor den Latz zu knallen. Was man tun kann, ist aber der Hinweis, daß dasselbe Thema bereits in einem anderen aktuellen Thread behandelt wird und dort vielleicht bereits Antworten zu finden sind.
Das trifft bei meiner Nachfrage nicht zu, obwohl es nicht nur einen, sondern zwei Threads mit vergleichbarer Themenstellung im aktuellen Forum gibt. Aber nur das Thema ist vergleichbar, die Fragestellung und die gesuchten Lösungen sind es schon nicht mehr.
Ich danke Dir.
Wofür?
Grüße aus Berlin
Christoph S.
Moin Christian! Auch schon aufgewacht? Das Problem hatten wir doch schon neulich... hier die damals schon vorgestellte Lösung:
<?php
# jrubin3456.inc.php
function jrubin3456($intMaxAllowed, $strFields) {
# Übergeben Sie dieser Funktion als Int wieviele Formularfelder ein
# '@' enthalten dürfen sowie als String eine Komma-separierte
# Liste aller Rückgaben von Formularfeldern, die einzeilig sein sollen.
# Die Funktion liefert ein true zurück, wenn in den Feldern Zeilenumbrüche
# vorkommen oder die zulässige Anzahl der Felder mit einem '@' überschritten wird
# Beispiel eines Aufrufs:
#
/*
if (jrubin3456(2, 'name,email,firma,position')) {
header("HTTP/1.0 403 Forbidden");
die("Spam attempt denied");
}
*/
if ((!isset($strFields)) || (trim($strFields)=='')) {
die ("Error: in function jrubin3456: Es wurden keine Feldnamen übergeben");
}
$arFields=explode(',', $strFields);
if ($intMaxAllowed > count($arFields)) {
die ("Error: in function jrubin3456: Die Anzahl der erlaubten Felder mit @ ist größer als die Anzahl der Felder.");
}
$intFoundAet=0;
foreach ($arFields as $strField) {
$strField = trim ($strField);
if (isset($_POST[$strField])) {
if ((strpos($_POST[$strField],"\n")) || (strpos($_POST[$strField],"\r"))) {
return true;
}
if (strpos($_POST[$strField],'@')) {
$intFoundAet++;
}
}
if (isset($_GET[$strField])) {
if ((strpos($_GET[$strField],"\n")) || (strpos($_GET[$strField],"\r"))) {
return true;
}
if (strpos($_GET[$strField],'@')) {
$intFoundAet++;
}
}
if ($intFoundAet > $intMaxAllowed)
return true;
}
}
?>
<?php
function jrubin3456($intMaxAllowed, $strFields) {
# Übergeben Sie dieser Funktion als Int wieviele Formularfelder ein
# '@' enthalten dürfen sowie als String eine Komma-separierte
# Liste aller Rückgaben von Formularfeldern, die einzeilig sein sollen.
# Die Funktion liefert ein true zurück, wenn in den Feldern Zeilenumbrüche
# vorkommen oder die zulässige Anzahl der Felder mit einem '@' überschritten wird
# Beispiel eines Aufrufs:
#
/*
if (jrubin3456(2, 'name,email,firma,position')) {
header("HTTP/1.0 403 Forbidden");
die("Spam attempt denied");
}
*/
if ((!isset($strFields)) || (trim($strFields)=='')) {
die ("Error: in function jrubin3456: Es wurden keine Feldnamen übergeben");
}
$arFields=explode(',', $strFields);
if ($intMaxAllowed > count($arFields)) {
die ("Error: in function jrubin3456: Die Anzahl der erlaubten Felder mit @ ist größer als die Anzahl der Felder.");
}
$intFoundAet=0;
foreach ($arFields as $strField) {
$strField = trim ($strField);
if (isset($_POST[$strField])) {
if ((strpos($_POST[$strField],"\n")) || (strpos($_POST[$strField],"\r"))) {
return true;
}
if (strpos($_POST[$strField],'@')) {
$intFoundAet++;
}
}
if (isset($_GET[$strField])) {
if ((strpos($_GET[$strField],"\n")) || (strpos($_GET[$strField],"\r"))) {
return true;
}
if (strpos($_GET[$strField],'@')) {
$intFoundAet++;
}
}
if ($intFoundAet > $intMaxAllowed)
return true;
}
}
?>
<?php
# mailsenden.php
# in trauernden Andenken an jrubin3456, der mich einst genervt hat und dieses Muster mit
# wechselnden Adressen wiederholt...
include 'jrubin3456.inc.php';
if (jrubin3456(2, 'formelement_1,formelement_2,formelement_3,formelement_4,...,subject,senderadresse')) {
#header("HTTP/1.0 403 Forbidden");
#die("Spam attempt denied");
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://127.205.107.112");
header("Connection: close");
exit;
}
# Der Rest Deines Mailskriptes
?>
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
hi fastix®,
Moin Christian!
Ähm ... ich heiße Christoph. *g*
hier die damals schon vorgestellte Lösung:
[...]
Jau, die ist mir nicht völlig unbekannt. Es wr leider aber eine _für mich_ bisher keine praktikable Lösung.
Grüße aus Berlin
Christoph S.
hallo,
vielleicht hilfts bei der Diagnose etwas weiter: ich habe mir mal mehrere Header doch sehr genau angeschaut - und mit Headern verglichen, die mir "normale" Leute mitgeschickt haben, die das Formular so nutzten, wie es seinem Sinn entspricht. Ich setze mal so einen Header hierher:
Return-path: www-data@admin50.webjanssen.de
Envelope-to: christoph.schnauss@berlin.de
Delivery-date: Tue, 29 Nov 2005 22:39:06 +0100
Received: from www50.webjanssen.de ([195.140.208.50] helo=admin50.webjanssen.de)
by daiquiri.visp.de with esmtp (Exim 4.54 id 1EhDBq-000CcQ-8E)
for christoph.schnauss@berlin.de; Tue, 29 Nov 2005 22:39:06 +0100
Received: by admin50.webjanssen.de (admin50.webjanssen.de, from userid 96)
id 4C3027D0046; Tue, 29 Nov 2005 22:39:16 +0100 (CET)
To: christoph.schnauss@berlin.de
Subject: online-Formular
von: him
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Subject: th king
Message-Id: 20051129213916.4C3027D0046@admin50.webjanssen.de
Date: Tue, 29 Nov 2005 22:39:16 +0100 (CET)
From: www-data@admin50.webjanssen.de
Dazu folgendes: www-data@admin50.webjanssen.de ist tatsächlich die voreingestellte mail-Adresse meines Providers in sendmail. Das hat also nichts zu bedeuten, jedenfalls nicht für meine Fragestellung. Und da das Ganze über ein online-Formular läuft, hab ich auch einen Protokolleintrag für den Formularzugriff, obwohl ja mails sonst mit HTTP nichts zu tun haben. Die IP für den Zugriff auf mein Formular ist hier ein Thailänder. Also nutzlose Information.
Aber: "Content-Transfer-Encoding: 7bit" ist das, was ich an diesem Header noch nicht verstehe. Bei keiner einzigen mail, die mich regelgerecht erreicht hat, hat sowas dringestanden. Und ich habe zwar eine Ahnung, was diese sieben bit bedeuten könnten (ich glaub, das wurde auch früher schonmal hier im Forum diskutiert), bin mir aber keineswegs sicher. Ich habe jetzt mal diesen String "7bit" mit einem regulären Ausdruck (allerdings _nur_ für die als erforderlich deklarierte mail-Adresse) verboten, genauso darf der string "schnauss" nicht in der Absender-Mailadresse enthalten sein. Die Folge: mein Script hat tatsächlich gegen 0 Uhr 03 sibezehn Anfragen zwar mit einer 200 beantwortet, zugleich aber sich selbst beendet, und im Server-log gibts für dieselbe Minute 67 weitere Scriptabbrüche.
Ich bin ja nach wie vor nicht ganz sicher, ob nicht mein Script noch irgendwelche Löcher hat (die hat es bestimmt, vermutlich aber an anderen Stellen), habe mich jetzt aber erstmal darauf konzentriert, diese beiden Sachen "7bit" und "schnauss" als ungültig zurückweisen zu lassen - bis vor drei Tagen gab es leider auch noch eine Antwortfunktion, daß selbst bei einer Fehlerausgabe an den Eintragenden eine freundliche Bemerkung zurückgeschickt wurde, er möge doch bitte seine Eintragung überdenken - und in dieser Antwort stand dummerweise noch meine korrekte mail-Adresse drin. Die Folge war, daß bei meinem mail-Provider jetzt unabhängig von meinem Formular ein paar hundert mails mit dem Absender www-data@admin50.webjanssen.de aufliefen. Das ist dort dann zwar vom Spamfilter geblockt worden, aber der "bot" hatte einen Tag lang keinen Grund mehr, über mein Formular zu gehen, sondern versuchte es auf direktem Weg.
Ich hätte jetzt gerne mal einen log-Eintrag von jemandem, der als Absenderadresse irgendwas wie XXX@christoph-schnauss.de einträgt. Gewissermaßen als Prüfung, um logs, die ich nicht selber provoziert habe, vergleichen zu können. Das Script müßte sich mit dem Abschicken des Formularinhalts beenden, vorher aber noch rasch den eingegebenen Text an die Absendermail zurückzuliefern versuchen. Das ist zwar ein doofes Spielchen (es schlägt ja nicht auf den "bot" zurück, sondern nur auf den Server meines online-Providers), ich nehme das auch spätestens morgen abend wieder zurück, aber vielleicht kirege ich mit Header und log noch etwas genauer heraus, was ich meinem Script als Aufgabe zuweisen sollte.
Grüße aus Berlin
Christoph S.
Moin!
hallo,
vielleicht hilfts bei der Diagnose etwas weiter: ich habe mir mal mehrere Header doch sehr genau angeschaut - und mit Headern verglichen, die mir "normale" Leute mitgeschickt haben, die das Formular so nutzten, wie es seinem Sinn entspricht. Ich setze mal so einen Header hierher:
Subject: online-Formular
von: him
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Subject: th king
Message-Id: 20051129213916.4C3027D0046@admin50.webjanssen.de
Date: Tue, 29 Nov 2005 22:39:16 +0100 (CET)
From: nobody at example.org
Dein Provider wird stolz sein, weil er jetzt noch mehr für seinen Spamfilter zu tun bekommt.
Ist das jetzt eine "reguläre" Nachricht oder ein Angriff?
Hübsch. Sieht so aus, als ob Du die Subjekt-Zeile womöglich nicht auf Zeilenumbrüche untersuchst. Wenn Du das Subjekt selbst setzt, wieso ist dann ein zweites drin? Eventuell aus dem Body... dann wurde es aber vom Mailer nicht beachtet. Ferner ist das nicht der Quelltext, sondern schon eine Interpretation Deiner Software ("von: him"). Um etwas zu beurteilen braucht man das Original, keine mehr oder weniger unsachgemäße Interpretation desselben.
- bis vor drei Tagen gab es leider auch noch eine Antwortfunktion, daß selbst bei einer Fehlerausgabe an den Eintragenden eine freundliche Bemerkung zurückgeschickt wurde, er möge doch bitte seine Eintragung überdenken
Mach das per http. Ich leite ihn mit einem 301er auf seinen localhost um.
Ich hätte jetzt gerne mal einen log-Eintrag von jemandem
Hm. reicht es nicht, wenn Du alle gesendeten Daten (und die IP des Senders sowie den Zeitpunkt) schön bytegenau an ein Textfile ranhängst und dieses per HTTP oder FTP ziehts?
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
Moin!
Übrigens: 7bit-- ASCII- das ist der Zeichensatz, der laut RFC tatsächlich übertragen wird. Einem anglophonen Spammer dürfte das reichen. Warum sollte der den content transformieren?
Noch ein Tipp: Ich habe mit meinem Skript erreicht, dass Ruhe im Karton ist. Vielleicht willst Du es doch, entsprechend klug parametrisiert oder angepasst, verwenden.
Daneben habe ich übrigens zu drastischen Maßnahmen gegriffen und einen IP-Adressbereich gesperrt:
61.152.0.0 - 61.152.255.255
Schickte mir Chinesischen Spam per Formular... und ein Besucher aus China ist einfach auf der rein deutsch- sprachigen und entsprechend interessenlastigen Seite nicht zu erwarten.
Noch ein Sperrkandidat: pm-solutions@web.de - missbrauchte das Antwortformular auf dieWohnung.de und schickte Wohnungssuchenden Kreditspam. Es ist aufgrund von dessen Antworten zu befürchten, dass der Spammer auch andere Seiten entsprechend missbraucht.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®