
Napriek mojej snahe uz niekolkokrat zviditelnit na internete tento problem, stale sa nan neudava dostatocna pozornost. Preto som sa rozhodol napisat tento clanok a urobit taku mensiu "kampan", aby si na tieto veci ludia davali pozor. O co vlastne ide?
Ide o bezpecnostnu chybu, najznamejsi priklad code injection v php. Jej vyuzitie je naozaj primitivne a na internete sa nachadza mnozstvo navodov, ako ju zneuzit (len na slovensko-ceskom internete ich je neurekom). Konkretne, o neosetrenu funkciu include v jazyku PHP.
Ako dochadza k vytvoreniu tejto chyby? Vacsinou ju robia programatori v php - zaciatocnici:), alebo ti, ktorych nezaujima bezpecnostna stranka ich webovej aplikacie. Lebo pri pisani takejto aplikacie sa treba zamerat nie len na to, co aplikacia MA robit, ale aj na to, co aplikacia MOZE robit. Co to znamena prakticky? Podme ku konkretnemu prikladu. Clovek, co objavil pred tyzdnom PHP a nesmierne ho zaujalo zacal pisat teraz dajaky web. Na co by jednotlive stranky robil tak, ze kazda cela stranka bude daky subor? Ked existuje funkcia include:) nemusim davat odkazy domena.sk/konkretna_stranka.php , efektnejsie, aj praktickejsie to bude domena.sk/index.php?zobraz=konkretna_stranka . Celkom jednoduche a kolko prace som si pri tom usetril.
Teraz ale. Ako bude vyzerat kod? No dako takto:
...html kod...
<?php
include($_GET['stranka']);
?>V lepsom pripade, bude pridavat .php (ale v konecnom dosledku to aj tak nic nezmeni):
<?php
include($_GET['stranka'].'.php');
?>Lenze co sa stane, ked vlozim do premennej "stranka" nieco ako napriklad "mojadomena.com/mojscript"? Stranka si nacita veci z premennej, a obsah suboru "mojscript" vykona ako PHP kod. Z toho vypliva, ze utocnik moze na stranke robit vsetko, na co ma prava apache user. Co znamena? Ze (za predpokladu, ze na servri nie su dane rozne obmadzenia), nie je problem zmenit subor index.php, nie je problem pozriet si zdrojove kody aplikacii -> napriklad prihlasovacie udaje do databazii.. atd.. Teda.. jedna sa o velmi jednoduchu, ale zaroven kriticku chybu. (v presnom zneni ako som napisal sa chyba neda vyuzit, ale tento clanok ma fungovat na preveniciu a nie na to, aby ho niekto bral ako navod na "hackovanie").
Tym padom, ked sa niekto nauci vyuzivat tuto metodu a vyhladavat stranky s touto chybou, doslova mu lezia pri nohach viacere stranky. A pritom.. o aku jednoduchu vec ide?
Kampan
To znamena, ze doslova za par hodin si moze povodne uplne neznaly clovek s troskou skodoradosti podefacovat desiatky stranok. Takychto ludi je cim dalej tym viac. Niektori len poslu mail adminovi, niektori viacej odvazni vlozia na stranku text ze "bola hacknuta", alebo "ze obsahuje kriticku chybu". Najdu sa vsak aj taki, a je ich naozaj dost, ktori nemaju problem zhodit celu stranku, pripadne dokonca vymazat subory. Okrem toho, dalsia chyba spociva v tom, ze castokrat, ked ten "najlepsi pripad", ktory len posle mail adminovi zostava bez odozvy. Teda lenivi administrator sa na take nieco vykasle. A to je obrovska chyba.
Preto som sa rozhodol trosku poukazat na tento problem. Celkom ma zaujal a za par minut (tak dve tri hodinky) sa mi podarilo urobit minidatabazu stranok, ktore tuto chybu obsahuju. Zatial je ich presne 30, vsetky len na cesku alebo slovensku. O co teda ide?
Ak ste dostali mail podobny ako tento:
Vasa stranka xxxx obsahuje kriticku bezpecnostnu chybu, ktora umoznuje utocnikovi prakticky vsetko, co moze apache (v praxi: uprava / mazanie suborov, pristup k databaze,...). Ak chcete vediet viac, staci sa pozriet na stranku http://luzer.sk/node/134 -> nachadza sa tam aj postup, ako to opravit.
IDE O REALNU CHYBU!
Prosim, aby ste po opraveni chyby odpisali na tento mail, alebo pridali komentar k clanku na uvedenej adrese.
Dakujem.
Vela stastia pri pisani dalsich stranok Vam zela,
thomm, admin luzer.sk
tento problem sa tyka aj Vas!
Oprava
Uz vieme, o co sa jedna. Ako to teda ale opravit? Jednoducho. Je viacej moznosti.
Minimalne miesto chybneho
<?php
include($_GET['stranka']);
?>pouzivat
<?php
include('./'.$_GET['stranka'].'.php');
?>Alebo, nieco ako toto:
<?php
switch ($promenna)
{
case "novinky.php":
include("novinky.php");
break;
case "clanky.php":
include("clanky.php");
break;
// atd...
default:
//v případě, že proměnná obsahuje něco jiného než novinky.php,
// clanky.php atd, se zobrazí hlášení o chybě.
echo "Chyba";
break;
}
?>Ak sa Vam tato kampan paci, mozete po odstraneni chyby dat na stranku tento kod:
<a href="http://luzer.sk/node/134">Na stranke bola osetrena bezpecnostna chyba - code injection</a>pripadne dat button luzer portalu:
<a href="http://luzer.sk" target="_blank"><img src="http://luzer.sk/buttons/luzer_button.gif" border=0 alt="Luzer portal" title="Luzer portal" /></a>a zobrazi sa Vam toto: 
Pevne verim, ze touto snahou pomozem aspon k minimalnemu zlepseniu bezpecnosti na slovensko-ceskom internete. Ak objavite dalsie stranky, ktore obsahuju tuto chybu, mozete mi ich poslat na thomm [zavinac] post.sk.
~~~~~~~~~~~~~~~
Administratori, ktori prejavili profesionalitu, a chybu na stranke opravili:
Komentáre
ja neim co řešíte .)
prominte tu troufalost, ale:
staci vsechno narvat do složky "txt/" a osetrit:
if (file_exists("txt/".$_GET['t'].".php")) $vloz = $_GET['t'];
else $vloz = 404;
.
.
.
include ("txt/".$vloz.".php");
Re: PHP a neosetrena funkcia include
ale staci podla mna taka mala vec a to moduly si zapisat do mysql ;) a mate pokoj :) podla mysql includovat moduly take male CMS ale pozor ma mysql incjection a to osetrite mysql_escape_string($_GET['modul']);
prelomit prelomit!
<?phpif (file_exists("./".$dpt."_".$sub.".php")): include("./".$dpt."_".$sub.".php");
else: include("./default.php");
endif;
?>
mno podla mna asi najlepsi
mno podla mna asi najlepsi sposob ako si ochranit aby do URL nebolo nechcene zadana nejaka http adresa
<?php
/***********************************************************
* Id index.php
* Begin: 2006-12-08
* Author Juraj Surman, surikman@surikman.sk
* Copyright: © 2006 madcoders.group
* Last modified: 2006 dec 30 00:17:40
* Version: 0.1
***********************************************************/
$urlky = array($_GET['id'], $_GET['vloz'], $_GET['act']);
//a proste vsetko co berieme z URL a nasledne by sme to includovali
for ($x = 0; $x < count($urlky); $x++) {
if (preg_match("/(http:\/\/|ftp:\/\/|https:\/\/)/", $urlky[$x])) {
/*pokial sa v url vyskytne http://, ftp:// alebo https:// tak presmeruje na hlavnu stranku...*/
header("location: ?");
exit();
}
}
/*tento script funguje tak ako je, jedine co vam staci
prepisat je nazvy premennych ktore beriete z URL*/
?>
Odstránil som chybu
Ja som to uz na serveri www.dantib.sk odstranil-mozte vyskusat sa mi naburat pomocou injection,ale uz neuspejete... Je to vazne velka bezpecnostna chyba odporucam vam ju podla tohto clanku opravit-neriskujte aby sa vam niekto nabural...
s pozdravom Daniel Šramel
admin www.dantib.sk
alebooo
da sa to spravit este mozno sposobom
<?php
/***********************************************************
* Id index.php
* Begin: 2006-12-08
* Author Juraj Surman, surikman(at)surikman(dot)sk
* Copyright: © 2006 madcoders.group
* Last modified: 2006 dec 26 21:13:19
* Version: 0.1
***********************************************************/
if (preg_match("/http:\/\//", $_GET['id'])) {
echo "NESMIE OBSAHOVAT HTTP://";
}
else {
/*script na include
napr */
include("./".$_GET['id'].".php");
}
/* samozrejme ze to include je dobre este osetretit,
cize namiesto tohto tam vlozime */
if (is_file("./".$_GET['id'].".php")) {
include("./".$_GET['id'].".php");
}
else {
echo "zadany subor neexistuje";
/*alebo*/
include("default.php");
}
?>
:D:D hustee:) teda, da sa
:D:D
hustee:)
teda, da sa povedat, ze tomuto by som uz mozno aj doveroval:)
---
Kubuntu user #8067 || thomm.yw.sk
ochrana proti zacykleniu
este jedna vecicka ..
http://www.dantib.sk/index.phtml?id=./index
ja by som to mozno riesil sposobom, ze si do nejakej premennej zadefinujes napr
$povolene_id = array("aa", "bb", "cc");
if (!is_array($_GET['id'], $povolene_id) { header("location: /"); exit; }
neviem ci sa to da vlastne
neviem ci sa to da vlastne pocitat za chybu:) zo stranky na to link nie je, a ked si to niekto spusti, a nestopne to skoro, jeho smola:]]
---
Kubuntu user #8067 || thomm.yw.sk
mno chyba to je
da sa to povazovat.. lebo ak by sa spojilo napr mozno aj 5 ludi naraz a otvoria si to tak zhodia server, podla mna by load servera stupol dost...
do toho preg_match by som este asi pridal ze ake znaky moze obsahovat to co beres z URL to by bolo este lepsie
heh, mno mas pravdu.. takto
heh, mno mas pravdu.. takto by sa dal vlastne jednoducho po DDOSovat im server:))
OT: pekny avatar:)
---
Kubuntu user #8067 || thomm.yw.sk
ale
nevyhodou je, ze musis to potom pravidelne menit :-/ ked doplnas veci
*******************************
http://emdi.sk || http://blogy.emdi.sk || http://www.damokles.cz/?id=88525