Feed subscription » blog | » comments | » irc | » mobi | » twitter

Zlý, zlý referer

Zlý, zlý refererPravdepodobne každý tvorca webu sa v živote stretol s tzv. refererom. Jedná sa o reťazec prenášaný klientským prehliadačom, ktorý výlučne pre benefit navštíveného servera nesie v sebe informáciu o zdroji, z ktorého prišiel. Takto je možné zistiť, odkiaľ k vám prišiel návštevník a ktoré linky majú akú odozvu.

Referer je zakorenený priamo v RFC 2616 v sekcii 14.36 (biblii každého, kto sa zaoberá web security). Ako som už napísal v úvode, referer je reťazec reprezentujúci zdrojový server, z ktorého návštevník prišiel. Takto je možné identifikovať napríklad aj to, aký reťazec návštevník vyhľadal na Google, čo ho priviedlo až k vášmu webu.

Referer je veľmi často využívaný množstvom programátorov pre zvýšenie funkcionality webu. Veľmi často sa využíva napríklad pre návrat/prechod na stránku späť. Je to logická náhrada za JavaScript, ktorý má dnes vypnutých až cez 10% návštevníkov a ďalší zablokovaný kvôli ochrane.

Len málokto si však uvedomuje, že referer môže byť aj strojcom problémov. Na úrovni užívateľa je to samozrejme fakt, že majiteľ webu kam ste práve prišli vie, kde ste boli pred vstupom na jeho web. Nie je na tom nič nebezpečné, maximálne tak nepríjemné, pretože sa na danej stránke nachádzala linka, cez ktorú ste k nemu prešli. Na úrovni servera môže byť problémov hneď niekoľko. Programátori až moc často zabúdajú na to, že aj referer je reťazec, ktorý môže užívateľ veľmi jednoducho zmeniť. Vďaka tomu môže byť práve referer najzraniteľnejším miestom aplikácie. Neraz som sa stretol s webom, ktorý referery ukladal do databázy a nebol ošetrený proti vstupu nebezpečných znakov. Cez túto dieru bol následne vykonaný SQL Injection a web bol kompromitovaný aj napriek tomu, že ostatné vstupy a výstupy boli skutočne veľmi kvalitne ošetrené.

pozn.
V jazyku PHP a databáze MySQL je najvhodnejšie na tento účel využívať mysqli_stmt::prepare, v jazyku Python pre databázu MySQL MySQLdb (execute).

Ďalším veľmi častým prípadom je zlé ošetrenie session. Ak session nie je priradená ku konkrétnemu počítaču (napríklad cez IP adresu) a je prenášaná cez url, môže sa majiteľ navštíveného webu dostať napríklad aj do administrácie systému bez toho, aby poznal prihlasovacie údaje. Samozrejme len za predpokladu, že platnosť session ešte nevypršala.

Nemenej zaujímavým je aj fakt, že cez referer je možné objaviť miesta cudzieho webu, ktoré by ste inak nepoznali. Vďaka refereru napríklad vieme, že Sme má na službe vybrali.sme bonzlist. Taktiež sa môžete dozvedieť o presnej lokácii administrácii, ak vás navštívi administrátor, ktorému sa zobrazí vaša linka medzi odkazujúcimi stránkami. Vďaka tomu napríklad viem, že môj obľúbený sushiblog beží na textpattern. Nie že by to nešlo zistiť inak, ale občas sa stane, že administrácia je umiestnená na neštandardných miestach (namiesto /admin napríklad /cucoriedka). Lokalizovanie takejto administrácie je potom veľmi obtiažne, ak nie nemožné.

