Скажем, ты нашел инъекцию на крупном новостном портале, но никак не можешь ее
раскрутить, так как все известные тебе варианты пробелов не работают. Давай
рассмотрим такой код
<?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()))