webForumDet fria alternativet

Maximalt antal felloggningar...

6 svar · 214 visningar · startad av webmaster

webmasterMedlem sedan aug. 2000190 inlägg
#1

Hej!

Har laddat hem ett kodknäckarprogram för "internet-lösenord", samt för CGI och php lösenord.

Vad gäller php och cgi fungerar programmet enligt följande, och fungerar utmärkt på lösenordskydd med ett fält för användarnamn och ett fält för lösenord:

Man laddar programmet med två filer. En med sannolika användarnamn och en med sannolika lösenord. Därefter går programmet igeonom alla möjliga kombinationer av dessa två filer, och försöker då logga in med de olika kombinationerna av lösenord och användarnamn.

Programmet loggar sedan den html.kod som finns på den sida man kommit till efter inloggningen.
Om lösenordet eller användarnamnet är fel när man loggar in någonstan, så visas ofta en html-sida som informerar om detta. Programmet loggar denna html-kod i sin egen loggfil.

Om programmet hittar en kombination som består av ett korrekt lösenord och användarnamn, så loggas även html-koden för den sida man då kommer till.

Man kan därefter gå in i loggfilen och se om det finns någon "html-kod" som skiljer sig från de övriga loggningarna, samt se vilken kombination av användarnamn och lösenord programmet då använde.

Med lite justeringar av programmets inställningar kan man få programmet att inte logga vissa "html-sidor". Man kan säga åt programmet att endast logga de html-sidor som inte innehåller orden (Exempelvis) "Ditt användarnamn är tyvärr fel...".

Dett gör att man kan köra programmet på ett html sida med lösenordstypen användarnamn/lösenord, och den kan då arbeta med en hastiget av 10 inloggningar i sekunden, och man kan då ganska snabbt få reda på vilka alternativ som är gångbara, såvida alternativet finns med i de kombinationsmöjlighjeter som man lagt in i programmet textfiler.

Har inte tidigare arbetat med program som detta, Har provat det väldigt mycket på mina egna cgi-script, och blev förvånad över hur enkelt och effektivt det var att logga in med detta program.

(10 inloggningar per sekund * 60 sekunder * 60 minuter =36000 inloggningsförsök på en timme) :(

Finns det något sätt på vilket man kan begränsa antalet inlogningsförsök på ett cgi-inloggningsscript med ett användarfält och ett användarnamn?

Exempelvis, om samma ip-försöker att logga in för 20:e gången på mindre en en minut, så skall exempelvis personen då komma till en tredje html-sida med exempelvis texten: "Tyvärr för många inlolggningsförsök".

Vores jättebussigt om någon ville bidra med en kodsnutt för detta, om det nu går att göra så.

[Redigerat av webmaster den 24 jul 2001]

JojoxxMedlem sedan juni 20004 308 inlägg
#2

För att göra det enkelt för sig kan du göra så här;

@time=localtime(time);
open(INDATA,$logfil);@file=<INDATA>;close(INDATA);
open(OUTDATA,">$logfil");
foreach (@file){
	chomp;
	@fields=split(/,/);
	next if($fields[1] ne $time[2]);
	if($ENV{'REMOTE_ADDR'} eq $fields[0]){
		$fields[2]++; $attempts=$fields[2];
	}
	print OUTDATA join(',',@fields)."\n";
}
print OUTDATA "$ENV{'REMOTE_ADDR'},$time[2],1\n" if(!$attempts);
close(OUTDATA);

Där $logfil är sökvägen till den fel där du sparar ip,tid och antal försök. Detta kollar alltså hur många försök som ip't har gjort / påbörjad timme. Resultatet är sparat i variabeln $attempts. Sedan kan du använda den för att avgöra hur många försök man ska få på sig, och vad som händer sedan.

Sedan bör man som användare se till att ens lösenord inte är ord som går att hitta i en ordlista, delar av telefonnummer, personnummer etc. eller i baklänges ordning, födelseår på ens barn, tangentbordskombinationer (qwerty) utan slumpvis bokstäver och siffror, gärna 6 tecken eller mer.

------------------
/ J

[Redigerat av Jojoxx den 24 jul 2001]

webmasterMedlem sedan aug. 2000190 inlägg
#3

Hej!

Använde detta script då jag provade "kod-knäckar-programmet".
Scriptet kollar om lösenord och användarnamn finns i en textfil. Om inte visas inloggningsrutan igen, annars kommer man till den improviserade medlemssidan.

Skall försöka mig på att implementera din kod och se hur det går.

Håller med dig om att man inte bör välja ord, födelseår, idrottslag, stadsnamn eller liknande som lösenord. Dock är det tyvärr så att många användare väljer just sådana lätt-ihåg-komliga lösenord. Det är det som dessa kod-knäckar program uttnyttjar. :l

Men oavsett vad man väljer för lösenord, så vill jag att de script jag gör (Kanske inte så märkvärdigt komplicerade) skall hålla hösta möjliga säkerhet. Därför tänkte jag att det kan ju vara bra om det går att lägga in en rutin som kontrollerar antalet inloggninsförsök från aktuell ip-adess de senaste minuterna, och hindrar program från att göra massinloggningar.

Tack för hjälpen. Ska se om jag kan få ihop det :)

//Webmaster

#!/usr/bin/perl

#############################################
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $buffer);

foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$INFO{$name} = $value;
}

