Autor Zpráva
virgo86
Profil
Dne 9.9.09 moje webové stránky napadl hacker. Přepsal soubor index.php kde mi nechal vzkaz abych si stránky opravil. Mám jednoduchy zdrojový kód, na strankách nepouživám ověření totožnosti takže ani session. Je to moje chyba jako programátora nebo chyba firmy která mi poskytuje webhosting a domenu. Jak se můžu bránit? díky Petr
Joker
Profil
virgo86:
Jak se můžu bránit?
Opravit chyby, které umožnily hacknutí toho webu. Nejlépe i chyby, které by potenciálně mohly umožnit další hacknutí.

Toť asi vše, co se bez bližších detailů dá říct.
Žádný univerzální kód, něco jako zarid_aby_me_neslo_hacknout(); neexistuje.
virgo86
Profil
dobře tedy můj kód z jednoho z mých webů. (mimochodem hacker napadl 80% mých stranek, mám je totiž na jednom serveru prostě domeny 3řadu). Kde je chyba...jinak nechci aby někdo vynakladal čas na moje chyby ale nevím čemu se vyvarovat. Vůbec nechápu jak se mohl někdo dostat do mého kódu.
soubor index.php:
<?php
require_once("fce.php");
titulek('VIRGOnet');
konec();
?>


soubor fce.php

<?php
function titulek($titulek)
{
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>  
  <head>  
    <meta http-equiv="content-type" content="text/html; charset=windows-1250">  
    <meta name="generator" content="PSPad editor, www.pspad.com"&gt;  
    <link rel="stylesheet"  type="text/css"        href="index.css">  
    <title>
      <?php echo $titulek; ?> 
    </title>  
  </head>
  <table border="2" align="center" bgcolor=#fbfbfb height="200px" width="800" class="nadpis"> 
    <img src="firnadpis2.png"> 
    <tr><td>
<?php
 web();
         ?>
      </td> 
      <td align="center"> 
<?php
 epa();
         ?> 
    </td>
    </tr>
    <tr><td>
<?php
osob();
        ?>
        </td><td>
<?php
benny();
        ?>
        </td>
        </tr>
<?php
}
function web()
{
    ?>
    <img src="klavesnice2.jpg" align="left"><h1>Tvorba webových stránek </h1>- Tvorba podle Vaších představ<br />- Pomocí PHP, HTML, FLASH, MYSQL<br />- Za dostupné ceny<br />
    <p>
      <div id="tlacitko">
        <a href="http://firma.virgonet.cz">Pokračujte zde...</a>
      </div>
<?php
}
function epa()
{
      ?>
      <img src="stud.jpg" align="right"><h1>SPŠ Elektrotechniky & Informatiky Ostrava</h1>- Stránky třídy EP4A<br />- Protokoly, maturitní otázky, chat<br />- Kompletní seznam žáku<br />
      <div id="tlacitko">
        <a href="http://ep4a.virgonet.cz">Pokračujte zde...</a>
      </div>
<?php
}
function osob()
{
/*<form action="http:www.firma.virgonet.cz">
<input type="submit" value="Pokračuj zde">
</form>*/
echo '<img src="oper.png" align="left">';
      ?><h1>Virgo web´s</h1>- Rodinné fotoalbum <br />- češtiny, Programy<br />- Vše o Operačních Systémech<br />
      <p>
        <div id="tlacitko">
          <a href="http://virgo.virgonet.cz">Pokračujte zde...</a>
        </div>
<?php
}
function benny()
{
        ?>
        <img src="ben.jpg" align="right"><h1>Alan Pamada alias BENNY</h1>- Boloňský Psík<br />- Fotografie<br />- Diskuze<br />
        <div id="tlacitko">
          <a href="http://benny.virgonet.cz">Pokračujte zde...</a>
        </div>
<?php
}
function menu()
{
tlacitko('nab','Nabízíme');
tlacitko('ref','Reference');
tlacitko('cenik','Ceník');
tlacitko('neco','Něco o Nás');
tlacitko('kontakt','Kontakt');
echo '</strong>';
echo '</td><td class="editor" rowspan="2" valign="top">';
}
function tlacitko($adresa,$nadpis)
{
echo '<a href="';
echo $adresa;
echo '.php">';
echo '<font face="Wingdings" size="4">č</font><strong>';
echo $nadpis;
        ?></strong></a><br />
<?php
}
function konec()
{
        ?>
  </table>
  <div id="konec">
    <img src="desingby.png">
  </div>
  </body>
</html>
<?php
}
?>
avaster
Profil
nenahravas na hosting subory pomocou Total Commandera?
pokial ano tak odporucam zmenit heslo na pristup, a skusit iny program na nahravanie cez FTP..

