Bruteforce elminieren

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Bruteforce elminieren

    Ich experimentier gerade mit einer weiteren Lösung gegen Bruteforce angriffe.

    Also bislang schützt sich mein Script gegen bruteforce atacken mit einer simplen 3 sekunden verzögerung wenn ein passwort falsch eingegeben wurde, mit der sperrung der IP für eine einstellbahre Zeit bei 4 maligen falscher eingabe des passworts, der abfrage eines Zahlencodes (als image angezeigt) der schon nach der ersten falscheingabe eingegeben werden muss (nur wenn gd verfügbahr ist) und da ich absolut und hochgradig paranoid bin hab ich mir noch was neues einfallen lassen.

    Ich bin ja kein hacker aber ich geh einmal davon aus, das die meisten Bruteforce atacken darauf beruhen, mittels script die einloggseite mit abfragen zu benutzername und passwort zu bombardieren, bis ein treffer gelandet wird.

    Dazu muss der angreifer die richtigen Request variablen kennen womit er die beiden Daten übermittelt. Das herauszufinden ist kein problem. Man brauch dafür ja nur die Formulare sich anzuschauen.

    Mein Ansatz dazu ist, die variablennamen dynamisch zu verändern, so das diese sich zufällig ändern und jeder bruteforce angriff ins leere geht.
    Dafür speicher ich Serverseitig einen wert sys_username und sys_userpw in einer Datenbank und ändere ihn zufällig.
    Wird das benutzerformular angefordert, werden zuerst diese beiden werte ausgelesen und als namen für die Eingabefelder angegeben.

    So nu kommt aber der hacken an der sache. Wenn sich die Variablen serverweitig ändern und ein benutzer sein Formular jedoch bereits erhalten hat, geht sein einloggversuch auch ins leere und er muss sich erneut anmelden. Ich hab das ärgerniss minimiert, ich dem ich maximal alle paar minuten die variablen ändern lass, aber dennoch ist diese Lösung extrem unbefriedigend.

    Aber vom Grundsatz halte ich dies für einen guten Ansatz Bruteforce attacken extrem zu erschweren. Frage ist ob die oben genannten abwehrmaßnahmen nicht ausreichend sind und ich lieber meine paranoia herunterfahren sollte anstatt weiter darüber nachzugrübeln.

    Oder hat jemand eventuell doch ne idee wie man das lösen könnte ???
    Ich geb so ungern ideen auf. Insofern wäre es auch hilfreich, wenn jemand mir den schwachsinn dieser Idee beweist


    So sieht es zur zeit aus... glaub man sieht den ansatzt auch ohne nun im detail alle funktionen und Klassen hier mit zu posten
    PHP-Code:
    ....
    ....
    ....
    // dieser Ausschnitt steht innerhalb der Benutzerverwaltung
    srand((double)microtime()*1000000);
     
    $lastchange=$userdb->getconfig("sys_userlastchange");
     
    $random=rand(0,20);
     if ((
    $random==10) and ($lastchange<gmmktime()-2400))
     {
              
    // createrandwort ist eine funktion die einfach ein zufallswort erstellt
              // Writeconfig schreib einen wert in eine Konfigurationsdatenbank und
              // ist letztendlich nur eine mysql abfrage die prüft ob wert vorhanden ist
              // und entweder neu anlegt oder updatet
        
    $userdb->writeconfig("sys_username",createrandwort(),'int');  //neuer name fuer benutzername
        
    $userdb->writeconfig("sys_userpw",createrandwort(),'int');   // neues passwotfeld
        
    $userdb->writeconfig("sys_userlastchange",gmmktime(),'int');  // letzte änderung
               // funktion die konfigurationswerte für getconfig in Array einliest 
        
    $userdb->configdata();
     }
     
    $user_dlg 'username';  //standardbezeichner
     
    $pw_dlg 'userpw';       //standardbezeichner

      
    if ($userdb->getconfig("sys_username")<>''$user_dlg=$userdb->getconfig("sys_username");
      if (
    $userdb->getconfig("sys_userpw")<>''$pw_dlg=$userdb->getconfig("sys_userpw");

    .....
    .....
    ....
    // letztendlich nach den üblichen abläufen wird das formular z.b. folgendmaßen ausgegeben
    $ret.= '<form method="post" name="login" class="formbox" method="post" action="">
             <input type="hidden" name="action" value="login">
             Username <input class="formdlg" size="10" type="text" name="'
    .$user_dlg.'">
             Password <input class="formdlg" size="10" type="password" name="'
    .$pw_dlg.'">
             <input type="submit" class="formbtn" value="Login">
             </form>'
    ;

    return 
    $ret// 
    ...
    ... 

  • #2
    aber dennoch ist diese Lösung extrem unbefriedigend.
    das ist sie so oder so. denn was hindert mich als bf-Programm, die Feldnamen aus deinem Code auszulesen?

    Kommentar


    • #3
      Original geschrieben von TobiaZ
      das ist sie so oder so. denn was hindert mich als bf-Programm, die Feldnamen aus deinem Code auszulesen?
      Hmm .. Nix ! Es sei denn meine Vermutung, das der Großteil der Bruteforce-Angriffe nicht von Codern sondern von Bruteforce-tool Benutzern unternommen wird stimmt und
      zweitens das letzendlich überhaupt nix unumgänglich ist und es im Grunde immer nur darum geht die messlatte für den Angreifer immer höher zu hängen.

      wobei es schon stimmt. Der Aufwand die eingabeformulare zu maskieren steht in keinem Verhältnis zu dem Aufwand als bf-Programm den Code auszulesen.

      thx ... denn lass ich die idee mal wieder im Papierkorb verschwinden.

      Kommentar


      • #4
        Hmm...wie wäre es anstatt einer festen Laufzeit einfach jedes Formular nur einmal zu verarbeiten, d.h. also du gibts den form einen namen und speicherst ab, ob dieser abgeschickt wurde, wenn ja, dann ist die Anfrage ungültig.
        Das würde die Sache für alle Programme zumindest dahingehend erschweren, als dass nach jedem Fehlversuch die Seite neu geladen werden müsste...

        Aber IP-Sperre und Zahlencode sollten doch wohl mehr als ausreichend sein, oder speicherst du so hoch sensible Daten, dass sich da einer solch eine Mühe machen würde?

        Kommentar


        • #5
          THX tommie für den Vorschlag aber ich glaub nun wirklich, das es vom grundsatz doch keine so tolle Idee war. Letztendlich wird der code wohl nur anfälliger und zum Verdruss für den besucher wenn da mal ein browser einfach geschlossen wird ohne den login auszuführen usw.

          Kommentar


          • #6
            *verschieb* BS

            Kommentar


            • #7
              Es reicht vollkommen doch vollkommen aus wie bereits gesagt die Felder mit dem Authentifizierungscode anzuzeigen und den Wert mit der Eingabe zu vergleichen.

              Schließlich sind wir noch nicht so weit das Tools Bilder analysieren können.

              Selbst wenn ich wüsste wie der Code erzeugt wird. Müsste ich mir dieses Bild anschauen.
              [color=blue]MfG Payne_of_Death[/color]

              [color=red]Manual(s):[/color] <-| PHP | MySQL | SELFHTML |->
              [color=red]Merke:[/color]
              [color=blue]Du brauchst das Rad nicht neu erfinden ! [/color]<-ForumSuche rettet Leben-> || <-Schau in den Codeschnippsels->

              Murphy`s Importanst LAWS
              Jede Lösung bringt nur neue Probleme
              Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht.
              In jedem kleinen Problem steckt ein großes, das gern raus moechte.

              Kommentar


              • #8
                @tezet
                also wenn Du die Feldnamen unbedingt dynamisch generieren möchtest, dann speichere sie doch einfach in einer Session. Dann ists es halt für jeden Seitenaufruf eindeutig.
                Aber ich denke Deine bisherigen Mittel sollten doch reichen für die 0815 Scriptkiddies.

                @Payne_of_Death
                OCR exisitert ja schon länger und ist soweit ich weiß auch schon recht ausgereift. Also werden wohl auch Tools existieren die fähig sind solche Authentifizierungscodes auszulesen. Nungut, wenn die Codes nicht per Standardsoftware erstellt werden wirds natürlich unwahrscheinlich.
                [Test] MySQL cli Emulator

                Kommentar


                • #9
                  @niels
                  ich habs mal getestet mit einer aktuellen ocr. wenn der hintergrund unruhig (muster) und der kontrast zwischen text & hintergrund relativ gering ist, hat eine herkömmliche ocr keine chance. spätestens wenn man dann noch mit unterschiedlichen fonts arbeitet (pro buchstabe), dürfte auch die beste ocr-software um gnade winseln.
                  Kissolino.com

                  Kommentar


                  • #10
                    @Wurzel
                    ok, also mit verschiedenen Fonts, da hörts dann wohl auf.
                    Aber ansonsten habe ich mal Submit Tools gesehen die die automatische Anmeldung bei Suchmaschinen usw. beherrschen, halt mit den Codes.
                    [Test] MySQL cli Emulator

                    Kommentar

                    Lädt...
                    X