Самый Распространенный Шаблон Sql-Инъекции В Php — Бесполезное Экранирование Символов.

В силу характера моей работы мне приходится проводить аудит безопасности исходного кода веб-приложений.

Множество веб-приложений и много кода.

В этой статье я хотел бы поделиться одной простой (очень простой) истиной и статистикой, которую я вывел и проверял много раз за последние три года, просматривая тонны 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 #информационная безопасность

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.