U užívateľa som zámerne preskočil jeden veľmi závažný dôvod, prečo si vypnúť referer. V mojom nedávnom článku o zraniteľnosti služby dropbox som publikoval aj video cez službu vimeo, ktorá ako jeden z benefitov umožňuje aj komukoľvek zistiť, odkiaľ užívateľ video navštívil. Medzi mnohými linkami nájdete aj linky v spoločnej sekcii file. Táto sekcia obsahuje referer, ktorým je súbor. Ako je to možné? Pozrite sa sami.
file///C:/Users/botiq/AppData/Roaming/Feedreader/cache/article5895.htm
file///C:/Documents%20and%20Settings/psolty/Local%20Settings/Temp/Newz%20Crawler/fra24E3.html
file///C:/Documents%20and%20Settings/roman/Application%20Data/Feedreader/cache/article7437.htm
file///C:/Documents%20and%20Settings/Marcel%20Kubala/Local%20Settings/Temp/~fdnws024A1735-2504-4537-9EA0-A6A8708C2593.h
file///C:/Users/andrej/AppData/Roaming/Feedreader/cache/article40105.htm
file///C:/Documents%20and%20Settings/milosh.MK.000/Application%20Data/Feedreader/cache/article561.htm
file///C:/Documents%20and%20Settings/peter.IRIS/Application%20Data/Feedreader/cache/article1559.htm
file///C:/Documents%20and%20Settings/klimko/Application%20Data/Feedreader/cache/article11.htm
file///C:/Documents%20and%20Settings/Peto/Data%20aplikac%C4%82%C2%AD/Feedreader/cache/article3936.htm
file///C:/Documents%20and%20Settings/Jakub/Local%20Settings/Temp/~nbtmp0001.html
file///C:/Documents%20and%20Settings/michal.klima/Local%20Settings/Temp/~fdnws215D4170-DCDA-418C-AF00-0815A55CAF0C.html
file///C:/Dokumente%20und%20Einstellungen/Juraj/Lokale%20Einstellungen/Temp/~fdnwsEF787911-6C7B-4D77-814A-AD22AB4F108B.html
Čo je možné z týchto údajov vyčítať je snáď jasné každému. Od mena užívateľa, cez jazyk (lokalizáciu) jeho OS Windows až po názov RSS čítačky, ktorú používa. A tu je celý kameň úrazu. Ak využívate niektorú z externých čítačiek pre RSS feedy a priamo v nej otvárate aj jednotlivé články, výsledok už poznáte.

Ako ste sami mali možnosť vidieť, referer je veľmi nebezpečná vec a preto by ste ju nemali podceňovať, najlepšie by ste ho však mali úplne zakázať. Pre užívateľov Firefoxu sa naskytá hneď niekoľko možností. Tou najjednoduchšou je v nastaveniach Firefoxu, ktoré vyvoláte po zadaní about:config do URL políčka. Do filtru zadajte buď len referer, alebo network.http.sendRefererHeader a network.http.sendSecureXSiteReferrer a zmeňte true za false, alebo jednotku za nulu. Takto je referer vypnutý na stálo a pre jeho zapnutie a vypnutie je vždy potrebné reštartovať Firefox. Sú však niektoré weby (ako vybrali.sme.sk), ktoré vyžadujú zapnutý referer, inak neumožnia hlasovať. Pre takýto prípad je lepšie mať možnosť referer vždy zapnúť jediným kliknutím. Túto funkciu poskytuje výborný Web Developer s obrovským množstvom ďalších výborných funkcií. Ďalšou možnosťou (hlavne pre pen testerov) je rozšírenie Modify Headers, v ktorom môžete testovať aj rôzne bezpečnostné vektory (napríklad pre XSS).

Pre ostatné prehliadače možnosti nepoznám, snáď ich niekto napíše do komentáru.

Programátorom webu by som odporučil byť zdravo paranoidný a vždy ošetrovať akékoľvek dáta, kľudne aj tie, ktoré ste získali z vlastného interného zdroja. Nikdy neviete, kde sa objaví zraniteľnosť.

Print


Príbuzné články:

Žiadne príbuzné články neboli nájdené.



