стрілка вверх

безпека скрипту, повідомлення про помилки

Безпека. Звіт про помилки.

березень 2016

Стаття за ресурсом php.net Error Reporting.


Зворотні повідомлення про помилку роботи скрипту мають дві сторони в контексті питання безпеки. З однієї сторони повідомлення корисні, а з іншої небезпечні.

Зазвичай злочинець посилає некоректні дані та аналізує результат поданих запитів та завдяки інформації, що повернулась зі сторони сервера, робиться аналіз стосовно вразливостей скриптів.

Наприклад, якщо зловмисник має деяку інформацію стосовно сторінки, що має форму, то він може спробувати відправити до сервера дещо модифіковані змінні:


Example #1 Підробка змінних HTML-сторінки

<form method="post" action="attacktarget?username=badfoo&amp;password=badfoo">
<input type="hidden" name="username" value="badfoo" />
<input type="hidden" name="password" value="badfoo" />
</form>


Помилки виконання PHP-скрипту корисні для розробника, це дає змогу побачити місце некоректного виконання скрипту, наприклад, яка функція не виконується та номер рядка, де сталась помилка.

Вся наявна інформація повідомленнь може бути використана для аналізу вразливостей скрипту. Досить часто php-розробники використовують show_source(), highlight_string(), чи highlight_file() для покращення роботи скрипту, проте ці функції можуть показати приховані дані, неправильний синтаксис та іншу небезпечну інформацію.

Особливо можуть бути небезпечними засоби чи техніки, що призначені саме для виправлення помилок роботи скрипту, за умови, якщо зловмиснику стане відомо джерело чи код цих засобів. Дізнатись про ваші техніки він зможе застосовуючи техніку - "brute-force", тобто відправляючи до серверу різні варіанти даних.

Brute force – метод грубої сили, а в даному випадку – це прямий перебір можливих значень змінних.



Приклад #2 Застосування різних змінних

<form method="post" action="attacktarget?errors=Y&amp;showerrors=1&amp;debug=1">
<input type="hidden" name="errors" value="Y" />
<input type="hidden" name="showerrors" value="1" />
<input type="hidden" name="debug" value="1" />
</form>


Незважаючи на методи обробки повідомлень про помилки, поведінка системи вцілому надає зловмиснику додаткову інформацію.

Наприклад, стиль повідомлення про помилку вказує, що система обробляється за допомогою PHP.

Знаючи, що система побудована із застосуванням PHP-скриптів, зловмисник може спробувати дослідити бек-енд роботи скрипту певної html-сторінки, враховуючи недоліки саме мови PHP.

Повідомлення про неправильне виконання якої-небудь функції може підказати, наприклад, що за тип Бази Даних використовується, а більш глибший аналіз зможе навіть підказати загальний алгоритм обробки вхідних даних та визначення слабких місць даної веб-сторінки. Відправляючи некоректні дані, можна визначити порядок обробки даних (визначаючи номер рядка скрипту, що видає помилку) та, досліджуючи ваш скрипт, застосувати експлойт до певної частини php-обробника.

Експлойт (від англ. exploit — експлуатувати) — це комп'ютерна програма, фрагмент програмного коду або послідовність команд, що використовують вразливості в програмному забезпеченні та призначені для проведення атаки на обчислювальну систему. Метою атаки може бути як захоплення контролю над системою (підвищення привілеїв), так і порушення її функціонування (DoS-атака).


Помилки також можуть видати інформацію про дозвіл веб-серверу, та побудову файлової системи на сервері.

Написаний помилковий код може привести до видачі зловмиснику "прихованої" від користувачів інформації.


Існує три основних напрямки підвищення безпеки.

По-перше, уважно розгляньте роботу всіх використаних функцій, та спробуйте мінімізувати можливі помилки.

По-друге, відключити звіти про помилки по завершенні роботи над скриптом.

По-третє, застосовуйте власний обробник помилок роботи скрипту.

Залежно від ваших особистих вимог до питань безпеки можна застосувати вказані вище поради.


Один із способів забезпечення безпеки власного php-скрипту це налаштувати власний PHP error_reporting(), що допоможе захистити ваш код та інші дані від зловмисних намірів.

Перед остаточним завершенням роботи над вашим скриптом вам варто протестувати власний код, застосовуючи параметр повідомлень E_ALL, таким чином ви досить швидко можете визначити, які з ваших даних можуть бути відкриті та піддаватись модифікаціям.

По завершенні роботи над вашим скриптом, вам необхідно відключити повідомлення про помилки error_reporting() встановленням значення в 0 або іншим чином за допомогою php.ini та опції display_errors встановивши значення off,- ці заходи унеможливюють випробування/тестування вашого коду.

Якщо вам все ж необхідно виконати перелічені заходи дещо пізніше, то бажано переглядати звіти порушень через лог-файл, застосувавши ini директиву error_log та встановивши значення on.



Приклад #3 Пошук небезпечних змінних за допомогою E_ALL

<?php
if ( $username ) {   // Не перевірено перед використанням
    
$good_login  1 ;
}
if (
$good_login  ==  1) {  // Якщо перевірка не пройдена
    
readfile ( "/highly/sensitive/data/index.html" );
}
?>



Стаття за ресурсом php.net Error Reporting.