аудит исходного кода PHP_статический аудит кода
аудит исходного кода PHP_статический аудит кода

Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.

В настоящее время я изучаю аудит PHP-кода, поэтому разберу все свои учебные записи~

Предварительная подготовка:

Конечно, самым основным условием является хотя бы примерное изучение синтаксиса PHP.

1. Установите соответствующее программное обеспечение, такое как Sublime text, Notepad++, editplus, систему аудита исходного кода Seay и т. д.

2. Получите исходный код и загрузите исходный код различных веб-сайтов в Интернете.

3. Установите сайт

Метод аудита:

Прочитать весь текст: Трудно, но подробно

Метод обратного отслеживания параметров чувствительной функции: эффективная и широко используемая система аудита исходного кода Seay

Метод целевого функционального анализа: в основном аудит на основе бизнес-логики программы. Сначала используйте браузер для доступа по одному, чтобы увидеть, какие функции есть в программе, и порассуждайте о возможных уязвимостях на основе соответствующих функций.

Основной процесс аудита:

1. Общее понимание

2. Провести аудит по каждой функции по методу направленной функции.

3. Метод обратного отслеживания параметров чувствительной функции

Общее понимание:

1. Структура сайта:

Просмотрите папку с исходным кодом, чтобы получить примерное представление о каталоге программы.

администратор: каталог фонового управления

install: каталог установки веб-сайта, где install.sql — это структурная информация базы данных.

sys: в этом каталоге обычно хранятся файлы с информацией о конфигурации и общедоступные библиотеки функций, которыми являются config.php и lib.php соответственно.

пользователь: здесь записываются некоторые операции пользователя, такие как регистрация пользователя и т. д.

index.php: Обычно это файл домашней страницы веб-страницы, это также прорывная точка для аудита.

2. Входной файл:

Файлы index.php и admin.php обычно являются входом ко всей программе. С помощью индексного файла вы можете узнать архитектуру программы, запущенный процесс, какие файлы конфигурации, файлы фильтров и файлы фильтров безопасности она содержит, а также понять бизнес. логика программы.

3. Файл конфигурации:

Обычно файлы, подобные config.php, сохраняют некоторую информацию, связанную с базой данных, и некоторую информацию о программе. Сначала посмотрите на кодировку базы данных. Если это gbk, возможно, происходит внедрение широких байтов; если значение переменной заключено в двойные кавычки, может возникнуть проблема с выполнением кода анализа двойных кавычек.

4. Функция фильтра:

Через файлы общедоступных функций и файлы фильтров безопасности мы можем видеть, какие данные, вводимые пользователем, фильтруются, а какие не фильтруются, где и как фильтруются, можно ли обойти отфильтрованные данные, является ли метод фильтрации замещающим или обычным. , есть ли GPC и используется ли обработка addslasher() и т. д.

Распространенные функциональные ошибки:

Уязвимость начальной установки программы

Утечка информации о сайте

Управление загрузкой файлов

Уязвимости аутентификации при входе и управления разрешениями

Уязвимость резервного копирования базы данных

Уязвимости кода проверки и т. д.

Условия образования уязвимости:

1. Контролируемые переменные (все факторы вредны)

2. Переменная достигает ценной функции (опасной функции).

Суть аудита кода: поиск лазеек фактически эквивалентен поиску соответствующих переменных и функций.

Процесс отслеживания переменных:

Прямая трассировка — поиск функций через переменные

Обратная трассировка — поиск переменных через функции

Общие конфигурации INI:

1.php INI-файл:

Файл конфигурации PHP обычно представляет собой файл php.ini.

Файл php.ini должен называться «php.ini» и располагаться в каталоге, указанном директивой PHPiniDir в httpd.conf. Его можно просмотреть с помощью функции phpinfo().

Как правило, его необходимо настроить, чтобы сделать среду более безопасной.

2. Конфигурационный файл:

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.

Общие опасные функции и специальные функции:

1. Функция выполнения PHP-кода:

eval(), выполнить строку как код PHP

Язык кода:javascript
копировать
<?php
if(isset($_GET['wy'])){
	$wy=$_GET['wy'];
	eval("$wy;");
}
?>

Assert() определяет, является ли утверждение ЛОЖНЫМ, поскольку eval занесен в черный список, заменяет его утверждением;

Язык кода:javascript
копировать
<?php
if(isset($_GET['wy'])){
	$wy=$_GET['wy'];
	assert("$wy;");
}
?>

