Как выполнить проверку исходного кода для поиска уязвимостей в веб-приложениях
Просмотр кода, вероятно, лучший способ найти уязвимости в веб-приложении. Это намного быстрее, чем тестирование методом черного ящика, и помогает научиться безопасно программировать в будущем, наблюдая за ошибками других. Если вас интересует программное обеспечение с открытым исходным кодом, аудит кода также является отличным способом присоединиться к сообществу разработчиков открытого исходного кода и помочь защитить инструменты, которые вам нравятся.
Вот несколько приемов, которые я узнал в процессе более эффективного аудита исходного кода. Дайте мне знать, если у вас есть дополнительные советы по проведению обзора исходного кода.
Как искать ошибки
Есть несколько способов найти уязвимости в исходном коде. В зависимости от того, насколько тщательным вы хотите быть, вот несколько подходов, которые вы можете предпринять.
"Я возьму то, что смогу"
Подход «Я возьму то, что смогу» отлично работает, если вам не требуется обширное тестирование. Это может быть связано с тем, что у вас очень ограниченное время для аудита приложения, или потому, что вы охотник за ошибками, который хочет максимизировать свои ошибки, чтобы вовремя окупить инвестиции. Эти методы работают быстро и часто приводят к обнаружению некоторых из самых серьезных уязвимостей.
- Используйте Grep
Вы можете использовать grep для определенных функций, строк, ключевых слов и шаблонов кодирования, которые известны как опасные. Примеры включают input () в Python и eval () в PHP. Это самый быстрый подход, который часто может привести к критическим выводам. Сосредоточьтесь на поиске опасных функций, используемых для данных, контролируемых пользователем, а также на жестко заданных учетных данных.
2. Последние исправления и исправления
Вы также можете ознакомиться с последними исправлениями кода и исправлениями безопасности. Недавнее изменение кода не прошло проверку временем и, скорее всего, содержит ошибки. Посмотрите на реализованные механизмы защиты и посмотрите, сможете ли вы их обойти. Найдите зависимости программы и посмотрите, не устарели ли какие-либо из них.
«Спрей от насекомых»
Если у вас есть больше времени, вы можете дополнить описанные выше методы более подробным обзором исходного кода. Однако вместо того, чтобы читать всю базу кода построчно, вот несколько стратегий, которые вы можете предпринять, чтобы максимизировать свою эффективность.
- Сначала важные функции
При чтении исходного кода сосредоточьтесь на важных функциях, таких как аутентификация, сброс пароля, действия по изменению состояния и чтение конфиденциальной информации. (Что является наиболее важным, зависит от приложения.) Затем просмотрите, как эти компоненты взаимодействуют с другими функциями. Наконец, проверьте другие менее важные части приложения.
2. Следуйте действиям пользователя
Другой подход - следовать коду, обрабатывающему ввод пользователя. Вводимые пользователем данные, такие как параметры HTTP-запроса, HTTP-заголовки, пути HTTP-запроса, записи в базе данных, чтение и выгрузка файлов, предоставляют злоумышленникам точки входа для использования уязвимостей приложения. Это может помочь найти распространенные уязвимости, такие как сохраненные XSS, SQL-инъекции, загрузки оболочки и XXE.
Сосредоточение внимания на областях кода, связанных с вводом данных пользователем, станет хорошей отправной точкой для анализа потенциальных опасностей. Затем просмотрите, как вводимые пользователем данные обрабатываются, сохраняются или передаются. Наконец, посмотрите, используют ли другие части приложения ранее обработанный пользовательский ввод. Вы можете обнаружить, что один и тот же пользовательский ввод по-разному взаимодействует с другими компонентами приложения.
Что искать
Теперь, когда мы знаем, как искать ошибки в исходном коде, что именно мы ищем? Хотя проверка исходного кода может потенциально выявить большинство уязвимостей, скрывающихся в приложении, некоторые из них найти легче, чем другие.
Помимо поиска всех распространенных уязвимостей, которые могут быть использованы злоумышленником, вам также следует сосредоточить внимание на критических ошибках, которые трудно обнаружить другими методами (например, пен-тестированием или вознаграждением за обнаружение ошибок).
- Жестко закодированные секреты и учетные данные: жестко закодированные секреты, такие как ключи API, ключи шифрования и пароли баз данных, могут быть легко обнаружены во время проверки исходного кода. Вы можете выполнить поиск с помощью grep по ключевым словам, таким как «ключ», «секрет», «пароль», «шифрование» или по регулярному выражению, для поиска строк в шестнадцатеричном формате или base64 (в зависимости от используемого формата ключа).
- Использование опасных функций и устаревших зависимостей. Неконтролируемое использование опасных функций и устаревшие зависимости являются огромным источником ошибок. Grep для конкретных функций для используемого вами языка и поиск по списку версий зависимостей, чтобы увидеть, не устарели ли они.
- Комментарии разработчиков, скрытые функции отладки, файлы конфигурации и каталог .git: это вещи, о которых разработчики часто забывают и оставляют приложение в опасном состоянии. Комментарии разработчиков могут указывать на очевидные ошибки программирования, скрытые функции отладки часто приводят к эскалации привилегий, файлы конфигурации позволяют злоумышленникам собирать дополнительную информацию о вашей инфраструктуре и, наконец, открытый каталог .git позволяет злоумышленникам восстанавливать ваш исходный код.
- Скрытые пути, устаревшие конечные точки и конечные точки в разработке: это конечные точки, с которыми пользователи могут не столкнуться при обычном использовании приложения. Но если они работают и обнаруживаются злоумышленником, это может привести к таким уязвимостям, как обход аутентификации и утечка конфиденциальной информации, в зависимости от открытой конечной точки.
- Слабая криптография или алгоритмы хеширования: это проблема, которую трудно обнаружить во время теста черного ящика, но ее легко обнаружить при просмотре исходного кода. Ищите такие проблемы, как слабые ключи шифрования, взламываемые алгоритмы шифрования и слабые алгоритмы хеширования. Grep для таких терминов, как ECB, MD4 и MD5.
- Отсутствие проверок безопасности для ввода данных пользователем и надежности регулярного выражения. Просмотр исходного кода - отличный способ узнать, какие проверки безопасности отсутствуют. Прочтите документацию по приложению и протестируйте все крайние случаи, о которых вы только можете подумать. Отличный источник информации о том, какие крайние случаи вам следует рассмотреть, - PayloadsAllTheThings.
- Отсутствующие флаги файлов cookie. Обратите внимание на отсутствие флагов файлов cookie, таких как httpOnly и secure.
- Неожиданное поведение, условные выражения, излишне сложные и подробные функции. Кроме того, обратите особое внимание на неожиданное поведение, условные выражения и сложные функции приложения. В этих местах часто обнаруживаются малоизвестные ошибки.
Как всегда, спасибо за чтение! Если у вас есть дополнительные советы по проведению обзора исходного кода, не стесняйтесь комментировать или дайте мне знать в Twitter.