Hacked Me
[Intro]Усім добрий час доби. Як я помітив - багато хто, стикаючись з ін'єкцією в PostgreSQL, не знають що ж робити далі. Що ж, у цій статті я спробуй пояснити порядок дій. Почнемо![Підбір стовпців]
Тут ніякої екзотики, визначаємо так само як і в MySQL та Oracle. Оскільки оператор UNION вимагає однакової кількості колонок як у першому, так і в другому запиті нам потрібно кількість цих колонок визначити Для цього існує 2 шляхи:1. Простий перебірприпустимо, у нас є сайт з ін'єкцією
[Визначаємо висновок]Припустимо ми підібрали кількість стовпців і їх виявилося 4
І так змінюючи стовпці ми дізнаємося висновок Але тут не все так просто. PostgreSQL має таку особливість, що стовпець у першому запиті і відповідний йому стовпець у другому повинні мати однаковий тип даних (char, int і тд) Найчастіше це char (наприклад текст статті). Здається, що нічого не зробиш, але розробники подбали про нас і створили функцію to_char(). Використовуємо так to_char(1,123) (перша цифра на бум, друга - число, яке виведеться на сторінку)[Information_Schema]
На щастя, в PosgreSQL існує спеціальна база, в якій зберігаються записи про всі існуючі таблиці, колонки і т.д. Запит до неї виглядає практично так само як і в MySQL, але з невеликим застереженням.
Тут після LIMIT коштує цифра 1 - це означає, що на сторінку виведеться один запис Після OFFSET цифра 1 - це означає, що на сторінку виведуться записи починаючи з другої (т.к. відлік ведеться з 0)
Перебравши таблиці, визначаємо ту, яка нам буде цікава. Нехай це буде USER Те, що ми знаємо ім'я таблиці - це добре, але требазнати і колонки Для цього змінюємо запит на такий:
[PG_TABLES або альтернатива Information_schema]
У старих версіях PostgreSQL немає можливості звернутися до бази Information_schema, оскільки її на той час не існувало. Але на щастя для неї є альтернатива - це таблиця PG_TABLES Варто помітити, що у неї є великий мінус, він випливає з назви. За допомогою неї ми можемо дізнатися лише таблиці, а колонки нам доведеться підбирати вручну. Імена таблиць зберігаються в колонціTABLENAMEПриклад
[Хек або дістаємо потрібну нам інфу з таблиці]
Ну тут уже все просто. Ми знаємо ім'я таблиці, знаємо імена колонок Складаємо запит:
де: preved - рядок який нам потрібно перекласти в інше кодування utf8_to_iso_8859_1 - з якого кодування в яке перекласти (повний список кодувань -> http://www.postgresql.org/docs/8.2/ interactive/functions-string.html#CONVERSION-NAMES)