03.04.2014 Views

Май - Xakep Online

Май - Xakep Online

Май - Xakep Online

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

взлом<br />

евгений «CoRWin» еРМАков<br />

/ http://c0rwin.net /<br />

© Тимур Ахметов<br />

Разрушая базы<br />

ПрОВеДеНие SQL-INJECTION В POSTGRESQL и ORACLE<br />

Всем наверняка знакомо сочетание «sql-injection». Не раз и не два мы вытягивали нужные<br />

сведения из таблиц баз данных. В то же время далеко не всегда удается провести<br />

успешную инъекцию из-за незнания особенностей той или иной базы данных. В общих<br />

чертах синтаксис ANSI SQL везде одинаков, но существуют подводные камни.<br />

Это тебе не «мускул»<br />

В большинстве случаев уязвимое приложение<br />

взаимодействует с MySQL, но, кроме «мускула»,<br />

довольно популярными являются серверы баз<br />

данных MSSQL, Oracle и PostgreSQL. Писать<br />

про все три мы не будем — информации по теме<br />

инъекций в серверы, использующие СУБД<br />

MSSQL, более чем достаточно. Сегодня мы на<br />

практических примерах рассмотрим некоторые<br />

тонкости при взломе PostgreSQL и Oracle. Учти,<br />

что никто не собирается обучать тебя языку<br />

структурированных запросов SQL.<br />

Десять «святых заповедей»<br />

PostgreSQL — достаточно мощная система, администрировать<br />

которую труднее, чем MySQL. Как<br />

правило, ее используют на крупных коммерческих<br />

проектах, требующих сложной иерархической<br />

/ 078<br />

структуры базы данных. Но в то же время PostgreSQL<br />

тяжелая и работает медленнее, чем тот же «мускул»,<br />

поэтому вряд ли кто-то будет использовать эту СУБД<br />

для домашней страницы (хотя в нашей жизни все<br />

возможно). Чтобы все твои инъекции были успешными,<br />

усвой десять простых правил. Но учти, что они<br />

характерны только для PostgreSQL.<br />

1. В отличие от MySQL, в базах данных<br />

PostgreSQL количество полей в select-запросах<br />

может не совпадать. Следовательно, здесь нам<br />

не нужно подбирать количество полей, как это<br />

бывает в MySQL.<br />

Пример: запрос «http://club.*****.ru/?part_<br />

id=10;select 1/**/» равнозначен «http://<br />

club.*****.ru/?part_id=10;select 1,2/**/».<br />

2. Таблицы Mytable и mytable не равнозначны.<br />

Всегда следует учитывать регистр букв.<br />

3. Нельзя оставлять открытый комментарий.<br />

Следовательно, отсечь ненужный нам sql-запрос<br />

просто так не получится. Но есть простой<br />

выход — использование null-байта «%00» (при<br />

отсутствии фильтрации).<br />

Запрос:<br />

http://club.*****.ru/?part_id=10-1/*<br />

Вывод:<br />

Fatal error: Call to undefined function: fetchrow()<br />

in /var/www/htdocs/veresk_club/classes/SQL.<br />

class.php on line 25<br />

Запрос:<br />

http://club.*****.ru/?part_id=10-1/**/<br />

Вывод:<br />

Страница сайта.<br />

xàêåð 05 /101/ 07

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!