Обхід багатопрохідних фільтрів

22:45 17.05.2008

Розповім вам про обхід багатопрохідних фільтрів (multi-pass filters bypass). У випадку коли на веб сайті використовується комплексна (багатопрохідна) система фільтрації, зокрема для фільтрації XSS, можливий обхід багатопрохідних фільтрів. Подібні багатопрохідні системи фільтрації можуть використовуватися на великих порталах та соціальних мережах.

Існує одна техніка обходу багатопрохідних фільтрів, що була розроблена мною в 2007 році. Техніка обходу фільтрів з використанням пробілу. Я назвав її технікою спейс-хакінгу (space-hack technique). Про неї я писав під час Місяця багів в MySpace.

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

Розглянемо наступні приклади.

1. Код для обходу багатопрохідних фільтрів:

<p/style="xss:e xpression(alert(document.cookie))">

На першій стадії фільтр перевіряє на наявність XSS кода: перевіряється наявність ключевих слів, в тому числі й “expression”. Враховуючи, що в даному випадку використовується “e xpression”, то ключевих слів не знаходиться і даний рядок проходить фільтр.

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

<p/style="xss:expression(alert(document.cookie))">

Зазначу, що враховуючи другу стадію, я використовав “<p/style”, а не “<p style”, щоб зробити код робочим після проходження фільтрів (бо пробіли витираються на другій стадії фільтрації).

2. Код для обходу багатопрохідних фільтрів:

<img/width="100"src="http://site/image.jpg"o nLoad="alert(document.cookie)">

На першій стадії фільтр перевіряє на наявність XSS кода: враховуючи, що в даному випадку використовується “o nLoad”, то ключевих слів не знаходиться і даний рядок проходить фільтр.

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

<img/width="100"src="http://site/image.jpg"onLoad="alert(document.cookie)">

Як я вже зазначав, враховуючи другу стадію, в якості роздільника між ім’ям тега та його властивістю я використав “/”, тобто використав запис “<img/width”. Для того щоб зробити код робочим після проходження фільтрів.

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


4 відповідей на “Обхід багатопрохідних фільтрів”

  1. trovich каже:

    Гм. А ще один прохід зробити, нє?

  2. MustLive каже:

    Там потрібно не ще один прохід, а порядок проходів зробити інший.

    Бо якщо в тебе вже відбувся прохід фільтра, де ти перевірив на XSS код, то потім після проходу з видаленням пробілів, ще раз запускати перевірку на XSS мало хто буде (бо це неоптимальне витрачання ресурсів комп’ютера). Розробники фільтрів даних за звичай фільтрують “атакуючий код” на одному проході, частіше всього на початку. І в подальшому (коли використовується складний багатопрохідний фільтр) вже не перевіряють дані на “атакуючий код”. Що і може бути використане для обходу фільтрів ;-) .

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

  3. trovich каже:

    Ось ще, господині на замітку: http://timmeh.us/filtered.html
    Тобі навряд чи це не відомо, але можу комусь із читачів стане у пригоді.

  4. MustLive каже:

    Так, цікавий перелік фільтрів на MySpace. Який буде корисним для читачів, що цікавляться даною темою.

Leave a Reply

You must be logged in to post a comment.