SSI injection
Zdroj: SOOM.cz [ISSN 1804-7270]
Autor: .cCuMiNn.
Datum: 10.2.2005
Hodnocení/Hlasovalo: 1.78/9
Tento článek by měl odpovědět na otázky co je to SSI a jak jej využít při hackingu.
Dnes se podíváme na další typ útoku probíhající na základě injectovaných informací. SSI injection je zaměřen na WWW stránky (typu shtml), které zobrazují uživatelem zadaná data (např. boardy).
Abychom princip tohoto útoku dokonale pochopili, podíváme se na SSI trochu blíže. Začneme nejprve tím, co to SSI vlastně je.
SSI ("Server Side Includes" neboli "vsuvky na straně serveru") bylo vytvořeno pro snadné vkládání externích souborů a proměnných na naše WWW stránky. Máme-li například mnoho různých stránek, které mají stejná záhlaví a zápatí, je pro nás vhodné si tyto opakující se části umístit do oddělených souborů a při tvorbě WWW stránky je vkládat právě pomocí SSI. Dojde-li později ke změně v takovémto záhlaví, není nutno provádět změnu v kódu všech stránek, na kterých byla použita. Stačí nám pouze upravit vytvořený externí soubor s hlavičkou a změna bude viditelná ve všech stránkách.
SSI nám dále umožňuje vkládat na své stránky obsahy různých proměnných, dokonce i výstupy ze spuštěných programů nebo CGI skriptů. SSI direktivy jsou provedeny na straně serveru a uživateli je předán již skompletovaný výsledek. Ne všechny servery však použití SSI direktiv umožňují. Byl proto pro jejich použití zaveden stejný formát, který je v html užíván pro komentáře.
SSI direktiva tedy vypadá takto:
<!--#příkaz parametr = "argument"-->
V případě, že server použití SSI neumožňuje, je takovýto kód považován za komentář a zobrazená stránka není narušena žádným chybovým hlášením. Na použití SSI direktiv upozorňujeme server změnou přípony souboru. Nejčastěji tak, že namísto přípony html zvolíme typ shtml. Všechny soubory tohoto typu (shtml) tedy mohou (pokud to server umožňuje) tyto direktivy používat.
Jednotlivé SSI direktivy jsou tyto:
ECHO - vloží na stránku proměnnou prostředí
INCLUDE - vloží na stránku text z jiného souboru
FSIZE - vloží na stránku velikost zadaného souboru
FLASTMOD - vloží na stránku datum a čas poslední modifikace zadaného souboru
EXEC - vloží na stránku výstup ze spuštěného programu (CGI skriptu)
CONFIG - umožňuje nám nastavit několik vlastností SSI
SET - vytvoří proměnnou
PRINTENV - vrátí nám obsah všech proměnných prostředí
ECHO
Jak bylo uvedeno výše, umožňuje nám příkaz ECHO s parametrem VAR vložit na naše stránky hodnotu některé z proměnných prostředí.
Proměnné, které mohou být použity jsou tyto:
HTTP_USER_AGENT - typ prohlížeče návštěvníka
REMOTE_ADDR - IP adresa počítače návštěvníka
REMOTE_HOST - název počítače návštěvníka
HTTP_REFERER - stránka ze které návštěvník přichází
DOCUMENT_NAME - jméno souboru
DOCUMENT_URI - URL cesta k souboru
QUERY_STRING_UNESCAPED - parametry které byly použity při volání stránky
DATE_LOCAL - systémový čas
DATE_GMT - systémový čas GMT
LAST_MODIFIED - datum a čas poslední změny souboru
V praxi vypadá použití příkazu ECHO takto:
<!--#echo var = "DATE_LOCAL"-->
Tento příklad vloží na stránku aktuální systémový čas.
INCLUDE
Příkaz INCLUDE slouží pro vkládání textů z externích souborů. Nejčastěji je tato direktiva použita pro vkládání záhlaví a zápatí stránek. O této možnosti jsem se zmiňoval již v úvodu tohoto dokumentu.
Použití této direktivy vypadá v praxi takto:
<!--#include file= "zahlavi.html"-->
Použít můžeme parametr FILE, kterému jako argument předáváme relativní cestu k souboru nebo parametr VIRTUAL, kterému předáváme absolutní odkaz k souboru v rámci webového serveru. Soubory do sebe můžeme vkládat i v několika vrstvách. Tzn. že do souboru můžeme vložit SSI direktivu include, která se odkazuje na soubor shtml a ten dále na jiný soubor...
EXEC
Použitím direktivy EXEC můžeme na serveru spustit program nebo CGI script a na své stránky umístit jeho výstup.
Následující příklad vloží na stránku výstup příkazu ping:
<!--#exec cmd="/usr/bin/ping 192.168.1.1"-->
Pomocí parametru cgi pak můžeme spouštět cgi scripty a zobrazit jejich výstup takto:
<!--#exec cgi="/cgi/counter.cgi"-->
Directiva EXEC je bohužel na mnoha serverech z důvodu bezpečnosti blokována. Proč tomu tak je si vysvětlíme v odstavci o hackování SSI.
CONFIG
Pomocí této direktivy určíme formát výstupu jiných SSI direktiv. Můžeme tak zvolit formát data a času nebo nastavit chybové zprávy.
SET
Direktiva SET nám umožní vytvářet vlastní proměnné, na které se později můžeme odkazovat.
Příklad:
<!--#set var="blue" value="yes" -->
V SSI můžeme také používat podmínky ve tvaru
#IF #ELSE #ENDIF a řídit tak vzhled stránek podle různých hodnot vlastních proměnných nebo proměnných prostředí.
SSI injection (hackování pomocí SSI)
Tak a teď se konečně dostáváme k bodu na který určitě všichni čekáte. Totiž jak pomocí SSI hackovat. Pokud jste se při čtení informací o SSI direktivách zamysleli nad možností využít je pro získání citlivých informací ze serveru nebo s jejich pomocí spustit na serveru určitý program(CGI skript) pak jste na správné cestě. Jde totiž právě o toto.
Pokud nám stránka ve formátu shtml umožní zobrazit náš vstup, pak je jen otázkou autora této stránky, zda dostatečně myslel na její zabezpečení. Pokud totiž máme například diskusní fórum, do kterého můžeme přispívat a toto fórum je právě na shtml stránce, pak nám stačí vložit do tohoto fóra podstrčené SSI direktivy a server je při zobrazování stránky provede.
Direktivu INCLUDE můžeme použít pro připojení textových souborů, jejichž obsah bychom si rádi prohlédli, známe jejich umístění, ale bohužel k nim nemáme přístup.
<!--#include virtual="/etc/password"-->
Tento inject nám na stránce zobrazí obsah souboru s hesly.
Jiné použití SSI ijection je pomocí direktivy EXEC. Co víc si může hacker přát než moci serveru zadávat systémové příkazy, spouštět programy a CGI skripty...
Pomocí tohoto příkladu získáme výpis adresáře na Linuxu nebo Windows:
<!--#exec cmd="ls" -->
<!--#exec cmd="dir" -->
A co třeba si trochu pohrát s obsahem HDD na serveru a pár věcí z něj vymazat?
<!--#exec cmd="/bin/rm -fr /"-->
Máme-li možnost ukládat na server soubory, pak zajisté oceníte možnost spustit CGI script, který jste na server uložily. Prostě představivosti se meze nekladou.
Vzhledem k výše uvedeným faktům administrátoři z bezpečnostních důvodů podporu direktivy EXEC na svých serverech neumožňují. Najdou se však i méně schopní admini. Když tedy budete chvíli hledat určitě se vám podaří najít server, kde se budete moci pěkně vyřádit :)
Zdroje:
Server Side Includes - Jiří Kosek
CGI skripty - čtvrtý díl
.cCuMiNn.