Jak zabránit nákladným výletům do obchodu s auty

Mám webovou aplikaci php, která umožňuje nahrávání souborů do konkrétního adresáře.

Chtěl bych zabránit provedení jakéhokoli souboru, který se nahraje do tohoto adresáře, ať už je to ASP, PHP nebo cokoli jiného, ​​co může IIS podporovat. Už blokuji nahrávání souborů asp a php na aplikační vrstvě, ale jako opatření do hloubky obrany proti možné chybě v tomto ověřovacím kódu bych chtěl přidat konfiguraci do IIS, aby se zabránilo provádění těchto souborů.

Existuje způsob, jak to udělat ve službě IIS?

  • Jakou máte kontrolu nad serverem / IIS? Pokud znáte název modulu, můžete do této složky umístit nějaký speciální soubor web.config, který dá IIS pokyn, aby odstranil ty konkrétní moduly, které se zabývají PHP / ASP atd. - ale musíte předem znát názvy těchto manipulátorů / modulů (pokud nejste rádi, že je všechny odstraníte, což nedává moc, pokud vůbec, smysl). To také nebude fungovat, pokud je zakázáno provádět konfiguraci této části konfigurační části v souboru web.config (tato omezení lze použít pouze na vyšší úrovni, např. Na úrovni serveru).
  • Myslím, že bych rád odpověděl, že funguje jak v situacích, kdy máte plnou kontrolu nad serverem, tak možná vteřinu, kde máte menší kontrolu (tj. Sdílený hosting). Minimálně bych chtěl odstranit php modul. Vlastně chci odstranit schopnost vykonávat jakýkoli kód uvnitř tohoto jednoho adresáře (i když se zdá, že to nedává smysl).

Nejprve - to opravdu záleží na konfiguraci vašeho serveru - pokud je možné takové úpravy provádět na úrovni adresáře (sekce není uzamčena na úrovni rodiče / serveru).

Chcete-li zakázat spuštění konkrétní přípony souboru, musíte znát název obslužné rutiny který je za to zodpovědný. Na každém systému se toto jméno může lišit, zejména pro PHP, protože se nejedná o standardní obslužný program (vytvořený uživatelem s administrátorskými právy). Například (web.config, který je třeba umístit do takové složky):

       

Výše uvedené odebere obslužný program s názvem „PHP 5“, který je zodpovědný za zpracování souborů * .php na mém počítači. S obslužnou rutinou * .asp by to mělo být jednodušší, protože má standardní název, ale v případě potřeby ji lze snadno změnit.

Jiný přístup - úplně odebrat VŠECHNY obslužné rutiny. V tomto případě nepotřebujete znát jména obslužné rutiny. To má jednu vážnou nevýhodu - nebudete moci sloužit cokoliv z této složky a podsložek, dokonce i statických souborů.

       

Chcete-li tuto nevýhodu obejít, můžete vytvořit pravidlo přepisování adres URL a předat všechny požadavky na tyto soubory vašemu speciálnímu skriptu, který tyto soubory skutečně obslouží (skript k nim bude mít přístup, takže zde žádné problémy). Nevýhoda - může to být docela složité (záleží na počtu typů souborů, které bude zpracovávat) + vyprodukuje trochu zbytečné režie zpracování (jak velká - záleží na vašem skriptu, jak jej budete kódovat).

3. přístup se zdá být optimálnější (opravdu záleží na vašich dalších požadavcích) - uděláme to odeber VŠECHNY obslužné rutiny a přidá ten, který obsluhuje statické soubory zpět .. takže images / html / css / js atd. by měly i nadále fungovat, pokud jsou požadovány z takové složky:

       

