2.4 Testing for Insecure Direct Object References
Суть вразливості:
Небезпечні прямі посилання на об'єкти виникають, коли програма надає прямий доступ до об'єктів на основі введення користувача. Внаслідок цієї вразливості зловмисники можуть обійти авторизацію та отримати доступ до ресурсів безпосередньо, змінивши значення параметра в урлі. Такі ресурси можуть бути записами бази даних, що належать іншим користувачам, файлами і т. д. Це викликано тим, що програма приймає дані, що вводяться користувачем, і використовує їх для вилучення даних без виконання достатніх перевірок авторизації.
Як протестувати
Щоб перевірити цю вразливість, тестер спочатку необхідно дізнатися всі місця в додатку, де користувач може змінювати параметр в урлі і потрапляти туди на пряму. Дізнавшись урли з параметром, тестувальник повинен змінити значення параметра, і переконатися чи є доступ на об'єкти, які належать іншим користувачам, а також переконатися, що можна обійти авторизацію таким способом, запитавши посилання на пряму в браузері.
Найкращим способом перевірки прямих посилань на об'єкти є наявність як мінімум двох (можна і більше) користувачів для роботи з різними об'єктами і функціями, що належать. Наприклад, два користувача, кожен з яких має доступ до різних об'єктів (таких як інфо про купівлю, особисті повідомлення, карткові дані тощо), і можна взяти ще користувачів з різними привілеями (наприклад, адміністраторів тощо). Зібравши список користувачів та його привілеїв, легко дивитися чи є доступ в одних користувачів із слабкими привілеями на функції інших користувачів із великими привілеями. Маючи кілька користувачів, тестер заощаджує цінний час на вгадуванні різних імен об'єктів, оскільки він може спробувати отримати доступ до об'єктів, що належать іншому користувачеві.
Приклади: Випадок, коли значення параметра використовується для отримання запису з бази даних
Приклад запиту: http://foo.bar/somepage?invoice=12345
У цьому випадку значення параметра invoice використовується як індекс у таблиці рахунків у базі даних. Додаток приймає значення цього параметра та використовує його у запиті до бази даних. Потім програма повертає рахунок з інформацією для користувача. Оскільки значення invoice входить безпосередньо в запит, змінивши значення параметра, можна отримати будь-який інший рахунок, незалежно залежності від користувача. Для перевірки в цьому випадку тестер повинен отримати ідентифікатор рахунку, що належить іншому користувачу, що тестується (попередньо знаючи, що цей користувач не повинен мати до нього доступ), а потім перевірте, чи можливий доступ до об'єктів без авторизації.
Випадок, коли значення параметра використовується безпосередньо для виконання операції у системі
Приклад запиту: http://foo.bar/changepassword?user=someuser
У цьому випадку значення параметра user використовується, щоб повідомити додаток, для якого користувача слід змінити пароль. На першому етапі програма отримає запит із зазначенням пароля користувача, який має бути змінено, і на наступному кроці користувач надасть новий пароль (не запитуючи поточний).
Параметр user використовується для прямого посилання на об'єкт користувача, для якого виконуватиметься операція зміни пароля. Щоб перевірити цей випадок, тестувальник повинен спробувати надати інше тестове ім'я користувача, відмінне від поточного. увійти до системи та перевірити, чи можна змінити пароль іншого користувача. Випадок, коли значення параметра використовується для отримання ресурсу файлової системи
Приклад запиту: http://foo.bar/showImage?img=img00011
У цьому випадку значення параметра файлу використовується, щоб повідомити програму, який файл користувач бажає отримати. За замінивши ім'я або ідентифікатор на інший (наприклад, file = image00012.jpg), зловмисник зможе отримати об'єкти, що належать іншим користувачам. Щоб перевірити цей випадок, тестувальник повинен отримати посилання, до якого користувач не повинен мати доступ, і спробувати отримати доступ до нього, використовуючи значення параметра файлу. Примітка. Ця вразливість часто використовується разом із вразливістю обходу каталогу/шляху (Testing Directory Traversal File Include)
Випадок, коли значення параметра використовується для доступу до функцій програми
Приклад запиту: http://foo.bar/accessPage?menuitem=12
У цьому випадку значення параметра menuitem використовується, щоб повідомити програму, до якого пункту меню (і, отже, якої функціональності програми), користувач намагається отримати доступ. Припустимо, що доступ для користувача має бути обмежений. Але змінюючи значення параметра menuitem, можна обійти авторизацію та отримати доступ до додаткових функцій програми. Щоб перевірити цей випадок, тестер визначає місце, де функціональність програми визначається посиланням на пункт меню, щоб надалі перевірити чи може тестовий користувач отримати доступ, а потім далі перебирати привілейний функціонал, намагаючись знайти недогляд.
У наведених прикладах досить модифікації одного параметра. Однак, іноді посилання на об'єкт можуть бути розділені між більш ніж одним параметром, і тестування слід відповідним чином скоригувати.