#########################
open (LOGG,"Loggin.txt");
while ($rad=<LOGG> ){

$rad=~/(.*)<==>(.*)/;

if($INFO{'userid'} eq $1  && $INFO{'password'} eq $2){
$kontroll="OK";
}
}

close (LOGG);

##### Om man kommer in ######
if($kontroll eq "OK"){

print <<EOT;
<p align="center"> </p><p align="center"><br>
<font color="#FF0000"><big><big>Välkommen till ditt medlemskonto!</big></big></font></p><div align="center"><center>
<table border="0" width="450" cellpadding="4" cellspacing="4"><tr>
    <td width="100%">Här kan du göra ändringar av dina uppgifter. Du kan här byta
    lösenord och användarnamn, eller justera e-postadress så att medlemsbreven kommer till
    din nya e-postadress. <p>Blablabla blablabla bla blabla blablabla bla blabla, blablabla
    bla blabla blablabla bla blabla....</td>
  </tr>
</table>
</center></div>
EOT

}

##### Om man INTE kommer in ######
if($kontroll ne "OK"){

print <<EOT;
<p align="center"><font color="#FF0000"><big>DU ANVÄNDER ETT FELAKTIGT ANVÄNDARNAMN
ELLER LÖSENORD.<br>
VAR GOD OCH FÖRSÖK IGEN!</big></font></p>

<form action="http://localhost/cgi-bin/test.pl" method="post">
  <div align="center"><center><table border="0" cellspacing="4" cellpadding="4">
    <tr>
      <td align="right"><strong>Användarnamn:</strong></td>
      <td><input type="text" name="userid" size="20"></td>
    </tr>
    <tr>
      <td align="right"><strong>Lösenord:</strong></td>
      <td><input type="password" name="password" size="20"></td>
    </tr>
    <tr>
      <td></td>
      <td><input type="submit" value="Logga in" name="B1"><input type="reset" value="Rensa"
      name="B2"></td>
    </tr>
  </table>
  </center></div>
</form>
EOT

}

[Redigerat av webmaster den 24 jul 2001]

HansenMedlem sedan aug. 2000374 inlägg
#4

Här kommer ett förslag till,
http://freebox.com/c.h/perl/check.pl.txt

#!/usr/bin/perl -w

use strict;

my $ip    = '192.168.0.6';
my $file  = 'check.db';
my $time  = time() - 60;
my $tries = 20;

print check() ? "Allow" : "Deny";

sub check {
    my $data = sort_data( split_data( open_data($file) ), 1 );
    my ( $match, $save, $status );

    foreach my $rec (@$data) {
        last unless $rec->[1] > $time;
        ( $ip eq $rec->[0] ) ? $match = $rec : push @$save, $rec;
    }

    if ( defined $match ) {

        if ( $match->[2] >= $tries ) {
            $status = 0;
        }

        $match->[2]++;
        push @$save, $match;
    }
    else {
        push @$save, [ $ip, time(), 1 ];
    }

    save_data( join_data($save), $file );
    return ( defined $status ) ? $status : 1;
}

sub open_data {
    my ($file) = @_;
    open( DATA, "$file" ) or die "Kan inte öppna filen: $file Anledning: $!";
    my @data = <DATA>;
    close(DATA) or die "Kan inte stänga filen: $file Anledning: $!";
    chomp(@data);
    return \@data;
}

sub save_data {
    my ( $data, $file ) = @_;
    open( DATA, ">$file" ) or die "Kan inte öppna filen: $file Anledning: $!";
    print DATA join "\n", @$data;
    close(DATA) or die "Kan inte stänga filen: $file Anledning: $!";
}

sub sort_data {
    my ( $data, $field ) = @_;
    return [ sort { $b->[$field] <=> $a->[$field] } @$data ];
}

sub split_data {
    my ($data) = @_;
    return [ map { [ split /\&#0124;/ ] } @$data ];
}

sub join_data {
    my ($data) = @_;
    return [ map { join "\&#0124;", @$_ } @$data ];
}

Och datafilen: http://freebox.com/c.h/perl/check.db.txt

------------------
Hansen
c.h@ngmedia.com

webmasterMedlem sedan aug. 2000190 inlägg
#5

Tack för hjälpen! Skall kolla detta. :)

Även om jag inte får just er kod att fungera så förstår jag lite av tänket, så att jag om inte annat kan försöka att knåpa ihop något spännande :)

[Redigerat av webmaster den 24 jul 2001]

HansenMedlem sedan aug. 2000374 inlägg
#6

Hej,

Koden borde fungera, har du ändrat:

my $ip    = '192.168.0.6';

till:

my $ip    = $ENV{'REMOTE_ADDR'};

Sen kan du ex. kalla subrutinen check:

if ( check() ) {
    # print "Allow - Loginforumär";
}
else {
    # print "Deny - Ajabaja";
}

------------------
Hansen
c.h@ngmedia.com

webmasterMedlem sedan aug. 2000190 inlägg
#7

Hej!

Har kollat och försökt en del, men så fort jag får tillräckligt med tid så skall jag gå igenom koden lite mer ingående och försöka att få det att fungera tillsammans med den kod som jag gjort tidigare.

Men ni kan vara säkra, jag kommer inte att ge upp förrän det fungerar :)

[Redigerat av webmaster den 26 jul 2001]

140 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)