суббота, 31 октября 2009 г.

Способы взлома

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

Итак, существует сайт: http://www.hasher.ru. выкачав все файлы
из этого сайта, я обнаружил интересную директорию:
http://www.hasher.ru/sale/admin/, открыв эту дерикторию, я увидел
красивую картинку, на которой красовалась надпись: "Обратотка заказов",
а под картинкой интересная форма, с кнопочкой "Логин". Как я не
пытался угадать пароль, скрипт не поддался. Однако потом, до меня
дошли сведения, что каждый модуль этой системы находиться в своем
файле, и вызывается этот модуль не из оного скрипта, а загружаясь
отдельно. Также мне стало известно, что в этой системе существует
модуль, который генерирует страницу для распечатки каких-то данных,
таким образом, можно предположить, что система имеет файл, корень
названия которого "print". Попробывав ввести адрес
http://www.hasher.ru/sale/admin/print.php, я получил страницу, с
характерной ошибкой:

"Warning: mysql_num_rows(): supplied argument is not a valid MySQL
result resource in
/usr/home/hasher/public_html/www.hasher.ru/sale/admin/print.php
on line 18" - она говорит нам про какую-то ошибку при работе с
MySQL. Но... увы :(, это нам ничего не дает, как ни крути...

Но! Попробуем открыть хтмл-код главной страницы, той, где нас
просили ввести лоигн. Мы видим весьма интересный ява-скрипт,
понятно, что на существующей странице, то есть на странице, кторая
еще не сгенерирована, ибо не введен валидный логин, этот код нигде
не используется. Получается, что мы, как бы приоткрыли часть кода
главной страницы атакуемой системы. Итак, что же мы видим в этом
скрипте:

function toprint(obj)
{
var a = (obj.id.value);
var b = (forme.sss.value);
var p = (forma.pr.value);
var n1 = Number(fnum.num.value);
var n2 = n1+1;
var d = ",";
var q = "id = ";
var z = " or ";
var c = a+d+b;
var topr = p+q+a+z;
fnum.num.value = n2;
forma.pr.value = topr;
formb.mail1.value = topr;
formc.mail2.value = topr;
formd.del.value = topr;
formf.saving.value = topr;
formg.edit.value = topr;
forme.sss.value = c;
}

Сразу затрагивает внимание эта операция: var topr = p+q+a+z;.
Она интересна потому что почти всем остальным объектам этой
страницы присваивается результат этой операции. Итак, мы видим,
что в этой операции объявляется переменная "topr", которая
собирается из некоторых кусочков (p, q, a и z). Итак, переменная
"р", она у нас берется из value какого-то объекта страницы, можно
предположить, что это объект input. Затем переменная "q", она
равна строке "id = ". Переменная "а", она равна id, обекта, по которому
случается событие, то есть если это ,
то "а" будет равно 666. И, наконец переменная "z", она равна строке
" or ". Очень настораживают переменные q и z, строки, содержащиеся
в них, очень напоминают mysql-запрос. Теперь посмотрим, что дальше происходит
с переменной "р": в ее объект записывается результат topr, то есть "р"
у нас как бы в "круговороте". Теперь попробуем прикинуть, каким будет topr,
если в него подставить свои данные: topr="id = 3 or ", это при условии, что
переменная "р" пустая, то бишь после первого вызова функции. Итак, все это
хозяйство очень напоминает mysql-запрос, также мы знаем, что он (запрос)
записывается в value объекта pr, то бишь, запрос передается в переменной pr.

Теперь вспомним про ошибку, которую нам выдавал файл print.php, понятно, что
скрипт ругался на отсутвие или не валидность mysql-запроса. Теперь предположим,
что наша переменная pr передается методом GET, тогда пробуем передать
срипту print.php нашу переменную:

"http://www.hasher.ru/sale/admin/print.php?pr=id = 3 or",
видим, что ошибка пропала, ))) значит мы где-то рядом, теперь попробуем вместо
3, поставить другую цифру, например, 6, и что мы видим :)))? *(скрипт выдал нам
страницу, для печати данных о пользователе 6)

Вот, в принципе, и все, сам я было на этом остановился, но... потом до меня дошло,
что "pr" чем-то похоже на "print". Отсюда следует, что также существуют
файлы, названия которых похожи на другие объекты страницы. Для примера возьмем
formf.saving.value, попробывав "побрутить" название файла вручную, находим,
что существует файл save.php, он также имеет такую же ошибку, что и print.php.
Сдесь все также, как и с print.php, отличие только в том, что скрипт получает
переменную saving, теперь попробывав передать переменную saving с тем же
запросом, что и для print.php, мы увидим, что скрипт поддался, и даже выдал нам
больше информации, чем в первом примере. А теперь попробуем ввести то же самое,
только без " or " :)) *(скрипт выдает всю таблицу).

Вот и все. На этом взлом окончен, во всяком случае я, больше ничего не нашел,
может тебе повезет больше...


© Franklin

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

Отправить комментарий