27 Responses to “Zlý, zlý referer”


  1. 1 warior Jul 31st, 2008 at 16:52

    pohladal som, hadam to je ono
    http://www.opera.com/support/search/view/93/

  2. 2 Kapor Jul 31st, 2008 at 21:13

    warior:
    operu nepoužívam, malo by to byť ono.
    Pre istotu odporúčam nejakú “view my referer” službu, napr. tento odkaz http://www.whatismyreferer.com/ ak je referer vypnutý, prvý riadok by mal byť prázdny, keď budeš mať referer zapnutý, bude tam adresa na tento web.

  3. 3 Accuphose Jul 31st, 2008 at 22:00

    V Opeře je to jednoduché, je na to tlačítko v Nastavení – Pokročilé volby – Připojení – “Odesílat info o předešlé navštívené adrese”(překlad se liší dle verze Opery). Jen bych doplnil docela důlěžitou věc.
    Spousta webů si tak chrání automatické stahování programů (vytížení serveru bych si tipnul) a bez zapnutého Refereru si nic nestáhnete.

  4. 4 asti Aug 1st, 2008 at 00:16

    Ja som mal vo FF pri hodnote network.http.sendSecureXSiteReferer standartne nastavenu hodnotu 2.
    Viete niekto co to ma byt? 0 je false, 1 je true, WTF 2?

  5. 5 chrono Aug 1st, 2008 at 01:50

    asti: nemal si tú dvojku v network.http.sendRefererHeader? (network.http.sendSecureXSiteReferrer je typu boolean, takže tam môžeš mať len true, alebo false)

  6. 6 rony Aug 1st, 2008 at 08:31

    Referer v administracii webu? V tom pripade urcite nie ako priamy odkaz ;-) Naprogramovat cosi ako http://www.example.org/go?http://www.another-example.org/ by sa snad dalo do kazdeho CMS, nie? :-)

    Dokonca mozno aj svojpomocne bez nutnosti cakat na autorov CMSka.

  7. 7 lolo Aug 1st, 2008 at 12:17

    vo firefoxe sa to da vypnut jednoducho network.http.sendRefererHeader sa nastavi na hodnotu 0 a uz to je.

  8. 8 oooo Aug 1st, 2008 at 12:18

    rony: pravda ;) akurat ze tak nefunguje takmer ziadny system, ale co uz :)

    lolo: ved je to napisane uz v clanku

  9. 9 Menon Aug 1st, 2008 at 14:11

    network.http.sendSecureXSiteReferrer je s dvomi “r” ( teda aspon u mna – ff 2.0 ) – ked hladate “referer” s jednym r vyhodi to iba network.http.sendRefererHeader a ta je typu cele cislo ( povodna hodnota 2 ).
    Len jednu vec – na vypnutie referu je treba zmenit obidve tie polozky ci staci iba network.http.sendRefererHeader?

  10. 10 addam Aug 1st, 2008 at 14:40

    No co ja viem… referer podla mna nie je tak nebezpecny (z hladiska sukromia uzivatela) ako co je mozne zistit s csskovou pseudotriedou :visited.
    Btw. ako je mozne ze to do RFCcka dostalo v bez druheho rka? :)

  11. 11 oooo Aug 1st, 2008 at 14:46

    Menon: mas recht, uz som to zmenil. secure je pre https, normalny je pre http traffic.

    addam: pseudotrieda css visited je 10 rokov starada zalestitost, s ktorou sa nikdy nic robit nebude. i cez nu je mozne urobit par neprijemnych veci, ale skor len z titulu, ze dokazes zistit kade clovek chodil (i ked som raz mal prednasku o vyuziti pri phishingu alebo head huntingu). kazdopadne, referer moze byt mnohokrat nebezpecnejsi, pretoze v sebe obcas nesie citlive informacie.

    ale ano, mozno urobim clanok aj o tom, este uvidim. chcel by som postupne prejst cely owasp, aby to bolo aj v slovenskom jazyku

  12. 12 chrono Aug 2nd, 2008 at 00:22

    Keď sa tu už spomenulo :visited, tak tu je celkom zábavný spôsob využitia tohoto “problému”: http://www.mikeonads.com/2008/07/13/using-your-browser-url-history-estimate-gender/

  13. 13 gondo Aug 3rd, 2008 at 00:10

    v opere fici aj “opera:config” a dalej uz popisany postup ako pre ff

  14. 14 madonion Aug 3rd, 2008 at 23:51

    gondo: akoze aky popisany postup ako pre FF? prve prispevky hovoria o spravnom postupe pre operu.

  15. 15 TommyHot Aug 5th, 2008 at 01:09

    Pride mi dost paranoidne vypinat referer v browseri. Chapem, ze je to mozna hrozba, ale hrozba je aj sadnut do auta a soferovat. To teraz vsetci prestanu jazdit na autach aby sa nedajboze nic nestalo?

    Kazdopadne moznost jednym clickom povolit/zakazat posielanie refereru, je prijemna :)

  16. 16 referrer Aug 6th, 2008 at 18:42

    Uvedomte si, ze referrer sa da do hlavicky len pri priamom odkaze, takze takto velmi tazko najdete odkaz na administraciu.

    BTW ja ho mam tiez vypnuty.

  17. 17 oooo Aug 6th, 2008 at 18:54

    ty si prosim uvedom, ze mnozstvo administracii, vratane systemu wordpress ma priamo v administracii zoznam odkazujucich stranok, teda priamo ich linkov

  18. 18 Avandgard Aug 30th, 2008 at 19:37

    Zdravím,

    možno je táto otázka offtopic ale vzhľadom ku kvalite článkov a komentárov si myslím, že som aj tak na správnom mieste. V otázkach bezpečnosti php programovania som viac menej bažant, preto by som sa vás chcel spýtať či je táto stránka (http://phpsec.org/projects/) dostatočným podkladom k zabezpečeniu webových projektov. Ak náhodou viete o nejakých iných/lepších zdrojoch budem rád ak by ste ich tu zverejnili prípadne mi ich pošlite na mail … avandgar@azet.sk

    Ďakujem

  19. 19 ... Sep 2nd, 2008 at 10:51

    To nejsou programatori, ale tupohlavy koderi a script kiddies.

  20. 20 CrazyDog Sep 2nd, 2008 at 20:49

    Každý nějak začíná :-D

  21. 21 sedkooo Feb 9th, 2009 at 00:21

    Zdravim, je to trochu mimo, ale mam jednu otazku. Da sa nejako zistit adresa, alebo nazov domeny, ktora vola script na mojom servery? Napr dam na http://www.test.sk kod, ktory zavola php script na mojom servery. No a ja chcem aby ten script vedel, ze kto ho zavolal, cize aby vedel, ze ho vola http://www.test.sk. Da sa to nejako? Vopred dakujem

  22. 22 oooo Feb 9th, 2009 at 03:47

    #21 sedkooo: nuz na urovni browseru si samozrejme prechod uzivatela mozes overit cez referer. na urovni serveru to zalezi od jazyka a daemona, ale dolezita otazka je hlavne: “k comu to potrebujes”. od toho uz potom zalezi konkretne riesenie

  23. 23 sedkooo Feb 9th, 2009 at 11:47

    no predstav si, ze na mojej stranke mam napr. odchody autobusov a vlakov. A ked s niekym spravim dohodu tak mu dam kod, ktory si vlozi u seba na web cez iframe. Ale chcem to mat osetrene aby sa to nedalo len tak dalej rozsirovat. Cize ten kod ktory niekomu poskytnem bude platny iba na jeho web stranke a na inej nebude fungovat. Cize to musi byt nejako osetrene na mojom serveri, aby vedel, ze z akej adresy je volany script. Pretoze ak bude tato kontrola na strane klienta, da sa lahko obist. Vysvetlil som to zrozumitelne? A dakujem velmi pekne za odpoved:)

  24. 24 oooo Feb 9th, 2009 at 12:45

    #23 sedkooo: kazda ochrana sa da viac menej obist. na to co chces ty ti staci kontrolovat referer, ak to skutocne musi byt iba na konkretnu adresu, tak to potom musis limitovat na ip danej masiny a to si na serveri overovat. neviem v akom jazyku to mas, ale pozri sa do dokumentacie k nemu, tam najdes vsetko potrebne

  25. 25 sedkooo Feb 9th, 2009 at 14:51

    Ale mne vobec nejde o to ci niekto klikne na odkazy v tom iframe, ale o to, ze ak si ten iframe da niekto iny na svoj web tak mu nebude fungovat. Neda sa nejako zistit na akej web stranke, je umiestneny ten moj iframe ked zavola skript na mojom serveri? Aby som tomu spravne rozumel, ked je takto na webe iframe a nikto na neho neklikne aj tak sa musi nacitat jeho obsah, cize server na ktorom je umiestnena stranka s iframe sa musi spojit s mojim serverom. Rozumiem tomu spravne? Ak ano tak potom by to malo nejako ist zistit meno servera, ktory sa pripojil na skript u mna. Chcem to robit cez PHP alebo Javascript. Urcite to musi ist nejako osetrit, lebo inak by sa dali dost lahko zneuzivat reklamne odkazy na strankach, ktore zarabuju kliknutim na ne.

  26. 26 oooo Feb 10th, 2009 at 07:45

    #25 sedkooo: vidim, ze velku znalost o prehliadacoch nemas. referer sa neodosiela pri kliknuti (to len na odkaz), ale samozrejme aj pri iframe, frame, object-e, atd. jednoducho vsade tam, kde sa zavola cudzi server. neviem o ake zneuzitie ide, neviem co robis (popravde ani nechcem). na taketo veci vyuzi prosim forum http://diskuse.jakpsatweb.cz/, alebo http://forum.builder.cz, kde ti daju lepsie odpovede ako ja

  27. 27 sedkooo Feb 10th, 2009 at 09:27

    ide mi iba o to aby si niekto mohol umiestnit na jeho stranku informacie odo mna, napr odchody autobusov, ale nechcem aby si to mohol davat na stranku len tak hocikto, kto si okopiruje source kod, bez toho aby sa so mnou dohodol. ale skusim tie stranky co si mi poradil. Dakujem velmi pekne

Zanechajte odkaz

  • na ďalšie komentáre odkazujte za použitia čísla komentáru v hranatej zátvorke, napríklad [3]
  • vaša IP adresa je logovaná a zneužívaná na výskumné účely
  • môžete mi tykať
  • komentáre sú moderované, kritiku prijímam, snažte sa prosím strániť invektív