Привіт, мій юний друг. У першій статті я описав два види зломів,
які бувають: шаблонний і «свій» зломи. Взагалі, в подальшому я
не буду особливо загострювати увагу на шаблонних зломах, причини
я описував в першій статті. Отже, сьогодні я розповім тобі про одному
зломі, який я зробив спеціально для написання цієї статті.

Отже, існує сайт: www.hasher.ru. викачавши всі файли
з цього сайту, я виявив цікаву директорію:
www.hasher.ru/sale/admin/ відкривши цю дерикторію, я побачив
красиву картинку, на якій красувався напис: «Обратотка замовлень»,
а під картинкою цікава форма, з кнопочкою «Логін». Як я не
намагався вгадати пароль, скрипт не піддався. Однак потім, до мене
дійшли відомості, що кожен модуль цієї системи перебувати у своєму
файлі, і викликається цей модуль не з оного скрипта, а завантажуючись
окремо. Також мені стало відомо, що в цій системі існує
модуль, який генерує сторінку для роздруківки даних,
таким чином, можна припустити, що система має файл, корінь
назви якого «print». Попробывав ввести адресу
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 нашу змінну:

«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