Для справки: addslashes добавляет экранирующий символ (то есть слэш «/»)
перед символами одинарных (0x27) и двойных (0x22) кавычек, бэкслэшем
(0x5c) и перед null-байтом (0x00). Таким образом, данное экранирование
лишает взломщика возможности провести инъекцию.
Но в определенных ситуациях мы можем обойти эту функцию. В каких? Когда при взаимодействии с базой данных используются мультибайтовые кодировки — SJIS, BIG5, GBK, CP932. Возможны и другие, но точно не UTF. Могут быть дополнительные ограничения в виде MySQL 4.1.х-4.1.20, 5.0.x-5.0.22 и PHP < 5.2.5 Как видишь, спектр возможных целей сужается, но все же стоит об этом помнить, особенно «работая» с иностранными сайтами.
Но посмотрим, в чем же суть уязвимости. Для кодировки GBK, например, 0xbf27 — неправильная последовательность, такого символа нет. В то же время символ 0xbf5c — есть. Теперь посмотрим на работу функции addslashes: она берет по одному байту и экранирует его, если необходимо. 0xbf — это «Ќ„», 0x27 — это кавычка, ее экранируем.
На выходе получается 0xbf5c27 (. \'), но в MySQL воспринимается два символа — 0xbf5c и 0х27, то есть «что-то» и кавычка.
К описанному выше можно добавить, что и с mysql_escape_string могут быть похожие проблемы, хотя и в очень специфических ситуациях. Подробнее читай в следующих постах:
http://www.xakep.ru/post/57042/default.asp
Но в определенных ситуациях мы можем обойти эту функцию. В каких? Когда при взаимодействии с базой данных используются мультибайтовые кодировки — SJIS, BIG5, GBK, CP932. Возможны и другие, но точно не UTF. Могут быть дополнительные ограничения в виде MySQL 4.1.х-4.1.20, 5.0.x-5.0.22 и PHP < 5.2.5 Как видишь, спектр возможных целей сужается, но все же стоит об этом помнить, особенно «работая» с иностранными сайтами.
Но посмотрим, в чем же суть уязвимости. Для кодировки GBK, например, 0xbf27 — неправильная последовательность, такого символа нет. В то же время символ 0xbf5c — есть. Теперь посмотрим на работу функции addslashes: она берет по одному байту и экранирует его, если необходимо. 0xbf — это «Ќ„», 0x27 — это кавычка, ее экранируем.
На выходе получается 0xbf5c27 (. \'), но в MySQL воспринимается два символа — 0xbf5c и 0х27, то есть «что-то» и кавычка.
http://test.com/Vuln.php?id=%bf%27 OR 1=1 /*
К описанному выше можно добавить, что и с mysql_escape_string могут быть похожие проблемы, хотя и в очень специфических ситуациях. Подробнее читай в следующих постах:
- shiflett.org/blog/2006/jan/addslashes-versus-mysql-realescapestring;
- ilia.ws/archives/103-mysql_real_escape_string-versusPrepared-Statements.html;
- kuza55.blogspot.com/2007/06/mysql-injection-encodingattacks.html;
- raz0r.name/vulnerabilities/sql-inekcii-svyazannye-smultibajtovymikodirovkami-i-addslashes.
http://www.xakep.ru/post/57042/default.asp
Комментариев нет:
Отправить комментарий