Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Уязвимости (https://forum.antichat.xyz/forumdisplay.php?f=74)
-   -   PHP: Сбор информации (https://forum.antichat.xyz/showthread.php?t=302933)

XAMEHA 13.11.2011 11:32

В настоящее время PHP — самый популярный язык для создания веб-приложений и сайтов в том числе. Конечно, существует много сайтов написанных на Perl, pythoon; крупных сайтов использующих JSP, C++ и т. д.

Основные уязвимости, взломы направлены именно на PHP-интерператор и на интерпретируемые скрипты в частности. Большинство найденных уязвимостей направленно на интерпретирование скрипта средой

XAMEHA 13.11.2011 11:35


Константы, объявленные в ядре.​


Плюс данных констант в том, что не следует использовать кавычки при их использовании. Пример от Expl0ited:

PHP код:

PHP:
[
COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]

[/
COLOR][/COLOR

Если предположить запрет использования end и т. п. функций, можно выдвинуть данный вариант:

[PHP]
PHP:
[COLOR="#000000"][COLOR="#007700"]

fopen - Открыть файл



Функции изменения ресурсов, работают не только с файлами. Для каждой заблокированной функции можно найти замену среди других

fputs, fwrite - Бинарно-безопасная запись в файл

fgetc - Считывает символ из файла

fgetcsv - Читает строку из файла и производит разбор данных CSV

fgets - Читает строку из файла

fgetss - Прочитать строку из файла и отбросить HTML-теги

fpassthru - Выводит все оставшиеся данные из файлового указателя

fputcsv - Форматирует строку в виде CSV и записывает её в файловый указатель

fscanf - Обрабатывает данные из файла в соответствии с форматом

fseek - Устанавливает смещение в файловом указателе

ftruncate - Урезает файл до указанной длинны

​readlink - Возвращает файл, на который указывает символическая ссылка

tempnam - Создаёт файл с уникальным именем

tmpfile - Создаёт временный файл

parse_ini_file - Чтение и парсинг ini файлы

copy, move_uploaded_file, file_get_contents, file_put_contents, file, readfile - Без коментариев

Bzip2 - http://www.php.net/manual/ru/book.bzip2.php

Zlib - http://www.php.net/manual/ru/book.zlib.php

highlight_file, show_source - выделение синтаксиса файла, возможно использование URL(allow_url_include).

readgzfile - выводит gz-файл. Функция так же может читать обычные файлы, и использоваться как readfile.

PHP код:

PHP:
[
COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"][/COLOR]

[/COLOR

3. Работа с сетью - закачка шеллов, отдача файлов



fopen, file_get_contents, file - Без комментариев.

Функции работы с базами данных - при некоторых обстоятельствах будет удобно подключиться к удалённой базе данных и передать необходимую информацию в обе стороны.

Думаю код данного раздела будет понятен всем, расписывать его не имеет смысла так как примеры находятся во многих источниках.



fsockopen, pfsockopen, stream_socket_client — получение данных.

dns_get_record - получение DNS записей(UDP).

Расширение sockets - socket_create и т. п. функции

Cyrus IMAP - http://www.php.net/manual/ru/book.cyrus.php - Работа с IMAP сервером.

get_meta_tags — Чтение мета-тегов HTML файла, путь к которому передан в первом аргументе, и return в виде ассоциативно массива.

cURL:

PHP код:

PHP:
[
COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]function[/COLOR][COLOR="#0000BB"]curl_open[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$url[/COLOR][COLOR="#007700"]) {

[/COLOR][COLOR="#0000BB"]$site[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]curl_init[/COLOR][COLOR="#007700"]();

[/COLOR][COLOR="#0000BB"]curl_setopt[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$site[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]CURLOPT_URL[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$url[/COLOR][COLOR="#007700"]);

[/COLOR][COLOR="#0000BB"]curl_setopt[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$site[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]CURLOPT_USERAGENT[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#DD0000"]'Opera 11.2'[/COLOR][COLOR="#007700"]);

[/COLOR][COLOR="#0000BB"]curl_setopt[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$site[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]CURLOPT_HEADER[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]false[/COLOR][COLOR="#007700"]);

[/COLOR][COLOR="#0000BB"]curl_setopt[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$site[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]CURLOPT_CONNECTTIMEOUT[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]3[/COLOR][COLOR="#007700"]);

[/COLOR][COLOR="#0000BB"]curl_setopt[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$site[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]CURLOPT_ENCODING[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#DD0000"]'gzip, deflate'[/COLOR][COLOR="#007700"]);

[/COLOR][COLOR="#0000BB"]curl_setopt[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$site[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]CURLOPT_RETURNTRANSFER[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]true[/COLOR][COLOR="#007700"]);

[/COLOR][COLOR="#0000BB"]$out[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]curl_exec[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$site[/COLOR][COLOR="#007700"]);

[/COLOR][COLOR="#0000BB"]curl_close[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$site[/COLOR][COLOR="#007700"]);

return[/COLOR][COLOR="#0000BB"]$out[/COLOR][COLOR="#007700"];

}

[/COLOR][/COLOR

Расширение FTP - http://www.php.net/manual/ru/book.ftp.php



4. Выполнение system.



5-ый аргумент функции mail. До некоторых версий php возможно выполнение произвольных команд

system, exec, passthru, shell_exec(``) - Без комментариев.

proc_open и т.п. - Выполняет команду и открывает файловый указатель для ввода/вывода.

popen и т. п. - Открывает файловый указатель процесса

dl - загружает РНР-расширение на этапе прогона(enable_dl).



Классы, объекты​

Список объявленных классов — get_declared_classes(). Ini:disable_classes — Список запрещённых классов.

0. DOMDocument, XMLReader, XMLWriter, SimpleXMLElement - Работа с XML, HTML. Возможность чтения и записи файлов данного формата.

PHP код:

PHP:
[
COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"][/COLOR][COLOR="#0000BB"]loadHTMLFile[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'./test'[/COLOR][COLOR="#007700"]);[/COLOR][COLOR="#FF8000"]//Чтение HTML файла

[/COLOR][COLOR="#007700"]echo[/COLOR][COLOR="#0000BB"]$doc[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]saveHTML[/COLOR][COLOR="#007700"]();[/COLOR][COLOR="#FF8000"]//Вывод

[/COLOR][COLOR="#0000BB"]$doc[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]saveHTMLFile[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'test.html'[/COLOR][COLOR="#007700"]);[/COLOR][COLOR="#FF8000"]//Запись HTML файла

[/COLOR][COLOR="#007700"]unset([/COLOR][COLOR="#0000BB"]$doc[/COLOR][COLOR="#007700"]);

[/COLOR][COLOR="#0000BB"]$doc[/COLOR][COLOR="#007700"]= new[/COLOR][COLOR="#0000BB"]DOMDocument[/COLOR][COLOR="#007700"]();

[/COLOR][COLOR="#0000BB"]$doc[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]loadXMLFile[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'./testx'[/COLOR][COLOR="#007700"]);[/COLOR][COLOR="#FF8000"]//Чтение XML файла

[/COLOR][COLOR="#007700"]echo[/COLOR][COLOR="#0000BB"]$doc[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]saveXML[/COLOR][COLOR="#007700"]();[/COLOR][COLOR="#FF8000"]//Вывод

[/COLOR][COLOR="#0000BB"]$doc[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]saveXMLFile[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'testx.html'[/COLOR][COLOR="#007700"]);[/COLOR][COLOR="#FF8000"]//Запись XML файла

//[/COLOR][COLOR="#0000BB"]
?>[/COLOR]

[/COLOR] 

1. ZipArchive - Аналогично, работа с архивами, запаковка файлов, извлечение.

Код:

Code:
ZipArchive {
        /* Methods */
        bool addEmptyDir ( string $dirname )
        bool addFile ( string $filename [, string $localname = NULL [, int $start = 0 [, int $length = 0 ]]] )
        bool addFromString ( string $localname , string $contents )
        bool close ( void )
        bool deleteIndex ( int $index )
        bool deleteName ( string $name )
        bool extractTo ( string $destination [, mixed $entries ] )
        string getArchiveComment ([ int $flags ] )
        string getCommentIndex ( int $index [, int $flags ] )
        string getCommentName ( string $name [, int $flags ] )
        mixed getFromIndex ( int $index [, int $length = 0 [, int $flags ]] )
        mixed getFromName ( string $name [, int $length = 0 [, int $flags ]] )
        string getNameIndex ( int $index [, int $flags ] )
        string getStatusString ( void )
        resource getStream ( string $name )
        mixed locateName ( string $name [, int $flags ] )
        mixed open ( string $filename [, int $flags ] )
        bool renameIndex ( int $index , string $newname )
        bool renameName ( string $name , string $newname )
        mixed setArchiveComment ( string $comment )
        mixed setCommentIndex ( int $index , string $comment )
        mixed setCommentName ( string $name , string $comment )
        mixed statIndex ( int $index [, int $flags ] )gzdeflate
        mixed statName ( name $name [, int $flags ] )
        mixed unchangeAll ( void )
        mixed unchangeArchive ( void )
        mixed unchangeIndex ( int $index )
        mixed unchangeName ( string $name )
}

2. SOAP



SOAP (от англ. Simple Object Access Protocol — простой протокол доступа к объектам) — протокол обмена структурированными сообщениями в распределённой вычислительной среде. Первоначально SOAP предназначался в основном для реализации удалённого вызова процедур (RPC). Сейчас протокол используется для обмена произвольными сообщениями в формате XML, а не только для вызова процедур. Официальная спецификация последней версии 1.2 протокола никак не расшифровывает название SOAP. SOAP является расширением протокола XML-RPC.

SOAP может использоваться с любым протоколом прикладного уровня: SMTP, FTP, HTTP, HTTPS и др. Однако его взаимодействие с каждым из этих протоколов имеет свои особенности, которые должны быть определены отдельно. Чаще всего SOAP используется поверх HTTP.

http://ru.wikipedia.org/wiki/SOAP

http://php.su/articles/?cat=pear&page=004&adminmode=true



WSDL (англ. Web Services Description Language) — язык описания веб-сервисов и доступа к ним, основанный на языке XML.

http://ru.wikipedia.org/wiki/WSDL

​Текущая PHP реализация не имеет зависимости allow_url_(*). Стандартная работа с SOAP разделена на два блока - клиентскую и серверную. Многие думают что по стандартной схеме клиент - взламываемый ресурс, возможная дописка в CMS, но не всегда это так. Серверную часть тоже можно разместить на сайте, в различных кодах CMS и не занимающийся длительное время в этой области человек просто не разберёт, что делает данный код.

Данный протокол и методы его реализации пригодные для нас, и для нестандартных действий можно ещё расписывать страниц на 30, и то не рассказав много. Это сильно выходит за рамки этого текста, тем более что ниже как раз будет основное содержание статьи.



Стандартная библиотека PHP (англ. Standard PHP Library, SPL) — коллекция классов и интерфейсов для решения стандартных проблем в PHP. Библиотека была введена в PHP 5 и доступна по умолчанию, начиная с PHP 5.

Основное содержание библиотеки — классы-итераторы, решающие задачи итерации по каталогу, массиву, дереву XML.

SPL добавляет в PHP новые возможности ООП для работы с :
  • итераторами;
  • новые виды исключений;
  • перегрузка (overloading) массивов,
  • расширенное управление XML, файлами и данными
  • паттерн Наблюдатель, интерфейс Исчисления (counting)
  • автоматическая загрузка классов и интерфейсов
  • ...
PHP поддерживает SPL начиная с версии 5.2.1.

http://www.php.net/manual/ru/book.spl.php

И т. д.



ArrayObject - Использование объектов в качестве массивов и работа с ними.

[СODE]

ArrayObject implements IteratorAggregate , Traversable , ArrayAccess , Serializable , Countable {

/* Константы */

const integer STD_PROP_LIST = 1 ;

const integer ARRAY_AS_PROPS = 2 ;

/* Методы */

__construct ([ mixed $input [, int $flags [, string $iterator_class ]]] )

..

void uasort ( callback $cmp_function )

void uksort ( callback $cmp_function )

public void unserialize ( string $serialized )

}

[/СODE]

Предпоследние методы принимают Callback function, что так же делает их доступными для выполнения кода.

Пример:

PHP код:

PHP:
[
COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"][/COLOR][COLOR="#0000BB"]1[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#DD0000"]'assert'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#0000BB"]1[/COLOR][COLOR="#007700"]));

[/COLOR][COLOR="#0000BB"]$tst[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]uksort[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'call_user_func'[/COLOR][COLOR="#007700"]);

[/COLOR][COLOR="#0000BB"]?>[/COLOR]

[/COLOR] 

В SPL достаточно классов, многие из них(Кто ещё не сделал) лучше изучить и использовать. Вообще, перед тем как писать всё это я планировал выделить только примеры скриптов, уязвимостей, работы функций не по предусмотрению разработчика. Ну раз я уж это написал, то это всё же имеет место для публики и последующего дополнения.

XAMEHA 13.11.2011 11:38

Пример с is_numeric​
Как то недавно объяснял одному хорошему амину смысл заключения уязвимости. Он не поверил, пока он не попросил залить шелл. В теме приведён упрощённый пример.

PHP код:

PHP:
[
COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]"[/COLOR][COLOR="#007700"];

while ([/COLOR][COLOR="#0000BB"]$v[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]mysql_fetch_row[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$res[/COLOR][COLOR="#007700"]))

{

[/COLOR][COLOR="#0000BB"]$opros[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]rest[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$v[/COLOR][COLOR="#007700"]);

[/COLOR][COLOR="#0000BB"]$sql[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]"SELECT count(*) FROM `vote` WHERE opros =[/COLOR][COLOR="#0000BB"]$opros[/COLOR][COLOR="#DD0000"]"[/COLOR][COLOR="#007700"];

[/COLOR][COLOR="#0000BB"]$op[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]rest[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]mysql_fetch_array[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]mysql_query[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$sql[/COLOR][COLOR="#007700"])));

echo
[/COLOR][COLOR="#DD0000"]"На опрос[/COLOR][COLOR="#0000BB"]$opros[/COLOR][COLOR="#DD0000"]было зачисленно[/COLOR][COLOR="#0000BB"]$op[/COLOR][COLOR="#DD0000"]голосов\n"[/COLOR][COLOR="#007700"];

}

} else[/COLOR][COLOR="#DD0000"]'ERROR!!!'[/COLOR][COLOR="#007700"];

include
([/COLOR][COLOR="#DD0000"]'/conf/end.php'[/COLOR][COLOR="#007700"]);

[/COLOR][COLOR="#0000BB"]?>[/COLOR]

[/COLOR] 

Самый типичный пример. Рассмотрим проверку - isset, is_numeric - первое опасности не имеет, второе, как некоторые думают защищает данный скрипт. Но вот что делает функция is_numeric - определяет, является ли переменная числом или числовой строкой. Ну и соответственно она пропускает строку 0x....

Далее поле, в которое MySQL записало знаение, извлечённое из HEX дальше используеться в запросе SELECT opros FROM `vote` GROUP BY `opros`, данные из которого используются далее - SELECT count(*) FROM `vote` WHERE opros = $opros, где $opros - это значение извлечённое из HEX где мы и сможем реализовать SQL-inj.

Php Multipleupload Overwrite - Перевод ​

PHP - Загрузка файлов:

PHP код:

PHP:
[
COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]









[/COLOR][/COLOR

$ FILES var_dump:

PHP код:

PHP:
[
COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]array([/COLOR][COLOR="#0000BB"]1[/COLOR][COLOR="#007700"]) {

[[/COLOR][COLOR="#DD0000"]"file"[/COLOR][COLOR="#007700"]]=>

array
([/COLOR][COLOR="#0000BB"]5[/COLOR][COLOR="#007700"]) {

[[/COLOR][COLOR="#DD0000"]"name"[/COLOR][COLOR="#007700"]]=>

[/COLOR][COLOR="#0000BB"]string[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]8[/COLOR][COLOR="#007700"])[/COLOR][COLOR="#DD0000"]"file.txt"

[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]"type"[/COLOR][COLOR="#007700"]]=>

[/COLOR][COLOR="#0000BB"]string[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]10[/COLOR][COLOR="#007700"])[/COLOR][COLOR="#DD0000"]"text/plain"

[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]"tmp_name"[/COLOR][COLOR="#007700"]]=>

[/COLOR][COLOR="#0000BB"]string[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]14[/COLOR][COLOR="#007700"])[/COLOR][COLOR="#DD0000"]"/tmp/phpESrNkj"

[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]"error"[/COLOR][COLOR="#007700"]]=>

[/COLOR][COLOR="#0000BB"]int[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"])

[[/COLOR][COLOR="#DD0000"]"size"[/COLOR][COLOR="#007700"]]=>

[/COLOR][COLOR="#0000BB"]int[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]6[/COLOR][COLOR="#007700"])

}

}

[/COLOR][/COLOR

1. Мульти загрузка файлов:

PHP код:

PHP:
[
COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]











[/COLOR][/COLOR

$ FILES print_r:

PHP код:

PHP:
[
COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]Array

(

[[/COLOR][COLOR="#0000BB"]file[/COLOR][COLOR="#007700"]] => Array

(

[[/COLOR][COLOR="#0000BB"]name[/COLOR][COLOR="#007700"]] => Array

(

[[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"]] =>[/COLOR][COLOR="#0000BB"]file[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]txt

[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]1[/COLOR][COLOR="#007700"]] =>[/COLOR][COLOR="#0000BB"]file2[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]txt

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

[[/COLOR][COLOR="#0000BB"]type[/COLOR][COLOR="#007700"]] => Array

(

[[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"]] =>[/COLOR][COLOR="#0000BB"]text[/COLOR][COLOR="#007700"]/[/COLOR][COLOR="#0000BB"]plain

[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]1[/COLOR][COLOR="#007700"]] =>[/COLOR][COLOR="#0000BB"]text[/COLOR][COLOR="#007700"]/[/COLOR][COLOR="#0000BB"]plain

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

[[/COLOR][COLOR="#0000BB"]tmp_name[/COLOR][COLOR="#007700"]] => Array

(

[[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"]] => /[/COLOR][COLOR="#0000BB"]tmp[/COLOR][COLOR="#007700"]/[/COLOR][COLOR="#0000BB"]phpcrDN2U

[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]1[/COLOR][COLOR="#007700"]] => /[/COLOR][COLOR="#0000BB"]tmp[/COLOR][COLOR="#007700"]/[/COLOR][COLOR="#0000BB"]phpdQqsUR

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

[[/COLOR][COLOR="#0000BB"]error[/COLOR][COLOR="#007700"]] => Array

(

[[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"]] =>[/COLOR][COLOR="#0000BB"]0

[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]1[/COLOR][COLOR="#007700"]] =>[/COLOR][COLOR="#0000BB"]0

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

[[/COLOR][COLOR="#0000BB"]size[/COLOR][COLOR="#007700"]] => Array

(

[[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"]] =>[/COLOR][COLOR="#0000BB"]6

[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]1[/COLOR][COLOR="#007700"]] =>[/COLOR][COLOR="#0000BB"]10

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

)

)

[/COLOR][/COLOR

После изучения исходных кодов движков оказалось, что разработчики используют примерно такой код:

PHP код:

PHP:
[
COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"][/COLOR][COLOR="#0000BB"]$name[/COLOR][COLOR="#007700"]) {

if
([/COLOR][COLOR="#0000BB"]$_FILES[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]"file"[/COLOR][COLOR="#007700"]][[/COLOR][COLOR="#DD0000"]"size"[/COLOR][COLOR="#007700"]][[/COLOR][COLOR="#0000BB"]$key[/COLOR][COLOR="#007700"]]>[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"]&&[/COLOR][COLOR="#0000BB"]$_FILES[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]"file"[/COLOR][COLOR="#007700"]][[/COLOR][COLOR="#DD0000"]"size"[/COLOR][COLOR="#007700"]][[/COLOR][COLOR="#0000BB"]$key[/COLOR][COLOR="#007700"]][/COLOR]

[/COLOR

2. Исходя из различных тестов и изучений исходных кодов PHP я понял то, что мы можем подменивать информацию в этом массиве и получать доступ с использованием безопасных скриптов.

php-5.3.5\main\rfc1867.c:

PHP код:

PHP:
[
COLOR="#000000"][COLOR="#0000BB"]is_arr_upload[/COLOR][COLOR="#007700"]= ([/COLOR][COLOR="#0000BB"]start_arr[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]strchr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]param[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"][/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"][/COLOR][COLOR="#007700"])) && ([/COLOR][COLOR="#0000BB"]param[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#0000BB"]strlen[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]param[/COLOR][COLOR="#007700"])-[/COLOR][COLOR="#0000BB"]1[/COLOR][COLOR="#007700"]] ==[/COLOR][COLOR="#0000BB"][/COLOR][COLOR="#007700"]][/COLOR][COLOR="#0000BB"][/COLOR][COLOR="#007700"]);

if
([/COLOR][COLOR="#0000BB"]is_arr_upload[/COLOR][COLOR="#007700"]) {

[/COLOR][COLOR="#0000BB"]array_len[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]strlen[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]start_arr[/COLOR][COLOR="#007700"]);

if
([/COLOR][COLOR="#0000BB"]array_index[/COLOR][COLOR="#007700"]) {

[/COLOR][COLOR="#0000BB"]efree[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]array_index[/COLOR][COLOR="#007700"]);

}

[/COLOR][COLOR="#0000BB"]array_index[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]estrndup[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]start_arr[/COLOR][COLOR="#007700"]+[/COLOR][COLOR="#0000BB"]1[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]array_len[/COLOR][COLOR="#007700"]-[/COLOR][COLOR="#0000BB"]2[/COLOR][COLOR="#007700"]);

}

(...)

[/COLOR][COLOR="#0000BB"]abuf[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]estrndup[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]param[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]strlen[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]param[/COLOR][COLOR="#007700"])-[/COLOR][COLOR="#0000BB"]array_len[/COLOR][COLOR="#007700"]);

[/COLOR][/COLOR

...

[/PHP]

if (is_arr_upload) {

snprintf(lbuf, llen, "%s[type][%s]", abuf, array_index);

} else {

snprintf(lbuf, llen, "%s[type]", param);

}

register_http_post_files_variable(lbuf, cd, http_post_files, 0 TSRMLS_CC);

[/PHP]

Исходя из данного кода, когда мы отправляем эту форму:

PHP код:

PHP:
[
COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]











[/COLOR][/COLOR

Мы получаем:

PHP код:

PHP:
[
COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]Array

(

[[/COLOR][COLOR="#0000BB"]file[/COLOR][COLOR="#007700"]] => Array

(

[[/COLOR][COLOR="#0000BB"]name[/COLOR][COLOR="#007700"]] => Array

(

[[[/COLOR][COLOR="#0000BB"]size[/COLOR][COLOR="#007700"]] =>[/COLOR][COLOR="#0000BB"]file[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]txt

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

[[/COLOR][COLOR="#0000BB"]type[/COLOR][COLOR="#007700"]] => Array

(

[[[/COLOR][COLOR="#0000BB"]size[/COLOR][COLOR="#007700"]] =>[/COLOR][COLOR="#0000BB"]text[/COLOR][COLOR="#007700"]/[/COLOR][COLOR="#0000BB"]plain

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

[[/COLOR][COLOR="#0000BB"]tmp_name[/COLOR][COLOR="#007700"]] => Array

(

[[[/COLOR][COLOR="#0000BB"]size[/COLOR][COLOR="#007700"]] => /[/COLOR][COLOR="#0000BB"]tmp[/COLOR][COLOR="#007700"]/[/COLOR][COLOR="#0000BB"]php537jRI

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

[[/COLOR][COLOR="#0000BB"]error[/COLOR][COLOR="#007700"]] => Array

(

[[[/COLOR][COLOR="#0000BB"]size[/COLOR][COLOR="#007700"]] =>[/COLOR][COLOR="#0000BB"]0

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

[[/COLOR][COLOR="#0000BB"]size[/COLOR][COLOR="#007700"]] => Array

(

[[[/COLOR][COLOR="#0000BB"]size[/COLOR][COLOR="#007700"]] =>[/COLOR][COLOR="#0000BB"]10

[/COLOR][COLOR="#007700"][[[/COLOR][COLOR="#0000BB"]name[/COLOR][COLOR="#007700"]] =>[/COLOR][COLOR="#0000BB"]file2[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]txt

[/COLOR][COLOR="#007700"][[[/COLOR][COLOR="#0000BB"]type[/COLOR][COLOR="#007700"]] =>[/COLOR][COLOR="#0000BB"]text[/COLOR][COLOR="#007700"]/[/COLOR][COLOR="#0000BB"]plain

[/COLOR][COLOR="#007700"][[[/COLOR][COLOR="#0000BB"]tmp_name[/COLOR][COLOR="#007700"]] => /[/COLOR][COLOR="#0000BB"]tmp[/COLOR][COLOR="#007700"]/[/COLOR][COLOR="#0000BB"]phpxktZ4e

[/COLOR][COLOR="#007700"][[[/COLOR][COLOR="#0000BB"]error[/COLOR][COLOR="#007700"]] =>[/COLOR][COLOR="#0000BB"]0

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

)

)

[/COLOR][/COLOR

Таким образом мы загружаем file.txt, но с размером file2.txt!

Таким образом мы можем подменить значение нужных нам переменных и совершить ействия с произвольными файлами. Но это только без проверки загрузки файла и использования move_uploaded_file.

PHP код:

PHP:
[
COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"][/COLOR][COLOR="#0000BB"]$name[/COLOR][COLOR="#007700"]) {

if
([/COLOR][COLOR="#0000BB"]$_FILES[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]"file"[/COLOR][COLOR="#007700"]][[/COLOR][COLOR="#DD0000"]"size"[/COLOR][COLOR="#007700"]][[/COLOR][COLOR="#0000BB"]$key[/COLOR][COLOR="#007700"]]>[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"]&&[/COLOR][COLOR="#0000BB"]$_FILES[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]"file"[/COLOR][COLOR="#007700"]][[/COLOR][COLOR="#DD0000"]"size"[/COLOR][COLOR="#007700"]][[/COLOR][COLOR="#0000BB"]$key[/COLOR][COLOR="#007700"]]













[/COLOR][/COLOR

Массив примет значение:

PHP код:

PHP:
[
COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]Array

(

[[/COLOR][COLOR="#0000BB"]file[/COLOR][COLOR="#007700"]] => Array

(

[[/COLOR][COLOR="#0000BB"]tmp_name[/COLOR][COLOR="#007700"]] => Array

(

[[[/COLOR][COLOR="#0000BB"]name[/COLOR][COLOR="#007700"]] =>[/COLOR][COLOR="#0000BB"]file[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]txt

[/COLOR][COLOR="#007700"][[[/COLOR][COLOR="#0000BB"]type[/COLOR][COLOR="#007700"]] =>[/COLOR][COLOR="#0000BB"]text[/COLOR][COLOR="#007700"]/[/COLOR][COLOR="#0000BB"]plain

[/COLOR][COLOR="#007700"][[[/COLOR][COLOR="#0000BB"]tmp_name[/COLOR][COLOR="#007700"]] => /[/COLOR][COLOR="#0000BB"]tmp[/COLOR][COLOR="#007700"]/[/COLOR][COLOR="#0000BB"]phpOQsK9O

[/COLOR][COLOR="#007700"][[[/COLOR][COLOR="#0000BB"]error[/COLOR][COLOR="#007700"]] =>[/COLOR][COLOR="#0000BB"]0

[/COLOR][COLOR="#007700"][[[/COLOR][COLOR="#0000BB"]size[/COLOR][COLOR="#007700"]] =>[/COLOR][COLOR="#0000BB"]6

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

[[/COLOR][COLOR="#0000BB"]size[/COLOR][COLOR="#007700"]] => Array

(

[[[/COLOR][COLOR="#0000BB"]name[/COLOR][COLOR="#007700"]] =>[/COLOR][COLOR="#0000BB"]file2[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]txt

[/COLOR][COLOR="#007700"][[[/COLOR][COLOR="#0000BB"]type[/COLOR][COLOR="#007700"]] =>[/COLOR][COLOR="#0000BB"]text[/COLOR][COLOR="#007700"]/[/COLOR][COLOR="#0000BB"]plain

[/COLOR][COLOR="#007700"][[[/COLOR][COLOR="#0000BB"]tmp_name[/COLOR][COLOR="#007700"]] => /[/COLOR][COLOR="#0000BB"]tmp[/COLOR][COLOR="#007700"]/[/COLOR][COLOR="#0000BB"]phpHCcJwD

[/COLOR][COLOR="#007700"][[[/COLOR][COLOR="#0000BB"]error[/COLOR][COLOR="#007700"]] =>[/COLOR][COLOR="#0000BB"]0

[/COLOR][COLOR="#007700"][[[/COLOR][COLOR="#0000BB"]size[/COLOR][COLOR="#007700"]] =>[/COLOR][COLOR="#0000BB"]10

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

[[/COLOR][COLOR="#0000BB"]name[/COLOR][COLOR="#007700"]] => Array

(

[[[/COLOR][COLOR="#0000BB"]name[/COLOR][COLOR="#007700"]] =>[/COLOR][COLOR="#0000BB"]file3[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]txt

[/COLOR][COLOR="#007700"][[[/COLOR][COLOR="#0000BB"]type[/COLOR][COLOR="#007700"]] =>[/COLOR][COLOR="#0000BB"]text[/COLOR][COLOR="#007700"]/[/COLOR][COLOR="#0000BB"]plain

[/COLOR][COLOR="#007700"][[[/COLOR][COLOR="#0000BB"]tmp_name[/COLOR][COLOR="#007700"]] => /[/COLOR][COLOR="#0000BB"]tmp[/COLOR][COLOR="#007700"]/[/COLOR][COLOR="#0000BB"]phpWzwITr

[/COLOR][COLOR="#007700"][[[/COLOR][COLOR="#0000BB"]error[/COLOR][COLOR="#007700"]] =>[/COLOR][COLOR="#0000BB"]0

[/COLOR][COLOR="#007700"][[[/COLOR][COLOR="#0000BB"]size[/COLOR][COLOR="#007700"]] =>[/COLOR][COLOR="#0000BB"]9

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

)

)

[/COLOR][/COLOR

Взглянем на первый файл:

PHP код:

PHP:
[
COLOR="#000000"][COLOR="#0000BB"]$_FILES[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'name'[/COLOR][COLOR="#007700"]][[/COLOR][COLOR="#DD0000"]'[name'[/COLOR][COLOR="#007700"]]=[/COLOR][COLOR="#DD0000"]'file.txt'[/COLOR][COLOR="#007700"];

[/COLOR][COLOR="#0000BB"]$_FILES[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'size'[/COLOR][COLOR="#007700"]][[/COLOR][COLOR="#DD0000"]'[name'[/COLOR][COLOR="#007700"]]=[/COLOR][COLOR="#0000BB"]123[/COLOR][COLOR="#007700"];

[/COLOR][COLOR="#0000BB"]$_FILES[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'tmp_name'[/COLOR][COLOR="#007700"]][[/COLOR][COLOR="#DD0000"]'[name'[/COLOR][COLOR="#007700"]]=[/COLOR][COLOR="#DD0000"]'index.php'[/COLOR][COLOR="#007700"];

[/COLOR][/COLOR

Таким образом мы меняем tmp_name на нужную нам информацию.

Для того, что бы исправить данную уязвимость PHP должен отсеивать файлы, заканчивающиеся на [ и т. д. Эту уязвимость следует ещё доработать для последующего использования. Это будет произведено за рамками этой части. Исходный текст: https://students.mimuw.edu.pl/~ai292615/php_multipleupload_overwrite.pdf

Данная уязвимость исправлена в PHP 5.3.7:



Возможность подстановки части файлового пути из-за некорректного очищения в функции rfc1867_post_handler имен файлов, передаваемых через multipart/form-data POST-запросы. Атакующий может изменить заданный логикой приложения абсолютный путь и создать или переписать произвольные файлы (CVE-2011-2202); ​

Ещё одна уязвимость того автора — HEAD. - https://students.mimuw.edu.pl/~ai292615/php_head_trick.pdf

Так как в этой части статьи мы рассматриваем не только авторские материалы, но и материалы других пользователей нам не помешает познакомиться(Для тех кто ещё не познакомился) с неравно-опубликованными паблик уязвимостей.

Перевод темы: https://rdot.org/forum/showthread.php?t=1330

gibson 13.11.2011 12:30

PHP код:

PHP:
[
COLOR="#000000"][COLOR="#0000BB"]$sql[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]"SELECT count(*) FROM `vote` WHERE opros = '"[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$opros[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]"' limit 1"[/COLOR][COLOR="#007700"];[/COLOR][/COLOR

а если так написать?

k1b0rg 13.11.2011 12:43

уж лучше так

PHP код:

PHP:
[
COLOR="#000000"][COLOR="#0000BB"]$sql[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]"SELECT count(*) FROM `vote` WHERE opros = ? limit 1"[/COLOR][COLOR="#007700"];[/COLOR][COLOR="#FF8000"]// mysqli

[/COLOR][COLOR="#0000BB"]$sql[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]"SELECT count(*) FROM `vote` WHERE opros = :opros limit 1"[/COLOR][COLOR="#007700"];[/COLOR][COLOR="#FF8000"]//pdo

[/COLOR][/COLOR

забудьте про mysql_query

p.s. файлы можно читать через курл

$ch = curl_init('file://example.txt');

XAMEHA 13.11.2011 12:44

Цитата:

Сообщение от gibson
gibson said:
PHP код:

PHP:
[
COLOR="#000000"][COLOR="#0000BB"]$sql[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]"SELECT count(*) FROM `vote` WHERE opros = '"[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$opros[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]"' limit 1"[/COLOR][COLOR="#007700"];[/COLOR][/COLOR

а если так написать?

Ну а если так - инъекции не будет.

Цитата:

Сообщение от k1b0rg
k1b0rg said:
уж лучше так

В таких целях пишу коды с видом неопытности кодера, писавшего код - для уязвимых кодов это нормально. А если писать профессиональный код - там уязвимсть либо будет выделяться, либо её невозможно будет серьёзно организовать(В небольшом файле)

В cURL и libcURL найдена уязвимость связанная с особенностью обработки редиректов через заголовок "Location:" и позволяет при обращении к внешнему ресурсу перенаправить запрос на URL начинающийся с "file://" или "scp://", инициировав открытие заданного локального файла. Для успешного проведения атаки в конфигурации должен быть активен режим автоматического следования редиректам. Проблема устранена в релизе 7.19.4.​

gibson 13.11.2011 13:01

Цитата:

Сообщение от None
Ну а если так - инъекции не будет.

я про тоже, старые байки на новый лад

а если еще учесть, что mysqli будет в новых версия по деволту и использовать mysql_query уже не получится

Dr.Z3r0 13.11.2011 14:51

Цитата:

Сообщение от None
а если еще учесть, что mysqli будет в новых версия по деволту и использовать mysql_query уже не получится

Кстати да. Судя по обещаниям разработчиков PHP, начиная с версии 5.5 библиотека mysql становится deprecated, а с версии 6.0 данная библиотека будет отсутствовать, и останется только mysqli и PDO.

подробнее

XAMEHA 18.05.2013 07:32

Спущено, может надо будет кому-то обратиться.


Время: 02:26