PDA

Просмотр полной версии : PHP+SQL+C inj


Tamrang
23.06.2009, 16:48
Добрый день.
Самому сделать не получается, опишу проблему тут:

Общий алгоритм работы:
Существует некая программа X, в которой существует текстовое поле,содержимое этого поля при нажатии "Отправить" вноситься в базу на сервере.

Далее на сайте, зайдя по некому адресу мы можем наблюдать внесенные данные.

Итоги исследований:
На первый взгляд в поле филтруется вообще все:
Написав туда что-то типа ' " ; -- // /* char(39) и др варианты мы видим 100% внесенных данных на сайте.
Тоесть логически предполагаем что каждый из символов, дабы без искажений отображаться на сайте в базе должен иметь вид: \\ \' \" т.е. экранироваться.

На сайте существует код аля
echo $переменная, содержащая значение из базы.
Следовательно подставив введенные+экранированные данные мы какраз получаем конечную строку: ' " ; -- // /* char(39) и т.п.

Отсюда можно сделать вывод что вставка любого символа кроме буквоцифр приводит к экранировке и внесении в базу. Т.е. на сайте лишь отображается уже фильтрованный текст, и воздействовать на него можно только из программы ибо 100% символов будет экранировано из проги.

Исследование на XSS Дало положительный результат, весело загрузилась во фрейме порнушка(html), вылезло alert()(javascript), ну и VBScript тоже показал работоспособность.

Т.к. как ява, так и VBscript выполняются на стороне клиента (для справки: площадка на сервере linux,freebsd 99%), следовательно добиться чегото больше чем XSS врядли получится.

Копаем дальше:
Наша задача победить экранировку символов, дабы получить возможность выполнять как SQL так и PHP-inj.
Во-первых определим какие могут быть способы экранировки символов:
1) Что-то типа magic_quotes, т.к. каждый символ-не буква экранируется. (Наиболее вероятно)
2) Кодирование кода в base64 или по другому алгоритму и хранения этого в базе, с последующей расшифровкой при выводе (Маловероятно, ибо тогда в функции echo на сайте в 100% случаев вылезала ошибка при введении символа " или '.)

Во-вторых нужно подобрать способы убийства этого:
1) Как рекомендуется везде использовать альтернативные методы записи типа char() и прочее (на деле эффективность не показали)
2) Использование того-же base64 шифрования(допустим мы занесем в базу чтото типа base64_decode(code); , где code='<?php phpinfo();?> как пример, но т.к. на сайте стоит обычные echo,следовательно функция не будет использована по назначению.
3) Использовать альтернативные методы вставки php тегов(<% %> <script lang=php> и тп) (на практике не работает)
По пункту 3 следует отметить что вставляя код <?php phpinfo(); ?> на сайте я получаю пустую строку, НО в исходном коде страницы, светится "<?php phpinfo(); ?>" т.е. интерпритатор php не хочет её обрабатывать, считая текстом, это возможно только при конструкции echo '<?php phpinfo(); ?>'; (протестил дома).

Продолжаю исследования, кто что может посоветовать? Сам пока не додумался...