Браузер Operla, как можно догадаться из названия, написан на Perl'е. Скачать его вместе с остальными браузерами можно с
ftp.hackerdom.ru (ещё рано!), там же можно найти немало образов прошлых CTF. Всего было 3 версии этого браузера: 0.1, 0.2 и 0.3 соответственно. До релиза было далеко :) За разбор браузеров я сел не сразу, как и многие другие я занимался решением квестов. Потом, поняв, что на квестах игру не выйграешь, занялся основной задачей. К этому моменту несколько участников уже изучали браузеры. Узнав, на чем написаны браузеры и кто каким уже занимается я решил хакнуть erbrawser, который был написан на Erlang. Пока этот язык ставился на мой Linux я мельком посмотрел на operla версии 0.2, и остановился на нем :)
Так как код этого браузера небольшой я приведу его прямо тут:
В строке $cstr =~ s/([^A-Za-z0–9])/sprintf... перед "%" необходимо убрать символ "\" :)
А теперь модуль Object:
В основном коде, в функции getUrl, можно увидеть, что небольшими хитростями браузер можно заставить выполнить ещё один GET запрос. Но, к сожалению, условие в необходимом if всегда будет false (см. функцию trustedCstore). А вот если посмотреть модуль Object, то там без труда можно обнаружить 2 eval, один в функции animate, другой в action.
Не тратя время зря я взялся за функию action. Все оказалось достаточно просто, взлом браузера производился в два этапа:
Вот такой должна быть первая страница:
А вот такой должны быть вторая:
Приведенный выше Perl код делал следущее:
Невзирая на то, что я занимался взломом operla версии 0.2, эксплоит работал и на версии 0.3.