preg_replace(), которая используется для выполнения регулярных выражений. Прототип этой функции: смешанный preg_replace (смешанный шаблон, смешанная замена, смешанный субъект [, ограничение int]). Если при построении регулярного выражения используется модификатор /e, в это время preg_replace() выполнит параметр замены как PHP-код.

Первый режим:

Язык кода:javascript
копировать
<?php
echo $re = $_GET['re'];
$var = '<h1>phpinfo()</h1>';
preg_replace("/<h1>(.*?)$re", '\', $var);
?>

Второй режим:

Язык кода:javascript
копировать
<?php
preg_replace("/com/e",$_GET['re'],"www.baidu.com");
?>

Третий режим:

Язык кода:javascript
копировать
<?php
preg_replace("/\s*\[php\](.*?)\[\/php\]\s*/ies", "\", $_GET['re']);
?>

create_function(), создает анонимную функцию

call_user_func(), call_user_func_array(), функция обратного вызова

2. Содержит функции:

require()、include()、require_once()、include _once()

Он разделен на локальное включение файлов и удаленное включение файлов и может читать содержимое любого файла.

3. Функция выполнения команды:

exec(): выполнить внешнюю программу

Язык кода:javascript
копировать
<?php
$cmd = $_GET['cmd'];
echo "<pre>";
echo exec($cmd);
echo "</pre>";
?>

passthru(): выполнить внешнюю программу и отобразить исходный результат.

Язык кода:javascript
копировать
<?php
$cmd = $_GET['cmd'];
echo "<pre>";
passthru($cmd);
echo "</pre>";
?>

proc_open(): выполнить команду и открыть указатель файла для ввода.

Shell_exec(): выполнить команду через среду оболочки и вернуть полный вывод в виде строки.

Язык кода:javascript
копировать
<?php
$cmd = $_GET['cmd'];
echo "<pre>";
echo shell_exec($cmd);
echo "</pre>";
?>

system(): выполнить внешнюю программу и отобразить результат

Язык кода:javascript
копировать
<?php
$cmd = $_GET['cmd'];
echo "<pre>";
system($cmd);
echo "</pre>";
?>

popen(): параметр popen() передает команду и выполняет ее для файла, открытого функцией popen().

Язык кода:javascript
копировать
<?php
$cmd = $_GET['cmd'];
echo "<pre>";
echo popen($cmd,'r');
echo "</pre>";
?>

«Обратные кавычки:

Язык кода:javascript
копировать
<?php
$cmd = $_GET['cmd'];
echo "<pre>";
echo `$cmd`;
echo "</pre>";
?>

4. Функция работы с файлами:

копировать(): скопировать файл

file_get_contents(): прочитать весь файл как строку.

file_put_contents(): записывает строку в файл

file(): прочитать весь файл в массив

fopen(): открыть файл или URL-адрес

move_uploaded_file(): переместить загруженный файл в новое место.

readfile(): выходной файл

rename(): переименовать файл или каталог.

rmdir(): удалить каталог

unlink() & delete(): удалить файлы

5. Специальные функции:

Утечка информации: 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(): выйти из текущего выполнения программы.

Однострочный комментарий: //

Многострочные комментарии: /**/

Разница между одинарными и двойными кавычками:

Двойные кавычки анализируют переменные, но одинарные кавычки не анализируют переменные.

Язык кода:javascript
копировать
$str = "hello";
echo "$str";//Разбор двойных кавычек переменная
echo '$str';//Одинарные кавычки не анализируются

Суперглобальные переменные:

Список глобальных переменных, которыми пользователи могут манипулировать в php, выглядит следующим образом:

$GLOBALS: относится ко всем переменным, доступным в глобальной области видимости.

Язык кода:javascript
копировать
<?php
function test(){
 echo $test="test2";
	echo $GLOBALS['test'];
}
$test = "test1";
test();
?>

$_SERVER: информация о сервере и среде выполнения.

Язык кода:javascript
копировать
<?php
print_r($_SERVER);
?>

$_GET: переменная HTTP GET

Язык кода:javascript
копировать
<?php
print_r($_GET);
?>

$_POST: переменная HTTP POST.

Язык кода:javascript
копировать
<?php
print_r($_POST);
?>

$_FILES: переменная загрузки HTTP-файла.

Язык кода:javascript
копировать
<?php
print_r($_FILES);
?>

Форма:

Язык кода:javascript
копировать
<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-запрос.

Язык кода:javascript
копировать
<?php
print_r($_REQUEST);
?>

GET:

POST:

$_SESSION: переменная сеанса.

Язык кода:javascript
копировать
<?php
$_SESSION['id']='sessionID';
print_r($_SESSION);
?>

$_ENV: переменная среды

Язык кода:javascript
копировать
<?php
print_r($_ENV);
?>

Вывод здесь представляет собой пустой массив:

Затем измените файл php.ini и добавьте E:

Язык кода:javascript
копировать
<?php
print_r($_ENV['']='test');
?>

$_COOKIE:HTTP Cookies

Язык кода:javascript
копировать
<?php
print_r($_COOKIE);
?>

Заявление об авторских правах: Содержание этой статьи добровольно предоставлено пользователями Интернета, а мнения, выраженные в этой статье, представляют собой только точку зрения автора. Данный сайт лишь предоставляет услуги по хранению информации, не имеет никаких прав собственности и не несет соответствующей юридической ответственности. Если вы обнаружите на этом сайте какое-либо подозрительное нарушение авторских прав/незаконный контент, отправьте электронное письмо, чтобы сообщить. После проверки этот сайт будет немедленно удален.

Издатель: Лидер стека программистов полного стека, укажите источник для перепечатки: https://javaforall.cn/186719.html Исходная ссылка: https://javaforall.cn

boy illustration
Интервью с Alibaba по Java: можно ли использовать @Transactional и @Async вместе?
boy illustration
Облачный шлюз Spring реализует примеры балансировки нагрузки и проверки входа в систему.
boy illustration
Используйте Nginx для решения междоменных проблем
boy illustration
Произошла ошибка, когда сервер веб-сайта установил соединение с базой данных. WordPress предложил решение проблемы с установкой соединения с базой данных... [Легко понять]
boy illustration
Новый адрес java-библиотеки_16 топовых Java-проектов с открытым исходным кодом, достойных вашего внимания! Обязательно к просмотру новичкам
boy illustration
Лучшие практики Kubernetes для устранения несоответствий часовых поясов внутри контейнеров
boy illustration
Введение в проект удаления водяных знаков из коротких видео на GitHub Douyin_TikTok_Download_API
boy illustration
Весенние аннотации: подробное объяснение @Service!
boy illustration
Пожалуйста, не используйте foreach для пакетной вставки в MyBatis. Для 5000 фрагментов данных потребовалось 14 минут. .
boy illustration
Как создать проект Node.js с помощью npm?
boy illustration
Mybatis-plus использует typeHandler для преобразования объединенных строк String в списки списков.
boy illustration
Не удалось установить программное обеспечение Mitsubishi. Возможно, возникла проблема с реестром.
boy illustration
Разрешение ошибок проекта SpringBoot 3 mybatis-plus: org.apache.ibatis.binding.BindingException: неверный оператор привязки
boy illustration
Более краткая проверка параметров. Для проверки параметров используйте SpringBoot Validation.
boy illustration
Поиграйтесь с интеграцией Spring Boot (платформа запланированных задач Quartz)
boy illustration
Несколько популярных режимов интерфейса API: RESTful, GraphQL, gRPC, WebSocket, Webhook.
boy illustration
Redis: практика публикации (pub) и подписки (sub)
boy illustration
Подробное объяснение пакета Golang Context
boy illustration
Краткое руководство: создайте свое первое приложение .NET Aspire
boy illustration
Краткое обсуждение метода пакетной вставки MyBatis: обработка 100 000 фрагментов данных занимает всего 2 секунды.
boy illustration
[Инструмент] Используйте nvm для управления переключением версий nodejs, это так здорово!
boy illustration
HTML можно преобразовать в word_html для отображения текстовых документов.
boy illustration
Статья Spring Security 6.x для быстрого понимания принципов настройки
boy illustration
Не забудьте изменить имя каждого модуля RUOYI один раз, чтобы избежать мошенничества ~~~
boy illustration
Научите вас шаг за шагом, как интегрировать систему обслуживания клиентов Hunyuan AI Q&A от 0 до 1.
boy illustration
Подробное объяснение Gzip: принципы и применение алгоритмов сжатия.
boy illustration
Скачать Tomcat - ссылка для скачивания на официальном сайте tomcat7, tomcat8, tomcat9
boy illustration
Развертывание IIS.NetCore
boy illustration
[Оптимизация памяти Android] Общие функции инструмента Android Profiler (мониторинг памяти | снимок памяти)
boy illustration
Встроенная в Springboot пользовательская конфигурация временного каталога, связанного с Tomcat.