..pokial viem tak ziskat udajena FTP z TC je jednoduche pomocou maleho virusu v PC..
virgo86
Profil
nenahravas na hosting subory pomocou Total Commandera?
Ne použivám PSpad nebo ruční zadavaní přimo přes prohližeč. Aby mohl hacker změnít mé soubory musí znát moje přistupové údaje nebo to lze nějak obejít? Pomohlo by změnit heslo za nějaké bezpečnější? Nechapu jak ošetřit kód jakým způsobem se dokaže někdo do souboru nabourat pochopim že si ho přečte ale že ho i přepiše:(
Joker
Profil
virgo86:
Pomohlo by změnit heslo za nějaké bezpečnější?
Možná ano.

Umí ten skript nahrávat soubory na web?
Je ve skriptu někde uložené nějaké heslo?
virgo86
Profil
Umí ten skript nahrávat soubory na web?
skript je rozčleněn. mám jeden adresář hlavní který mi otevira po kliknuti další adresaře. v hlavním skriptu nenahravám nic na server ale v jinych ano. Jinak řečeno nahravám sobory jenom textové ale hacker napadl všechny soubrory index.php jak hlavní domenu www tak i poddomeny jako např ep4a.virgonet.cz ale tam taky nic nenahravám.
Je ve skriptu někde uložené nějaké heslo?
Není pouze přístup k databázi Mysql, heslo pro přístup na ftp nikde není pouze cesta kde se má upload uložit soubor.

Ještě jednou se zeptám je to chyba moje někde ve skriptu že se tam hacker dostal (nechci aby někdo hledal chybu to po Vás nechci jen jestly je to možné?). nebo chyba zapezpečení ftp u firmy která mi pronajíma domenu? Ať vím jestly to mám řešit jenom já jako programator těchto stránek nebo to řešit ze serverem.
Joker
Profil
virgo86:
Ještě jednou se zeptám je to chyba moje někde ve skriptu...
Potíž je, že my samozřejmě nevíme, jak se tam ten hacker dostal.

Teoreticky lze web hacknout přes chybu v PHP: Znám-li chybu umožňující na webu spustit mnou napsaný kód, můžu si na web nahrát i svoje vlastní soubory, případně nahrát skript, který tam ty další soubory dostane.

Druhá možnost je nějakým způsobem odchytit nebo zjistit heslo pro FTP. Což jde i nepřímo- jako třeba jeden relativně nedávný případ: Týpek si založil diskusní fórum, kde si u jednotlivých uživatelů ukládal hesla v čitelném tvaru. Následně se pokusil registrovaným uživatelům nabourat e-mailové schránky s heslem z fóra, doufaje, že někteří použili pro fórum stejné heslo jako pro e-mail.
Myslím, že tahle historka je docela poučná z pohledu zabezpečení obecně.
Michal Raška
Profil *
Podívej se na http://php.vrana.cz/. Projdi si ten web a pak zkontroluj svůj kód.
A než to vyřešíš, kontroluj stránku Tvého zákazníka.
vynalezce
Profil
co takhle hodit sem adresu webu,administrace...

edit ted me napada nemas tam nekde zalohy?

edit2:nemas na tech webech administraci? pokud ano chyba bude asi tam
virgo86
Profil
ano už vím kde se asi stala chyba.....pro stránky dobrovolných hasičů pro naší vesnici jsem na stranky vložil upload pro soubor informace.doc který slouží jako aktualizace pro nové zprávy pro dva členy sdh je to pod heslem(kdo zná aspoň minimalně php heslo si najde ve skriptu není to tak duležite tak jsem to vyřešil jen podminkou.) potom muže ten člověk vkladat nové aktuality aniž by znál heslo pro ftp. ALE skusil jsem nahrát přes tento upload soubor index.php a světe div se ono to přepsalo soubor na mém webu:) Takže hacker prostě nahral nějakej svůj soubor u mě si přečet cesty k mým poddomenám a všechny je přepsal buď to on nebo nějaký programek jím vytvořený. Doufám že to bude ta chyba.
A teď jak to mužu ošetřit napadlo mě prostě nepříjmat soubory s jinačí připonou než .doc Stačilo by to?


skript pro administraci:
Vložení hesla:
function heslo()
{
  ?>
  <form action="admin.php" method="post"><strong>Heslo administrátora:</strong>
    <center>
      <input name="heslo" type="password" size="15"  style="background-color: silver">    
      <input type="submit" value="POTVRDIT" style="background-color: silver; width:100; cursor: hand">
<?php 
}
      ?>

admin.php
<?php
require_once('fce.php');
titulek('admin');
menu();
rss();
if ($heslo!="zapis")
{
echo '<h1>Zadáno špatné heslo!!<p>Budete přeměrovaní</p></h1><META HTTP-EQUIV="Refresh" CONTENT="3;URL=navs.php">';
exit;
}

?>
<h1>MENU ADMINISTRATORŮ:</h1>
<h2>Ahoj Tome, Tak tady budeme vkládat data na stránky. Heslo znáš ty a já nikdo
jiný tak ať to tak zůstane.</h2>

<fieldset><legend>Aktuálně</legend>
<form enctype="multipart/form-data" action="odber3.php" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="1000000">
Náhrat informace na server ze souboru informace.doc:<br /> <input name="userfile" type="file">
<input type="submit" value="Odeslat Soubor"></form>
</fieldset>
<?php
konec();
?>


odber3.php
<?php
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
$obsah = $_POST['obsah'];
require_once('fce.php');
titulek('SDH TUPADLY /ADMIN/');
menu();
rss();
if ($userfile==NULL)
{
echo '<h1>Na této stránce nemáte opravnění být budete přesměrovaní</h1><META HTTP-EQUIV="Refresh" CONTENT="5;URL=index.php">';
exit;
}
//nacteni souboru na server
  $userfile = $HTTP_POST_FILES['userfile']['tmp_name'];
$userfile_name = $HTTP_POST_FILES['userfile']['name'];
$userfile_size = $HTTP_POST_FILES['userfile']['size'];
  $userfile_type = $HTTP_POST_FILES['userfile']['type'];
  $userfile_error = $HTTP_POST_FILES['userfile']['error'];
if ($userfile_error > 0)
  {
    echo '<h2INFO PRO ADMINA: ';
    switch ($userfile_error)
    {
      case 1:  echo 'Soubor přesáhl upload_max_filesize</h2>';  break;
      case 2:  echo 'Soubor přesáhl max. velikost</h2>';  break;
      case 3:  echo 'Soubor je nahrán jen částečně</h2>';  break;
      case 4:  echo 'Soubor se nenahrál</h2>';  break;
    }
    exit;
  }
  $upfile = "/server1/webs/virgonet.cz/web/sdh/".$userfile_name;
  if (is_uploaded_file($userfile)) 
  {
     if (!move_uploaded_file($userfile, $upfile))
     {
        echo '<h2>INFO PRO ADMINA: Soubor nelze přemístit do cílového adresáře</h2>';
        exit;
     }
  } 
  else 
  {
    echo '<h1>INFO PRO ADMINA:</h1> <p><h2>Možný útok. </h2>Soubor: '.$userfile_name;
    exit;
  }
  echo '<h1>INFO PRO ADMINA:</h1><p><h2> Soubor byl úspěšně nahrán</h2></p><br /><br />'; 
  $fp = fopen($upfile, 'r');
  $contents = fread ($fp, filesize ($upfile));
  fclose ($fp);
 
  $contents = strip_tags($contents);
  $fp = fopen($upfile, 'w');
  fwrite($fp, $contents);
  fclose($fp);
  echo '<strong>Obsah nahraných informací:</strong><br /><hr />';
 @ $fp = fopen("/server1/webs/virgonet.cz/web/sdh/".$userfile_name,'r');
if (!$fp)
{
echo '<h1>INFO PRO ADMINA:</h1><p><h2> Nejsou žádné nové důležité informace</h2></p>';
konec();
exit;
}
while (!feof($fp))
{
$order=fgets($fp, 999);
echo $order.'<br />';
}
fclose($fp);
  echo '<br /><hr /></strong>';
konec();
?>


Tato stránka je na sdh.virgonet.cz vím že heslo si každý z Vás dokaže najit tak Vás prosím nepište tam nic. heslo si později až bude web celej a na vlastním serveru předělám do MySQL
Tak jdu tedy zkoušet jak to ošetřit pokud máte nějaký šikovný nápad budu jen rád myslím že to pomůže více lidem.

Ještě stejně nechápu proč zrovna můj web.....v celém zemi si hacknul mě. co píše tak ten hacker pochazí z východu mimochodem se mužete kouknout na tebis.virgonet.cz to je pořád hacknute protože to nevyuživám.

Zatím Vám všem moc děkuji. Jo stránky pana Vrány jsem včera pročital i v knize co mám doma ale konkretní věci zatim nenašel jdu dále studovat.
vynalezce
Profil
teď jak to mužu ošetřit napadlo mě prostě nepříjmat soubory s jinačí připonou než .doc Stačilo by to?

1. ano ale chce to osetrit poradne
2. jeste by bylo dobre uploadovat to do jednoho adresare a branit se proti vecem jako je ../
3. chtelo by to pouzit safe mod (pro slozku kazdeho webu) - aby chyba na nem nepostihla zadny dalsi web ani server
4. pokud to jde nejak zablokuj vykonani php pro adresar kam to uploadujes
Calvary
Profil *
Kde máš uložený svoje heslo? V DB? Pokud ano, dá se to hacknout pomocí jednoduchého kódu a když to není ošetřeno, tak se dá přihlásit jako admin.
virgo86
Profil
1. ano ale chce to osetrit poradne
budu se snažit. postupně Vám ukažu jak jsem to udělal.
2. jeste by bylo dobre uploadovat to do jednoho adresare a branit se proti vecem jako je ../
to znamená že nemám používat složky ale vše do hlavního adresáře?
3. chtelo by to pouzit safe mod (pro slozku kazdeho webu) - aby chyba na nem nepostihla zadny dalsi web ani server
Nevím co je safe mod....mužeš hodit nějakou bližší info a jenom pro mě maličkost co je TOKEN
4. pokud to jde nejak zablokuj vykonani php pro adresar kam to uploadujes
To může akorat provozovatel serveru kde mám webhosting nebo já?
Kde máš uložený svoje heslo?
heslo tam neni proste jenom podminka se koukni na začatek skriptu admin.php:) zati mjsem to neřešil teprve se do toho dam ohledně hesla....web neni hotový tak zatim mi to neva. ale podle tebe je lepší heslo ukladat kde? myslíš že když ho uložim do databaze zašifrované že ho lze získat?´

Jdu hledat další informace o safe mod teď jsem dočetl info o CSRF zajimavé ale bude mi dele trvat než to pochopím pravě že nevím co známená ten token
DJ Miky
Profil
Jenom drobnost - to heslo si změň, je tam pořád "zapis" :-).
Calvary
Profil *
Heslo z DB jde získa, pokud uděláš chybu. Např. uložit údaj do souboru *.inc, jako se mi to povedlo jednou na začátku:) Jinak když to zašifruješ do MD5, tak to může získat 1000 lidí a bude jim to k ničemu. Databázi doporučuju 100%, bez ní se to už dneska nedělá..
Meris
Profil *
Ahoj,
neukládej samotné do db jen čistou hash hesla, nějak takto:
  $hash_do_db = md5($heslo); // generovani hashe
  uloz($hash_do_db);  // ulozeni.. 

Sice nelze zjistit co přesně uživatel zadal, ale ono to není třeba. Spousta webu ukladá hesla jako md5 hash a pokud u jednoho získáš hash, tak jsi schopen najít řetězec který generuje stejnou hash. Pak stačí použít onen řetězec na jiných účtech a je celkem velká šance že se někam dostaneš.

Takže používej spíše něco takového:
  $hash_do_db = md5( $login + $heslo ); // generovani hashe
  uloz($hash_do_db);  // ulozeni.. 

To sice nezabrání hackerovi se dostat k hashi, ale je mu celkem k ničemu, protože nezíská řetezec, který generuje hash pro původní heslo.
Nevím jestli jsem to napsal srozumitelně, když tak se ozvi.
virgo86
Profil
nom drobnost - to heslo si změň, je tam pořád "zapis" :-).
To ja vím:)¨


Zatim tedy všem děkuji mrknu na to vše
Johnik
Profil
Meris
Podle mě, když už si dokážu zjistit hash hesla z db, tak není problém zjistit si k tomu i login. Pak to dám dohromady jsme tam, kde jsme byli...
meris
Profil
To Johnik:
Je to výrazně složitější, protože hledáš řetězece generující stejnou hash, který začíná stejnými znaky jako login, takových řetězců pak bude s hodně méně, zdali vůbec nějaký. Navíc nemáš zaručeno to, že ten řetězec bude geneovat stejnou hash jako samotné heslo.
Ale ok, můžeme být paranoici a udělat něco takového:
  $hash_do_db = md5( substr($heslo,0,2) + substr($login,0,3) + substr($heslo,3,1) + substr($login,4) + substr($heslo,4));
  uloz($hash_do_db); 

Pak už je dle mého nemožné najít řetězec tak aby generoval stejný hash, ale i zárověn obsahoval stejně umístěné znaky loginu.
meris
Profil
omyl při odesílání.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0