В силу характера моей работы мне приходится проводить аудит безопасности исходного кода веб-приложений.
Множество веб-приложений и много кода.
В этой статье я хотел бы поделиться одной простой (очень простой) истиной и статистикой, которую я вывел и проверял много раз за последние три года, просматривая тонны PHP-кода.
Ни для кого не секрет, что уязвимости SQL-инъекций являются наиболее распространенными из всех уязвимостей веб-приложений на стороне сервера.
Есть платформы и фреймворки, где такие вещи почти полностью исключены, например ORM и так далее.
Но статистика упорно говорит нам об абсолютном преобладании в Интернете веб-приложений с простыми каскадными SQL-запросами.
Кроме того, бывают случаи, когда ORM вообще невозможно применить.
Например, когда от пользовательских данных должны зависеть не только параметры выражения, но и сама логика запроса на уровне оператора.
Итак, начнем.
Бесполезный побег персонажа
Встречается в 83% веб-приложений PHP, уязвимых для SQL-инъекций.Использование escape-функции для таких символов, как mysql_escape_string mysql_real_escape_string добавляет косую черту без кавычек.
Чаще всего это проявляется в числовых параметрах (всякие *_id).
Пример $sql = "SELECT user FROM userslist WHERE userid=".
mysql_real_escape_string($_GET['uid']);
Кажется, что это безопасный код, но только на первый взгляд. Сюда закралась самая распространенная в моей практике схема SQL-инъекций в PHP. Чтобы атаковать эту уязвимость, злоумышленнику просто необходимо избегать использования символов " ' \x00 \r \n \x1a в векторе атаки.
Например: /index.phpЭuid=-777 UNION SELECT password FROM userlist
Искать в коде
Сложный по семантике язык.
Для простого поиска вы можете использовать egrep: egrep -Rin "(select|update|insert|delete|replace).
*(from|set|into).
*(mysql_escape_string|mysql_real_escape_string|addslashes)" .
| grep -v "[\"']['\"]"
Логика поискового выражения следующая: найти все строки, в которых нет последовательности символов кавычек («'», «», «', '») слева от функций фильтрации.
Метод, конечно, далеко не 100%, но требовать регулярного выражения для выполнения семантического анализа невозможно.
Чтобы было удобнее отображать информацию, можно выделить функцию цветом в консоли: egrep -Rin "(select|update|insert|delete|replace).
*(from|set|into).
*(mysql_escape_string|mysql_real_escape_string|addslashes)" .
| grep -v "[\"']['\"]" | egrep --color "(mysql_escape_string|mysql_real_escape_string|addslashes)"
Чтобы защититься от этой уязвимости с подстановочными знаками, лучше всего использовать приведение типов.
Это всегда работает быстрее и надежнее всяких фильтров и отсеиваний.
Для примера выше патч может быть таким: $sql = "SELECT user FROM userslist WHERE userid=".
intval($_GET['uid']);
На этом короткое эссе заканчивается.
Я призываю всех веб-разработчиков попытаться проверить свои источники подобных проектов.
А еще лучше расширить данный скрипт поиска людей.
Теги: #безопасность веб-приложений #sql-инъекция #sql-инъекция #php #php безопасность #аудит безопасности #ONsec #информационная безопасность
-
Успешное Управление Несколькими Блогами
19 Oct, 24 -
Ma.gnolia Реализует Защиту От Спама
19 Oct, 24