Každý den přicházíme do styku s protokolem HTTP. O tomto protokolu je známé, že je to protokol bezstavový. Proto abychom si význam slova „bezstavový“ trochu přiblížili zde uvedu způsob, jakým mezi sebou klient a server pomocí potoku HTTP komunikují.
- Nejprve dojde k navázání spojení
- po té je klientem vyslán požadavek
- na který server odpovídá
- a nakonec se spojení ukončí
(Pokud stránka obsahuje více objektů, dokáží novější verze protokolu HTTP vyřídit několik požadavků během jednoho spojení.)
Bezstavový tedy znamená, že server nemá s klienty stálé spojení, a proto je nemůže sám jednoznačně identifikovat. Pokud přecházíme z jedné stránky na druhou, pak druhá stránka neví nic o činnostech, které jsme prováděli na stránce předchozí. Řešení tohoto problému se však našlo a my můžeme informace mezi jednotlivými stránkami předávat pomocí
- parametrů v URL
- polí fomulářů zasílaných metodou POST
- cookies
- session proměnných
Každá z výše uvedených možností má své klady a zápory. My se v tomto textu zaměříme na první dvě z nich, tedy na možnost kdy stránka předává parametry v URL metodou GET nebo kdy je předává v těle metotou POST.
Musíme však začít pěkně od začátku a to tím, že si vysvětlíme něco málo o formulářích umístěných na stránkách a o objektech, které v sobě informace uchovávají.
Formuláře
Cílem tohoto textu není seznámit vás podrobně s formuláři a všemi jejich možnostmi. Budu se jimi zaobírat pouze okrajově, abyste získali alespoň nějakou minimální představu.
Zájemce o bližší informace pak nasměruji na jednu z mnoha stránek, jež je tomuto tématu věnována
Jakpsatweb
Když se podíváme na zdrojový kód WWW stránky, která obsahuje některé vstupní prvky, můžeme uvidět část kódu ohraničenou tagy <FORM> a </FORM>. Mezi těmito tagy se většinou nachází objekty sloužící pro uživatelský vstup. Tyto objekty jsou presentovány tagem <INPUT> určitého typu.
Tímto typem může být:
-TEXT (vstupní textové pole)
-BUTTON (tlačítko)
-HIDDEN (skryté pole)
-a mnoho dalších
Běžný zdrojový text formuláře vypadá například takto:
<form action="stranka.html">
<input type=text name="vzkaz">
<input type=hidden name="user" value=“guest“>
<input type=submit value=odeslat>
</form>
Ve zdrojovém kódu formuláře budeme věnovat pozornost nejvíce těmto věcem:
- metodě kterou formulář odesílá data
- jménům formurmuláře a jednotlivých prvků (toto jméno je umístěno za řetězcem NAME=)
- hodnotám a významu skrytých polí
Hodnoty vstupních textových polí se dají na stránce jednoduše měnit prostým přepsáním (pokud nejsou disabled), jiná situace však nastává u prvků typu hidden, která na stránce vidět nejsou, ale obsahují svou (často důležitou) hodnotu. Běžný uživatel se o existenci skrytých polí většinou nedozví. Když však dojde k odeslání obsahu formuláře nějakému skriptu, jsou obsahy těchto polí odeslány současně s požadavkem.
My se v tomto dokumentu budeme zabývat způsoby, jakými je možné hodnoty skrytých polí měnit před jejich odesláním. Na výběr máme hned několik metod:
- změnou hodnot předávaných v URL
- pomocí uložené a upravené kopie stránky
- pomocí JavaScript injection
- odesláním připravených informací přímo na server
Změna hodnoty předávané v URL
Pokud v tagu <FORM> není uvedena metoda nebo narazíme na text METHOD=“GET“, můžeme z toho usoudit, že hodnoty jednotlivých polí budou předávána prostřednictvím URL.
<form action="stranka.html" method=“get“>
<input type=text name="vzkaz">
<input type=hidden name="user" value=“guest“>
<input type=submit value=odeslat>
</form>
Formulář by po stisku tlačítka vytvořil takovéto URL:
http://www.aktualni_sit.cz/stranka.html?vzkaz=tvujvzkaz&user=guest
Zde vidíme jak se předávají hodnoty polí
vzkaz a
user s hodnotami
tvujvzkaz a
guest. Od adresy jsou tyto parametry odděleny znakem ? a jednotlivě se pak od seba oddělují znakem &.
Setkáme-li se se stránkou, která předává parametry tímto způsobem, není pro nás žádný problém tyto hodnoty měnit. Stačí, když v URL přepíšeme jakoukoliv hodnotu a tento požadavek odešleme. Můžeme například zkusit změnit hodnotu parametru user na hodnotu admin a sledovat co se stane.
http://www.aktualni_sit.cz/stranka.html?vzkaz=tvujvzkaz&user=admin
Uložení kopie stránky
Jiná situace nastává v případě že je použit takovýto kód:
<form action="stranka.html" method=“post“>
<input type=text name="vzkaz">
<input type=hidden name="user" value=“guest“>
<input type=submit value=odeslat>
</form>
Vidíme zde, že pro odeslání parametrů je použita metoda POST. V tomto případě se parametry nepředávají v URL, nýbrž v těle požadavku. Pokud se nyní rozhodneme změnit některou z předávaných hodnot, musíme sáhnout k trochu složitějším metodám. V uvedeném zdrojovém kódu vidíme, že obsahuje stejně jako v minulém případě skryté pole user s nastavenou hodnou gues. My si opět dáme za úkol tuto hodnotu změnit na admin. Jak na to? Doufám, že je všem jasné, že není možné změnit tuto hodnotu ve zdrojovém textu a výsledek uložit na server namísto původní stránky :) Můžeme si však lokálně uložit kopii této stránky na svém PC.
Jakmile máme na disku uloženu kopii stránky, editujeme její zdrojový kód textovým editorem do této podoby:
<form action=" http://www.aktualni_sit.cz/stranka.html" method=“post“>
<input type=text name="vzkaz">
<input type=hidden name="user" value=“admin“>
<input type=submit value=odeslat>
</form>
Všiměte si, že jsme nezměnili pouze hodnotu prvku user, ale také jsme upravili odkaz v tagu <form>. Je to z toho důvodu, že uvedená cesta byla relativní vzhledem k aktuálnímu adresáři. Pokud bychom tuto hodnotu nezměnili, byl by cíl marně hledán na našem disku. Absolutní cesta naproti tomu nasměruje dotaz správně na zadaný server.
Když nyní otevřeme zeditovanou stránku ve webovém prohlížeči a stiskneme na ní umístěné tlačítko odeslat, dojde k odeslání dotazu s námi zadanými hodnotami. Tato metoda má však určité nedostatky. V hlavičce každého dotazu je totiž mimojiné posílána položka refferer, která obsahuje url stránky, ze které byl požadavek vyslán. Tato položka může být cílovým scriptem kontrolována a přístup povolen pouze pokud přicházíte z původního místa. V tomto případě bychom tedy neuspěli a museli bychom sáhnout po některé z následujících metod.
JavaScript injection
Pomocí metody JS injection můžeme změnit jakýkoliv prvek na stránce a to jak jeho vlastnosti, tak i jeho hodnoty. Dělat můžeme opravdu spousty různých taškařin, z nich se v tomto dokumentu zaměříme zase pouze na změnu obsahu skrytých polí.
Příkazy javascriptu zadáváme do pole s adresou v inernetovém browseru. Formulář z našeho příkladu si načteme prohlížečem a v addressbaru následně zadáme:
javascript: alert(document.forms[0].elements[0].value);
Výsledkem by nám mělo být dialogové okno s informací, jakou hodnotu obsahuje první ovládací prvek prvního formuláře na aktuálním zobrazeném dokumentu. V našem případě to bude hodnota, kterou máme zadánu v textovém poli vzkaz. Inkrementujeme-li číslo zadané u objektu elements z 0 na 1 a zjistíme hodnotu dalšího prvku. V našem případě se nám zobrazí hodnota skrytého pole
user tzn.
guest.
Nyní, když jsme zjstili pořadové číslo objektu, můžeme přistoupit ke změně jeho hodnoty:
javascript: void(document.forms[0].elements[1].value='admin');
Pokud jste se dobře zadívali na zdrojový text formuláře a zapamatovali jste si názvy jednotlivých prvků, můžete k nim přistupovat i pomocí jejich jména namísto pořadového čísla. Např. místo
elements[0] uvedeme
elements['user'].
Před odesláním si ještě můžeme ověřit změněnou hodnotu.
Přímé odeslání POST požadavku
Při této metodě si sami poskládáme veškerá data, která serveru odešleme. Můžeme tak požadavek velice konkrétně specifikovat a můžeme také uparvit některé hodnoty zfalšovanými údaji.
Začneme třeba tím, že si pomocí sniffovacího programu (např. Ethereal) odchytneme packety vysílané počítačem a prohlédneme si jejich obsah. Budu-li uvažovat kód formuláře z předchozích příkladů, pak se mi podaří na síti zadržet například takto vypadající data:
POST /stranka.html HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, */*
Referer: http://www.aktualni_sit.cz/formular.html
Accept-Language: cs
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
Host: www.aktualni_sit.cz
Content-Length: 26
Connection: Keep-Alive
Cache-Control: no-cache
vzkaz=tvujvzkaz&user=guest
Chcete-li přesně pochopit význam jednotlivých údajů v hlavičce, bude nutné nutné sáhnout po dokumentaci protokolu http nebo přímo do
RFC2616. My si zde totiž vysvětlíme pouze některé položky, které pro nás mohou mít význam.
Hlavička začíná položkou
POST /stranka.html HTTP/1.1, která označuje POST požadavek na relativní odkaz /stranka.html, přičemž bude použito protokolu http verze 1.1
Položka referer obsahuje URL stránky, ze které pozadavek vysíláme. Spoofování této hodnoty pro nás může často mít zásadní význam.
Accept-Language informuje adresáta o námi preferovaném jazyce a hodnota Mozilla/4.0 v položce
User-Agent zase o našem použitém webovém prohlížeči. Obě tyto hodnoty je někdy vhodné spoofovat.
Položka host obsahuje adresu aktuálního serveru a další důležitou hodnotu obsahuje
Content-Length, který udává délku zasílaných dat v bytech.
Za hlavičkou následují parametry odesílané metou post, které musí být od hlavičky odděleny jedním prázdným řádkem.
Po té co si takovouto hlavičku a data sami vytvoříme pomocí textového editoru a soubor si uložíme pod názvem například post.txt, nezbývá nám už nic dalšího, než jen tento soubor odeslat Netcatem na port 80 cílového serveru:
Type post.txt | nc www.aktualni_sit.cz 80
Závěr
Možnosti tohoto zneužití jsou poměrně široké. Na serveru security.newz-portal.net vyšel jednou článek pod názvem "Nakupujeme pomocí skrytých polí", kde se změnou hodnoty v těchto polích dosahovalo levnějších cen v internetových obchodech, apd.
Jako vždy jsem se pouze snažil naznačit cestu a konkrétní využití nechám na vaší fantazii.
.cCuMiNn.