Pokud stále požadujete, aby v této složce byly k dispozici jiné standardní obslužné programy, budete je muset podobným způsobem přidat zpět.

  • Problém, který mám s jakýmkoli přístupem založeným na webové konfiguraci, je, že uživatelé mají přístup ke složce, kterou se tímto způsobem snažíme chránit, a že mohou upravovat nebo mazat web.config. Tímto způsobem jsou spojena oprávnění pro nahrávání a IIS a zavedení další vrstvy složek jde nad rámec jednoduché opravy zabezpečení a bude mým uživatelům nepříjemné. Stále hledám způsob, jak chránit složky s uživatelským obsahem.
  • @cdonner Takže .. v čem je problém? Zabalte svou konfiguraci do umístění prvek a pak takový web.config může být umístěn na jiném místě (např. kořenová složka): ..... Pokud nemůžete použít web.config vůbec - budete muset takový kód umístit (pomocí úplné cesty k této složce) do konfiguračního souboru celého serveru.
  • @cdonner Pokud máte přímý přístup k souborovému systému serveru (nebo můžete provádět příkazy, které ovlivní souborový systém), pak stačí použít příslušná bezpečnostní oprávnění k takovému souboru web.config, abyste zabránili jakémukoli přístupu přes FTP (nebo cokoli, co je požadováno).

Jedním z dobrých a snadných způsobů, jak zabránit spuštění určitých přípon souborů v určité složce, je použití funkce „Vyžádat filtrování“ služby IIS k úplnému zabránění přístupu k nim.

Přejděte do složky ve službě IIS a na kartě „Přípony názvů souborů“ funkce „Žádost o filtrování“ přidejte pravidla „Odepřít příponu souboru“ pro přípony souborů, které chcete zamknout.

To vygeneruje tyto oddíly v souboru web.config pro tuto složku:

        

V tomto příkladu blokujeme přístup k souborům .php, .asp a .aspx. Takže pokud se někdo pokusí o přístup k jakémukoli souboru s touto příponou ve vaší složce, dostane stavový kód 404 (jako kdyby soubor neexistoval).

To by byl dobrý způsob, jak zabránit provedení rychlým a jednoduchým způsobem.

  • Ale kdokoli může stále nahrát web.config do složky pro nahrávání a přepsat vaši konfiguraci obslužných rutin, takže bude moci znovu spouštět skripty s jinými příponami souborů. Podívejte se na tento odkaz pro příklad zneužití, kde se samotný web.config používá k předefinování toho, že web.config by měl obsluhovat obslužný program ASP, a v případě, že vloží skripty přímo do web.config. Pokud chápu, jediným skutečným řešením je omezit manipulátory (a nikoli rozšíření) a zakázat přepisování manipulátorů (nebo zakázat nahrávání web.config)

Za předpokladu, že chcete, aby se nahrané soubory zobrazovaly jako statický obsah (jinak byste mohli jednoduše uložit nahrané soubory mimo kořenovou složku vaší aplikace):

V kořenovém souboru web.config (který uživatelé nemohou přepsat) použijte toto (jak navrhuje Javier G., ale s allowOverride=false):

      

Nebo toto (jak navrhuje LazyOne, ale s allowOverride=false):

        

Pokud nepoužíváte allowOverride=false, kdokoli může nahrát web.config do vaší otevřené složky a přepsat vaši konfiguraci obslužných rutin, aby mohl znovu spouštět skripty. Příklad zneužití naleznete na tomto odkazu.

Jen pro přidání k zveřejněnému řešení pro ostatní, kteří by mohli narazit na stejný problém: Žádný z nich pro mě nepracoval, dokud jsem nezjistil, že manipulátory byly uzamčeny na nejvyšší úrovni. Nejsem administrátor serveru ani k tomu nejblíže, takže mi to chvíli trvalo. Až do applicationHost.config soubor byl upraven tak, aby umožňoval přepsání, včetně dokonce prázdného sekce na nižší úrovni web.config Soubor stačil na to, aby se všechno z této úrovně rozpadlo. Funguje to teď skvěle.

Přidejte tento soubor Web.config do svého adresáře pro nahrávání (nebo ještě lépe do nadřazeného souboru Web.config ve značce umístění path = "whatever")

     

To říká IIS, že obslužné rutiny (například PHP) mohou pouze číst a nespouštět, a proto se zobrazí 404 pro spustitelné skripty.

Pracoval pro vás: Charles Robertson | Chcete nás kontaktovat?

užitečné informace