Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.
В настоящее время я изучаю аудит PHP-кода, поэтому разберу все свои учебные записи~
Конечно, самым основным условием является хотя бы примерное изучение синтаксиса PHP.
1. Установите соответствующее программное обеспечение, такое как Sublime text, Notepad++, editplus, систему аудита исходного кода Seay и т. д.
2. Получите исходный код и загрузите исходный код различных веб-сайтов в Интернете.
3. Установите сайт
Прочитать весь текст: Трудно, но подробно
Метод обратного отслеживания параметров чувствительной функции: эффективная и широко используемая система аудита исходного кода Seay
Метод целевого функционального анализа: в основном аудит на основе бизнес-логики программы. Сначала используйте браузер для доступа по одному, чтобы увидеть, какие функции есть в программе, и порассуждайте о возможных уязвимостях на основе соответствующих функций.
1. Общее понимание
2. Провести аудит по каждой функции по методу направленной функции.
3. Метод обратного отслеживания параметров чувствительной функции
Просмотрите папку с исходным кодом, чтобы получить примерное представление о каталоге программы.
администратор: каталог фонового управления
install: каталог установки веб-сайта, где install.sql — это структурная информация базы данных.
sys: в этом каталоге обычно хранятся файлы с информацией о конфигурации и общедоступные библиотеки функций, которыми являются config.php и lib.php соответственно.
пользователь: здесь записываются некоторые операции пользователя, такие как регистрация пользователя и т. д.
index.php: Обычно это файл домашней страницы веб-страницы, это также прорывная точка для аудита.
Файлы index.php и admin.php обычно являются входом ко всей программе. С помощью индексного файла вы можете узнать архитектуру программы, запущенный процесс, какие файлы конфигурации, файлы фильтров и файлы фильтров безопасности она содержит, а также понять бизнес. логика программы.
Обычно файлы, подобные config.php, сохраняют некоторую информацию, связанную с базой данных, и некоторую информацию о программе. Сначала посмотрите на кодировку базы данных. Если это gbk, возможно, происходит внедрение широких байтов; если значение переменной заключено в двойные кавычки, может возникнуть проблема с выполнением кода анализа двойных кавычек.
Через файлы общедоступных функций и файлы фильтров безопасности мы можем видеть, какие данные, вводимые пользователем, фильтруются, а какие не фильтруются, где и как фильтруются, можно ли обойти отфильтрованные данные, является ли метод фильтрации замещающим или обычным. , есть ли GPC и используется ли обработка addslasher() и т. д.
Уязвимость начальной установки программы
Утечка информации о сайте
Управление загрузкой файлов
Уязвимости аутентификации при входе и управления разрешениями
Уязвимость резервного копирования базы данных
Уязвимости кода проверки и т. д.
1. Контролируемые переменные (все факторы вредны)
2. Переменная достигает ценной функции (опасной функции).
Суть аудита кода: поиск лазеек фактически эквивалентен поиску соответствующих переменных и функций.
Процесс отслеживания переменных:
Прямая трассировка — поиск функций через переменные
Обратная трассировка — поиск переменных через функции
Файл конфигурации PHP обычно представляет собой файл php.ini.
Файл php.ini должен называться «php.ini» и располагаться в каталоге, указанном директивой PHPiniDir в httpd.conf. Его можно просмотреть с помощью функции phpinfo().
Как правило, его необходимо настроить, чтобы сделать среду более безопасной.
php.ini: читается при запуске PHP. Для версии PHP с серверным модулем он читается только один раз при запуске веб-сервера; для версий CGI и CLI он читается при каждом вызове; Переменные среды можно использовать в php.ini. Когда веб-сервер Apache запустится, он изменит каталог на корневой каталог, что заставит PHP попытаться прочитать php.ini в корневом каталоге, если он существует. Вы также можете переопределить значение php.ini в httpd.conf для более гибкой настройки: значение имени php_value. Константы PHP можно использовать только в php.ini, а соответствующее значение маски необходимо использовать в httpd.conf.
Файл .user.ini: начиная с PHP5.3.0 PHP поддерживает файлы INI в стиле .htaccess для каждого каталога. Такие файлы обрабатываются только CGI/FastCGI SAPI; эта функция делает расширение PECL htscanner недействительным при использовании Apache. Затем используется .htaccess; файл будет иметь тот же эффект. В файлах INI стиля .user.ini распознаются только настройки INI с режимами PHP_INI_PERDIR и PHP_INI_USER. При использовании PHP в качестве модуля Apache вы также можете использовать инструкции в файле конфигурации Apache и файле .htaccess для изменения настроек конфигурации PHP; требуются разрешения «AllowOverride Options» или «AllowOverride All».
Синтаксис: Установите формат директивы: директива = значение с учетом регистра.
Можно использовать значения: строки, разделенные кавычками («foo»), массивы, константы PHP (E_ALL, M_PI), константы INI (On, Off, none), выражения.
Выражение в INI-документе использует только: !、()、|бит или、&Бит И、~ немного нет、
Пустую строку можно представить ничем после знака равенства или с помощью ключевого слова none:
foo = ; Установить foo в пустую строку
foo = none; Установить foo в пустую строку
foo = "none"; Установите в foo строку "none";
Включите глобальные переменные: Register_globals=off.
Функция заключается в отключении автоматической регистрации глобальных переменных.
Установите значение «Вкл.»,phpволя_POST,_GET,_COOKIE,_ENV,в массиве _SESSIONkey=>
Короткий тег: short_open_tag=off
Функция состоит в том, чтобы решить, разрешить ли использованиеPHPСокращение флага начала кода(<??>)。Если отключено,необходимо использоватьPHPПолная форма флага начала кода(<?php?>)。
Безопасный режим: Safe_mode=выкл.
Управляйте некоторыми функциями PHP, такими как system(), и ограничивайте разрешения для функций работы с файлами, но php.ini по умолчанию не открывает безопасный режим. Устарело с PHP5.4.0.
Домашний каталог исполняемых программ в безопасном режиме: Safe_mode_exec_dir=/var/www/html.
После использования безопасного режима system() и другие функции выполнения программ смогут выполнять программы в этом каталоге.
Отключить классы/функции:disable_classes=,disable_functions=opendir,readdir,scandir,fopen
Принимает имена функций, разделенные запятыми.
Установите загрузку и максимальный размер загружаемого файла: file_uploads=on upload_max_filesize=8M.
Временный каталог для загрузки файлов: upload_tmp_dir =
(Системный временный каталог/tmp, C:\Windows\Temp)
Ограничения доступа пользователей к каталогу: open_basedir = .:/tmp/
Как правило, вы можете настроить его только на доступ к каталогу веб-сайта, что означает, что доступ к текущему каталогу и каталогу /tmp/ разрешен.
Контроль сообщений об ошибках: display_error=On
Включено во время отладки должно быть закрыто после публикации сайта, чтобы избежать раскрытия информации.
Установите уровень сообщения об ошибках: error_reporting=E_ALL.
Функция заключается в установке максимального уровня ошибок и отображении всех проблем для облегчения их устранения.
Уровень журнала является константой и доступен в php.ini. Рекомендуется использовать E_ALL|E_STRICT.
Журнал ошибок:
error_log= Местоположение журнала ошибок, если оно не определено, по умолчанию оно будет записано в журнал ошибок веб-сервера.
log_errors = on рекомендует выводить журналы ошибок в файл, а не напрямую во внешний интерфейс.
log_errors_max_length = 1024 Максимальная длина информации, связанной с журналом ошибок, равна 0 для неограниченной длины.
Волшебные кавычки: устарели с PHP 5.3.0.
magic_quotes_gpc=On
magic_quotes_runtime=Off
Функция автоматически экранирует, что имеет тот же эффект, что и addslashes().
Разрешить ли открытие удаленных файлов:allow_url_fopen=on
Делает возможным доступ к объектам URL, таким как файлы.
Разрешить ли включение удаленных файлов:allow_url_include=off
Позволяет include, include_once, require, require_once и другим функциям использовать протокол инкапсуляции fopen в форме URL.
eval(), выполнить строку как код PHP
<?php
if(isset($_GET['wy'])){
$wy=$_GET['wy'];
eval("$wy;");
}
?>
Assert() определяет, является ли утверждение ЛОЖНЫМ, поскольку eval занесен в черный список, заменяет его утверждением;
<?php
if(isset($_GET['wy'])){
$wy=$_GET['wy'];
assert("$wy;");
}
?>
preg_replace(), которая используется для выполнения регулярных выражений. Прототип этой функции: смешанный preg_replace (смешанный шаблон, смешанная замена, смешанный субъект [, ограничение int]). Если при построении регулярного выражения используется модификатор /e, в это время preg_replace() выполнит параметр замены как PHP-код.
Первый режим:
<?php
echo $re = $_GET['re'];
$var = '<h1>phpinfo()</h1>';
preg_replace("/<h1>(.*?)$re", '\', $var);
?>
Второй режим:
<?php
preg_replace("/com/e",$_GET['re'],"www.baidu.com");
?>
Третий режим:
<?php
preg_replace("/\s*\[php\](.*?)\[\/php\]\s*/ies", "\", $_GET['re']);
?>
create_function(), создает анонимную функцию
call_user_func(), call_user_func_array(), функция обратного вызова
require()、include()、require_once()、include _once()
Он разделен на локальное включение файлов и удаленное включение файлов и может читать содержимое любого файла.
exec(): выполнить внешнюю программу
<?php
$cmd = $_GET['cmd'];
echo "<pre>";
echo exec($cmd);
echo "</pre>";
?>
passthru(): выполнить внешнюю программу и отобразить исходный результат.
<?php
$cmd = $_GET['cmd'];
echo "<pre>";
passthru($cmd);
echo "</pre>";
?>
proc_open(): выполнить команду и открыть указатель файла для ввода.
Shell_exec(): выполнить команду через среду оболочки и вернуть полный вывод в виде строки.
<?php
$cmd = $_GET['cmd'];
echo "<pre>";
echo shell_exec($cmd);
echo "</pre>";
?>
system(): выполнить внешнюю программу и отобразить результат
<?php
$cmd = $_GET['cmd'];
echo "<pre>";
system($cmd);
echo "</pre>";
?>
popen(): параметр popen() передает команду и выполняет ее для файла, открытого функцией popen().
<?php
$cmd = $_GET['cmd'];
echo "<pre>";
echo popen($cmd,'r');
echo "</pre>";
?>
«Обратные кавычки:
<?php
$cmd = $_GET['cmd'];
echo "<pre>";
echo `$cmd`;
echo "</pre>";
?>
копировать(): скопировать файл
file_get_contents(): прочитать весь файл как строку.
file_put_contents(): записывает строку в файл
file(): прочитать весь файл в массив
fopen(): открыть файл или URL-адрес
move_uploaded_file(): переместить загруженный файл в новое место.
readfile(): выходной файл
rename(): переименовать файл или каталог.
rmdir(): удалить каталог
unlink() & delete(): удалить файлы
Утечка информации: phpinfo()
Мягкая ссылка, чтение содержимого файла: symlink(), readlink()
Переменные среды: getenv(), putenv().
Загрузить расширение: dl(), загрузить расширение PHP указанной библиотеки параметров.
Используемые методы:ini_get(),ini_set(),ini_alter(),ini_restore().
Числовое определение: is_numeric(), только использование этой функции для оценки без использования преобразования intval() может привести к вторичному внедрению SQL, поскольку может быть вставлена шестнадцатеричная строка.
Связано с массивом: in_array(), проверяет, существует ли определенное значение в массиве.
Охват переменных: parse_str() анализирует строку в переменную и устанавливает ее в текущую область действия, в дополнение к Extract(), mb_parse_str(), import_request_variables()
Каталог столбца: glob(), используйте правила для фильтрации всех путей к файлам, соответствующих шаблону.
Получить информацию без параметров: get_defined_vars() возвращает многомерный массив, содержащий список всех определенных переменных, get_defined_constants() возвращает все текущие имена и значения определенных констант, get_defined_functions() возвращает многомерный массив, содержащий список всех определенных функций , get_included_files() возвращает все включенные имена файлов
echo(), print(): выходные данные обоих одинаковы: первый — это оператор PHP, а второй — функция.
print_r(): выходной массив
var_dump(): выведет дополнительные типы данных
debug_zval_dump(): аналогично предыдущему, разница в том, что добавляется счетчик ссылок для записи количества ссылок на переменную.
exit(): выйти из текущего выполнения программы.
Однострочный комментарий: //
Многострочные комментарии: /**/
Двойные кавычки анализируют переменные, но одинарные кавычки не анализируют переменные.
$str = "hello";
echo "$str";//Разбор двойных кавычек переменная
echo '$str';//Одинарные кавычки не анализируются
Список глобальных переменных, которыми пользователи могут манипулировать в php, выглядит следующим образом:
$GLOBALS: относится ко всем переменным, доступным в глобальной области видимости.
<?php
function test(){
echo $test="test2";
echo $GLOBALS['test'];
}
$test = "test1";
test();
?>
$_SERVER: информация о сервере и среде выполнения.
<?php
print_r($_SERVER);
?>
$_GET: переменная HTTP GET
<?php
print_r($_GET);
?>
$_POST: переменная HTTP POST.
<?php
print_r($_POST);
?>
$_FILES: переменная загрузки HTTP-файла.
<?php
print_r($_FILES);
?>
Форма:
<form action="test.php" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br/>
<input type="submit" name="submit" value="Submit" />
</form>
$_REQUEST: HTTP-запрос.
<?php
print_r($_REQUEST);
?>
GET:
POST:
$_SESSION: переменная сеанса.
<?php
$_SESSION['id']='sessionID';
print_r($_SESSION);
?>
$_ENV: переменная среды
<?php
print_r($_ENV);
?>
Вывод здесь представляет собой пустой массив:
Затем измените файл php.ini и добавьте E:
<?php
print_r($_ENV['']='test');
?>
$_COOKIE:HTTP Cookies
<?php
print_r($_COOKIE);
?>
Заявление об авторских правах: Содержание этой статьи добровольно предоставлено пользователями Интернета, а мнения, выраженные в этой статье, представляют собой только точку зрения автора. Данный сайт лишь предоставляет услуги по хранению информации, не имеет никаких прав собственности и не несет соответствующей юридической ответственности. Если вы обнаружите на этом сайте какое-либо подозрительное нарушение авторских прав/незаконный контент, отправьте электронное письмо, чтобы сообщить. После проверки этот сайт будет немедленно удален.
Издатель: Лидер стека программистов полного стека, укажите источник для перепечатки: https://javaforall.cn/186719.html Исходная ссылка: https://javaforall.cn