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 ↓</a> <ul class="submenu" id="sub1"> <li><a href="?str=fotokomentare&pg=foto1">Fotokomentare 1</a></li> <li><a href="?str=fotokomentare&pg=foto2">Fotokomentare 2</a></li> <li><a href="?str=fotokomentare&pg=foto3">Fotokomentare 3</a></li> <li><a href="?str=fotokomentare&pg=foto4">Fotokomentare 4</a></li> <li><a href="?str=fotokomentare&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 ↓</a> <ul class="submenu" id="sub2"> <li><a href="?str=mytologia&pg=myth1">Mytólogia 1</a></li> <li><a href="?str=mytologia&pg=myth2">Mytólogia 2</a></li> <li><a href="?str=mytologia&pg=myth3">Mytólogia 3</a></li> <li><a href="?str=mytologia&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&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";} ?> |
||
user243 Profil |
#2 · Zasláno: 28. 2. 2013, 11:04:39
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 |
#3 · Zasláno: 28. 2. 2013, 11:09:49
Par don zrejme som tam pridal menej podstatnú časť include. Už je to opravené kód hore.
|
||
Taps Profil |
#4 · Zasláno: 28. 2. 2013, 12:40:59
7777:
určitě by nebylo od věci kontrolovat existenci souboru <? file_exists(); ?> |
||
user243 Profil |
#5 · Zasláno: 28. 2. 2013, 13:27:14
v samotném include chybu nevidím; máš na webu nějaké formuláře?
|
||
7777 Profil |
#6 · Zasláno: 28. 2. 2013, 13:58:54
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 |
#9 · Zasláno: 28. 2. 2013, 17:31:00
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 |
#11 · Zasláno: 28. 2. 2013, 18:22:52
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 |
#13 · Zasláno: 28. 2. 2013, 19:27:57
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 |
#14 · Zasláno: 28. 2. 2013, 19:32:26
donny:
promiň, to byl můj menší/větší překlep; měl jsem na mysli 7777 ne tebe; |
||
Joker Profil |
#15 · Zasláno: 28. 2. 2013, 19:35:41
Taky je dost možné, že to vůbec nebyl hack, ale zacyklilo se nějaké přesměrování, robot nebo spammer.
|
||
Časová prodleva: 11 let
|
0