Avatar billede deadkennedy Nybegynder
27. juli 2006 - 04:54 Der er 11 kommentarer og
1 løsning

Sikkerhedscheck af php system

Goddag.

Jeg har netop downloadet et phpsystem, der ved indtastning af angivet kodeord- giver mulighed for ændring af samtlige filer på det pågældende webhotel.
Derfor ønsker jeg nu et meget nøje sikkerhedscheck, med resultat af enten afslag, eller anbefaling af benyttelse.
Jeg ønsker ikke at foretage ændringer, mit formål er derimod at informeres om sikkerhedsmæssige ulemper.

I henhold til disse krav, har jeg afsat 200 point.
Jeg takker på forhånd mange gange for ethvert indlæg, da jeg værdsætter dette forums professionelle indgangsvinkel til besvarelser.

Der er tale om følgende kode:

<?php
function template(){
?>
<head><style type="text/css">
TD {
FONT-SIZE: 12px; COLOR: #000000; FONT-FAMILY: Verdana
}
A:link        {text-decoration: none; color: #2E26CD;}
A:visited    {text-decoration: none; color: #2E26CD;}
A:hover      {text-decoration: none; color: #990000; font-style: normal; background-color: transparent; text-decoration: underline position: relative; top: 1.5px; left: 1.5px;}
</style>
</head>
<?php
}
extract($HTTP_GET_VARS);
extract($HTTP_POST_VARS);
$password = "KODEORD";  //CHANGE THE LOGIN PASSWORD
//Copyright Cgixp Team
?>
<?php
$action=$HTTP_GET_VARS['action'];
if ($action == "" ){
?><center><table align=middle><td align=left width=20%>
<tr><td height="27" colspan="2"><FONT SIZE="4" COLOR="#000000">:: Power Editor ::</FONT></td><tr><td>Password Required (Default is: changeme)</td></tr><tr><form method=post action="?action=login"><td>Password:</td><td><input type=password name=pass>&nbsp;<input type=submit value=Submit></td></tr></form></table></center>
<?php
}
if ($action=="download"){
$filedata = stat("$dir/$p");
$filesize = $filedata[7];
//$ft = getfiletype("$filename");
//header("Content-Type: $ft[1]");
header("Content-Length: $filesize");
header("Content-Disposition: attachment; filename=$p");
readfile("$dir/$p");
exit;
}
if ($action=="login"){
if ($pass==$password){
header("Location:?action=templates");
}else{
echo "<FONT SIZE=2 COLOR=red>Invalid Password</FONT>";
}
}
echo "<html><head>";
?>
<?php
if ($action=="view"){
template();
echo"<center><FONT SIZE=2 face=arial>Viewing $p</FONT><table width=94% border=1 bordercolor=#AFC6DB cellspacing=0><tr><td>";
$po=show_source("$dir/$p");
echo "</td></tr></table><table><form method=post action=\"?action=templates&dir=$dir\"><tr><td align=middle><input type=submit value=Back></form></td></tr></table></center>";
}
if ($action=="see"){
template();
$image_info = getimagesize("$dir/$p");
$image_stat = stat("$dir/$p");
echo"<center><FONT SIZE=2 face=arial>Viewing $p</FONT><table width=$image_info[0] height=$image_info[1] border=1 bordercolor=#AFC6DB cellspacing=0 valign=middle bgcolor=#fffff><tr><td align=middle valign=middle>";
$po="<img src=$dir/$p>";
echo "$po</td></tr></table><table width=80% align=middle><td align=middle>$image_info[3]</td></tr></table><table><form method=post action=\"?action=templates&dir=$dir\"><tr><td align=middle><input type=submit value=Back></form></td></tr></table></center>";
}
if ($action=="changeattrib") {
template();
echo"<form method=post action=?action=permission&te=$te&path=$dir><FONT SIZE=2 COLOR=#00000>Change $te Permission</FONT><BR><input type=hidden name=u value=$te><input type=radio name=no value=555>Chmod 555<BR><input type=radio name=no value=666>Chmod 666<BR><input type=radio name=no value=777>Chmod 777<BR><input type=submit vlaue=Change></form>";
}
if ($action=="permission") {
template();
$v=chmod("$path/$te",$no);
echo "$te has been set to CHMOD $v<BR><A HREF=?action=templates&dir=$path>Back</A>";
}
if ($action=="tempedit") {
template();
$te=$HTTP_GET_VARS['te'];
$dir=$HTTP_GET_VARS['dir'];
$filename = "$dir/$te";
$fd = fopen ($filename, "r");
$stuff = fread ($fd, filesize ($filename));
fclose ($fd);
?>
<td height="399" bgcolor="" width="81%" valign="top">
<center>
<form method="post" action="?action=temp2&dir=<?php echo $dir ?>&te=<?php echo $te ?>">
<table width="100%" border="1" bgcolor="D6D5D4" bordercolor="#778899" cellpadding="0" cellspacing="0">
<tr>
<td><font size="1">File editor editing <?php echo "<b>$dir/$te</b>"; ?></font></td>
</tr>
<tr>
<td width="86%" align=middle>
<textarea name="cont" cols="80" rows="25"><?php echo $stuff ?></textarea>
</td>
</tr>
<tr>
<td width="86%" align=middle>&nbsp;
<input type="submit" name="Submit" value="Save">&nbsp;<input type="button" name="Cancel" value="Cancel" onclick="java script: history.back(1)">
</td>
</tr>
<tr>
</tr>
</table></center>
</form>
<?php
}
if ($action=="temp2") {
    template();
$cont=stripslashes($cont);
$fil = "$dir/$te";
$fp = fopen($fil, "w");
fputs($fp, $cont);
fclose($fp);
?>
<td height="399" bgcolor="<?php echo $color1 ?>" width="81%" valign="top">
<table width="100%" border="0" cellpadding="5" cellspacing="0">
<tr>
<td align=middle><font size="2">File saved<BR><?php echo "<a href=?action=templates&dir=$dir>Go Back</a>"; ?></font></td>
</tr>
</table>
<?php
}
if ($action=="templates") {
    template();
?>
<td height="399" bgcolor="<?php echo $color1 ?>" width="81%" valign="top">
<table width="100%" border="0" cellpadding="5" cellspacing="0">
<tr>
<td><font size="1">Files:</font>
</td>
</tr>
<tr valign="top">
</td>
</tr>
<tr>
<td width="86%">
<?php
if ($dir==""){
$dir=".";
}
echo "<center><TABLE WIDTH=\"85%\" BORDER=\"1\" CELLSPACING=\"1\" CELLPADDING=\"0\" align=middle bordercolor=#AFC6DB><TR><td></td><TD COLSPAN=\"2\" BGCOLOR=\"#ffffff\" width=55%><FONT COLOR=\"#000000\" SIZE=\"-1\" FACE=\"Verdana\">Filename</td><td width=5% align=center>Edit</td><td width=10% align=middle>Filesize</td><td width=10% align=middle>Permission</td><td width=10% align=middle>Download</td><td align=middle>Delete</td></FONT></TR>";

$handle = @opendir($dir);
while (false !== ($file = readdir($handle))) {
    $attrib=fileperms("$dir/$file");
    $filesize=filesize("$dir/$file");
    $file_size_now = round($filesize / 1024 * 100) / 100 . "Kb";
    $n= explode(".",$file);
    if ($n[1] == ""){
    $img="img/dir.gif";
    }elseif($n[1]=="php"){
    $img="img/php.jpg";
    }elseif($n[1]=="zip"){
    $img="img/zip.gif";
    }elseif($n[1]=="gif"){
    $img="img/gif.gif";
    }elseif($n[1]=="html"){
    $img="img/html.gif";
    }elseif($n[1]=="ini"){
    $img="img/ini.gif";
    }elseif($n[1]=="jpg"){
    $img="img/jpg.gif";
    }elseif($n[1]=="txt"){
    $img="img/txt.gif";
    }elseif($n[1]=="exe"){
    $img="img/exe.gif";
    }else{
    $img="img/no.gif";
    }
    if ($n[1] == ""){
    $link="?action=templates&dir=$dir/$file";
    $link1="-";
    }elseif ($n[1] == "gif"){
    $link="?action=see&p=$file&dir=$dir";
    $link1="-";
    }
    elseif ($n[1] == "jpg"){
    $link="?action=see&p=$file&dir=$dir";
    $link1="-";
    }
    elseif ($n[1] == "zip"){
    $link="?action=download&p=$file&dir=$dir";
    $link1="-";
    }
    elseif ($n[1] == "exe"){
    $link="?action=download&p=$file&dir=$dir";
    $link1="-";
    }
    else{
    $link="?action=view&p=$file&dir=$dir";
    $link1="<a href='?action=tempedit&te=$file&dir=$dir'>Edit</a>";
    }
    if($dir!="."){
    $uplink="<tr><td></td><td align=middle><a href=?action=templates><img src=img/up.gif border=0>Back</a></td></tr></table></center>";
    }else{
    $uplink="</table>";
    }
if ($file != "." && $file != ".." &&  $file != "editor.php"  ) {
echo "<TR><TD align=middle><IMG SRC=\"$img\"  BORDER=0 ></td><TD COLSPAN=\"2\" BGCOLOR=\"#ffffff\" width=30%>&nbsp;<FONT COLOR=\"#000000\" SIZE=\"-1\" FACE=\"Verdana\"><a href=\"$link\">$file</a></td><td width=10% align=middle>$link1</td><td width=10% align=middle>$file_size_now</td><td width=10% align=middle><a href='?action=changeattrib&te=$file&dir=$dir'>$attrib</a></td><td align=middle><a href='?action=download&p=$file&dir=$dir'>Download</a></td><td align=middle><a href=\"?action=delete&te=$file&dir=$dir\" alt=Delete><img src=\"img/del.gif\" border=0></img></a></td></FONT></TR>";
    }
}
echo "</table><table><BR>$uplink";
closedir($handle);
?>
<?php
}
if ($action=="delete") {
    template();
$fd = unlink("$dir/$te");
//fclose ($fd);
echo "File has been deleted";
?>
</td>
</tr>
</table>
</form>
<?php
}
echo "<BR><CENTER><FONT SIZE=2 face=arial>Powered By <A HREF=http://www.cgixp.tk target=_new>Power Editor</A></font></CENTER>";
?>

På forhånd mange tak, håber på besvarelser.
Avatar billede Slettet bruger
28. juli 2006 - 01:45 #1
Jeg har ikke gennemset hele koden, men mit umiddelbare indtryk er, at jeg ville ikke røre den med en ildtang. Den fik i alt fald ikke lov til at køre på min server.

Et par af de kritiske ting, jeg fik øje på ved et hurtigt kig nedover koden:

De to linier med
  extract($HTTP_GET_VARS);
  extract($HTTP_POST_VARS);
tyder både på meget dårlig hensyn til sikkerhed og ganske forældet kode.

Det HTML-lignende kode, den udspyer er ikke tilnærmelsesvist korrekt.

Koden er rodet og svær at gennemskue.

Den sender passwordet med i adressen (godt nok i forvrænget form), mens man er logget ind. Dette er en sikkerhedsrisiko.
Avatar billede mclemens Nybegynder
28. juli 2006 - 02:45 #2
Sandbox har ret, det eneste password beskytter er forresten

if ($action=="login"){
if ($pass==$password){
header("Location:?action=templates");
}else{
echo "<FONT SIZE=2 COLOR=red>Invalid Password</FONT>";
}
}

... og øhm det er dybt latterligt - alt er rent faktisk piv-åben
... hold dig væk fra denne kodning som sandbox siger ...
(den er mere hullet end den vi rettede forleden dag)
Avatar billede mclemens Nybegynder
28. juli 2006 - 02:50 #3
Vi tager lige et eksempel:
du har f.eks. beskyttelsen på:
http://www.etellerandetdomæne.dk/filnavn.php

... så laver man lige denne her:
http://www.etellerandetdomæne.dk/filnavn.php?action=view&dir=./&p=filnavn.php

... voila vi har alt herunder dit kodeord ... ikke
at dit kodeord overhovedet er noget værd ...
Avatar billede deadkennedy Nybegynder
28. juli 2006 - 03:14 #4
Mange tak til jer begge to!

Udmærkede besvarelser, der redder mig fra den åbenlyse fare i selv beskriver.
Avatar billede mclemens Nybegynder
28. juli 2006 - 03:15 #5
ok, her er lige et svar fra mig af ... der er meget mere...

Nu analyserer jeg lige hele kodningen så
du kan se hvorfor at du ikke skal bruge den:

1. gå ind på http://www.ditdomæne.dk/filnavnet.php?action=download&dir=.&p=index.php
... så modtager du index.php's indhold, lidt uhyggeligt ikke - uden kodeord eller noget? dir og filnavn kan selvfølgelig varieres...
Avatar billede Slettet bruger
28. juli 2006 - 03:16 #6
For at kontrollere om den rodede kodestil skyldtes eksperten og ikke dårlige programmører, havde jeg faktisk hentet den originale kode ved at følge linket i din kode, og noget af tiden var det den, jeg kiggede på. Det er tilsyneladende en nyere udgave, for der laver de faktisk check af password hele tiden. Men på den måde, jeg nævnte i sidste afsnit af første indlæg, som overhovedet ikke er en fornuftig måde at gøre det på.

Og den rodede kodestil er helt programmørernes fejl.
Avatar billede mclemens Nybegynder
28. juli 2006 - 03:17 #7
Ok, du har droppet koden ... så er det godt nok :o)
... der er også åbent for fri edit af en hvilken som helst fil,
fri delete af en hvilken som helst fil, fri chmod af en hvilken
som helst fil uden nogen validering overhovedet!
... kort sagt en hver brugers mareridt ...
Avatar billede mclemens Nybegynder
28. juli 2006 - 03:18 #8
update, ok har ikke set den nye kode ...
Avatar billede Slettet bruger
28. juli 2006 - 05:17 #9
mclemens: Det var vist meningen, at du også skulle have haft point. Og 200 er rigeligt til mig, så http://www.eksperten.dk/spm/722778
Avatar billede mclemens Nybegynder
28. juli 2006 - 09:02 #10
Ok, sandbox ...

- deadkennedy, m.h.t. koden de på siden nu kan jeg ikke se deciderede huller ... joh, som sandbox nævner så problemet med overførslen af kodeordet og dårlig html markup men ellers ser det ud til at den er blevet patchet (har ledt efter fejl - men kan ikke lige finde nogen)
Avatar billede mclemens Nybegynder
28. juli 2006 - 19:32 #11
Tak for point :o)
Avatar billede deadkennedy Nybegynder
28. juli 2006 - 21:32 #12
Mange tak.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester