Autor Zpráva
7777
Profil
Ahoj chcel by som požiadať o pomoc zo zabezpečením include na mojich stránkach. Mesiace bolo všetko ok až včera hacker spustil na hostingu 40 000 prikazov/1 sek. Útok prišiel z môjho webíku Magické premeny kód include je asi takýto:
<?php
$str = isset($_GET["str"])?$_GET["str"]:""; 
$pg = isset($_GET["pg"])?$_GET["pg"]:"";
?>

<?php
    echo'<li><a href="?str=uvod"' . ( isset($aktivni["uvod"]) ? $aktivni["uvod"] : '' ) . '>úvod</a></li>
         <li><a href="?str=autopra"' . ( isset($aktivni["autopra"]) ? $aktivni["autopra"] : '' ) . '>Autorské práva</a></li>
         <li><a href="#"' . ( isset($aktivni["Fotokomentare"]) ? $aktivni["Fotokomentare"] : '' ) . ' onclick="SwitchMenu(\'sub1\')" >Fotokomentáre&nbsp;&darr;</a>
            <ul class="submenu" id="sub1">
                <li><a href="?str=fotokomentare&amp;pg=foto1">Fotokomentare 1</a></li>
                <li><a href="?str=fotokomentare&amp;pg=foto2">Fotokomentare 2</a></li>
                <li><a href="?str=fotokomentare&amp;pg=foto3">Fotokomentare 3</a></li>
                <li><a href="?str=fotokomentare&amp;pg=foto4">Fotokomentare 4</a></li>
                <li><a href="?str=fotokomentare&amp;pg=foto5">Fotokomentáre 5</a></li>
            </ul>
         </li>
         <li><a href="?str=poviedky"' . ( isset($aktivni["poviedky"]) ? $aktivni["poviedky"] : '' ) . '>Poviedky</a></li>
         <li><a href="?str=preklady"' . ( isset($aktivni["preklady"]) ? $aktivni["preklady"] : '' ) . '>Preklady</a></li>
         <li><a href="#"' . ( isset($aktivni["mytologia"]) ? $aktivni["mytologia"] : '' ) . ' onclick="SwitchMenu(\'sub2\')" >Mytológia&nbsp;&darr;</a>
            <ul class="submenu" id="sub2">
                <li><a href="?str=mytologia&amp;pg=myth1">Mytólogia 1</a></li>
                <li><a href="?str=mytologia&amp;pg=myth2">Mytólogia 2</a></li>
                <li><a href="?str=mytologia&amp;pg=myth3">Mytólogia 3</a></li>
                <li><a href="?str=mytologia&amp;pg=myth4">Mytólogia 4</a></li>
            </ul>
        </li>
         <li><a href="?str=odkazy"' . ( isset($aktivni["odkazy"]) ? $aktivni["odkazy"] : '' ) . '>Odkazy</a></li>';
?>

<?php
$str = isset($_GET["str"])?$_GET["str"]:""; 
$pg = isset($_GET["pg"])?$_GET["pg"]:"";
if ($str == "fotokomentare" && $pg == "foto") {include "fotokomentare.php";} 
//
//v textu pak bude odkaz vypadat takto:
//<a href="?str=fotokomentare&amp;pg=7777">
//
elseif ($str == "fotokomentare" && $pg == "foto1") {include "7777/Fotokomentare/fotokomentare_1.php";}
elseif ($str == "fotokomentare" && $pg == "foto2") {include "7777/Fotokomentare/fotokomentare_2.php";}
elseif ($str == "fotokomentare" && $pg == "foto3") {include "7777/Fotokomentare/fotokomentare_3.php";}
elseif ($str == "fotokomentare" && $pg == "foto4") {include "7777/Fotokomentare/fotokomentare_4.php";}
elseif ($str == "fotokomentare" && $pg == "foto5") {include "7777/Fotokomentare/fotokomentare_5.php";}

elseif ($str == "preklady" && $pg == "prepov1") {include "7777/Preklady/Poviedky/Pridaj_sa_k_nam.php";}
elseif ($str == "preklady" && $pg == "prepov2") {include "7777/Preklady/Poviedky/Voskove_bikiny.php";}
elseif ($str == "preklady" && $pg == "prepov3") {include "7777/Preklady/Poviedky/Maly_Problem.php";}
elseif ($str == "preklady" && $pg == "prepov4") {include "7777/Preklady/Poviedky/Eroticka_pekaren_vlastny_pozitok.php";}
elseif ($str == "preklady" && $pg == "prepov5") {include "7777/Preklady/Poviedky/Daj_si_pozor_Caesar.php";}
elseif ($str == "preklady" && $pg == "prepov6") {include "7777/Preklady/Poviedky/sru_ponaucenie.php";}
elseif ($str == "preklady" && $pg == "prepov7") {include "7777/Preklady/Poviedky/Kratke_minipribehy-Dzin.php";}

elseif ($str == "tvorba" && $pg == "po") {include "7777/Poviedky/figurina.php";}
elseif ($str == "tvorba" && $pg == "po2") {include "7777/Poviedky/aladinova_lampa.php";}
elseif ($str == "tvorba" && $pg == "po3") {include "7777/Poviedky/Stoparka.php";}
elseif ($str == "tvorba" && $pg == "po4") {include "7777/Poviedky/Obycajny_nakup.php";}
elseif ($str == "tvorba" && $pg == "po5") {include "7777/Poviedky/Puncochove_kalhoty.php";}
elseif ($str == "tvorba" && $pg == "po6") {include "7777/Poviedky/Puncochove_kalhoty_znovu_na_scene.php";}
elseif ($str == "tvorba" && $pg == "po7") {include "7777/Poviedky/Laura_a_Pavlina_1.php";}
elseif ($str == "tvorba" && $pg == "po8") {include "7777/Poviedky/Laura_a_Pavlina_2.php";}
elseif ($str == "tvorba" && $pg == "po9") {include "7777/Poviedky/Holcicka_pocuranka.php";}
elseif ($str == "tvorba" && $pg == "po10") {include "7777/Poviedky/Devka.php";}
elseif ($str == "tvorba" && $pg == "po11") {include "7777/Poviedky/Devka_2.php";}
elseif ($str == "tvorba" && $pg == "po12") {include "7777/Poviedky/Gula_z_Atlantidy.php";}
elseif ($str == "tvorba" && $pg == "po13") {include "7777/Poviedky/Psi_povidka.php";}
elseif ($str == "tvorba" && $pg == "po14") {include "7777/Poviedky/Jak_jsem_se_stal_vibratorem.php";}


elseif ($str == "mytologia" && $pg == "myth1") {include "7777/Mytologia/mytologia.php";}
elseif ($str == "mytologia" && $pg == "myth2") {include "7777/Mytologia/mytologia2.php";}
elseif ($str == "mytologia" && $pg == "myth3") {include "7777/Mytologia/mytologia3.php";}
elseif ($str == "mytologia" && $pg == "myth4") {include "7777/Mytologia/mytologia4.php";}
elseif ($str == "mytologia" && $pg == "myth5") {include "7777/Mytologia/mytologia5.php";}
elseif ($str == "mytologia" && $pg == "myth6") {include "7777/Mytologia/mytologia6.php";}
elseif ($str == "mytologia" && $pg == "myth7") {include "7777/Mytologia/mytologia7.php";}
elseif ($str == "mytologia" && $pg == "myth8") {include "7777/Mytologia/mytologia8.php";}
elseif ($str == "mytologia" && $pg == "myth9") {include "7777/Mytologia/mytologia9.php";}
elseif ($str == "mytologia" && $pg == "myth10") {include "7777/Mytologia/mytologia10.php";}

elseif ($str == "odkazy") {include "odkazy.php";}
elseif ($str == "preklady") {include "preklady.php";}
elseif ($str == "poviedky") {include "poviedky.php";}
elseif ($str == "autopra") {include "autorske_pravo.php";}
elseif ($str == "pristupnost") {include "design/pristupnost.php";}
else {include "uvod.php";}
?>
Pomôžte mi ho zabezpečiť aby už hacker na moje stránky nikdy nezavítal. A hlavne nemohol ich hacknúť v php som ako ryba na suchu používam toto include ale naprogramoval ho i stránku jeden nadšení fanúšik webu. O php injection som počul i čítal ale neviem ako kódy previesť na svoje include aby to fungovalo.
user243
Profil
7777:
kód include je asi takýto
buď něco je, nebo není, žádné mezi stavy;

spíš ukaž, jak tento kód voláš;
7777
Profil
Par don zrejme som tam pridal menej podstatnú časť include. Už je to opravené kód hore.
Taps
Profil
7777:
určitě by nebylo od věci kontrolovat existenci souboru
<?
file_exists();
?>
user243
Profil
v samotném include chybu nevidím; máš na webu nějaké formuláře?
7777
Profil
Nie. Ale čo som sa o tom dočítal tak vraj zabezpečiť sa to dá asi takto. Lenže ja neviem ako a kde to vložiť do include:

vkládej ho do menu třeba:

<li><a href="'.$root.'uvod">Uvod</a></li>

A pak ověřuj předané parametry:

if(isset($_GET["pg"]))
{
$pg = htmlspecialchars($_GET["pg"]); //převede nebezpečné znaky na html entity
if (file_exists("pages/".$pg.".php")) //oveří, že se v adresáři nachází soubor stejného jména
{
include "pages/".$pg.".php";
}
else include "pages/404.php";
}
else include "pages/about.php";
ČO som sa dočítal o php injection tak vraj to v poho ide cez súbor scripte.txt
donny
Profil
7777:
$str = isset($_GET["str"])?$_GET["str"]:"";
$pg = isset($_GET["pg"])?$_GET["pg"]:"";
[/i]


Overovať to musíš začať niekde tu.. ešte predtým než začneš includovať, v podstate môžeš nahradiť tie dva riadky hore týmto..

//prva premenna
if(isset($_GET["str"]))
{
      $str = htmlspecialchars($_GET["str"]);
}
//druha premenna
if(isset($_GET["pg"]))
{
      $pg = htmlspecialchars($_GET["pg"]);
}

následne napr. pokračovať takto
if ($str == "fotokomentare" && $pg == "foto") {$page = "fotokomentare.php";}
elseif ($str == "fotokomentare" && $pg == "foto1") {$page = "7777/Fotokomentare/fotokomentare_1.php";}
elseif ($str == "fotokomentare" && $pg == "foto2") {$page = "7777/Fotokomentare/fotokomentare_2.php";}

..... bla bla bla....
 

s tým že nebudeš includovať hneď ale vytvoriš premennú ktorá bude obsahovať cieľ (to aby si nemusel overovať existenciu súbora v každej podmienke) a až na koniec za else ešte overeríš či súbor existuje..

if (file_exists($page))
{ 
   include($page); 
} 
else 
{
   include "pages/404.php"; 
} 

Prípadne ak by si chcel byť za frajera :) môžeš pridať aj overenie či $_GET[str] alebo $_GET[pg] neobsahuje url adresu, pretože pri PHP injection ide vo väčšine o to že útočník podsúva do include svoj súbor uložený na inej url

define('REGEX_URL','/http\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/');

if(!preg_match(REGEX_URL, $url, $url)) 
{
    //ak nie je pokracuj inak to ignoruj...
}
user243
Profil
donny:
útočník podsúva do include svoj súbor uložený na inej url
ale on testuje hodnotu z GET a podle ní načítá další soubory;
právě ten příklad, co uvedl dony později, je nebezpečný, protože pracuje přímo s hodnotou GET a jistí si to převodem na entity a kontrolou existence;
Davex
Profil
7777:
Souhlasím s userem243, že v uvedeném kódu není bezpečnostní problém s include. Jak jsi přišel na to, že se tam hacker dostal zrovna přes PHP Injection a tento skript? Chyba přece může být kdekoliv jinde.
donny
Profil
user243:
ale on testuje hodnotu z GET a podle ní načítá další soubory;
Ale veď o to práve v php injection práve ide, princíp základnej php injection spočíva napr v http://www.inastranka.cz/index.php?page=http://nejakastranka.cz/script.txt , tiež netuším akým spôsobom prišiel na to že tam bol ten problém pri hacknutí, ja som len písal to čo býva uvádzané ako riešenie, druhá vec je že od verzie php 5.2 je štandardne direktíva allow_url_include vypnutá... Viac v článku napr. tu

ale on testuje hodnotu z GET a podle ní načítá další soubory;
hhm, moja ukážka pracuje úplne s tým istým ako jeho pôvodný skrit, rozdiel je len to že to prevádza na entity pomocou htmlspecialchars.

Jeho kód:
$str = isset($_GET["str"])?$_GET["str"]:""; 
$pg = isset($_GET["pg"])?$_GET["pg"]:""; 

Výsledok je že sa do $str a do $pg uloží priamo premenná get, alebo medzera (teda je prázdna)..

Môj kod
if(isset($_GET["str"]))
{
      $str = htmlspecialchars($_GET["str"]);
}
//druha premenna
if(isset($_GET["pg"]))
{
      $pg = htmlspecialchars($_GET["pg"]);
}

Výsledok je že sa do $str a do $pg uloží premenná get prevedená na entity, alebo nič. If ostal jeho, s jediným rozdielom že to neincluduje priamo ale ukladá do premennej a následne testuje či súbor existuje. Neviem (a rád by som vedel) kde konkrétne vidíš to nebezpečenstvo (teda to ktoré nevidíš v pôvodnej ukážke)
7777
Profil
Môj mecenáš vlastní vlastný hosting a ktomu i doménu a nedávno mi zohnal vlastnú aby mi nemusel vytvárať stále nové a nové ftp účty. Oba sú nejako monitorované a doména nekonecne.net nadmerne zaťažovala hosting. Útok smeroval na môj hlavný web 7777.nekonecne.net
donny
Profil
7777:
Môj mecenáš vlastní vlastný hosting a ktomu i doménu a nedávno mi zohnal vlastnú aby mi nemusel vytvárať stále nové a nové ftp účty. Oba sú nejako monitorované a doména nekonecne.net nadmerne zaťažovala hosting. Útok smeroval na môj hlavný web 7777.nekonecne.net


To ale stále nie je dôvod myslieť si že za to môže php injection, tento hack sa väčšinou prejavuje inak ako záťažou.. Za nadmernou záťažou môže byť skôr DoS attack..
Micruss
Profil
Souhlasím s donny, když byl zadána stránka 40 000/s tak podle mě chtěl shodit web a né se hacknout do tvýho webu pomocí php injekce mohl zapnout HOIC a zadat adresu a jelo to samo;-) server se kapánek zatížil, zřejmě nespadl, ale i tak mu to dalo práci
user243
Profil
donny:
promiň, to byl můj menší/větší překlep; měl jsem na mysli 7777 ne tebe;
Joker
Profil
Taky je dost možné, že to vůbec nebyl hack, ale zacyklilo se nějaké přesměrování, robot nebo spammer.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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