PDA

Просмотр полной версии : PHP: Сбор информации


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

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

XAMEHA
13.11.2011, 11:35
http://static.php.net/www.php.net/images/logos/php-power-micro.png​

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

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


PHP:




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


PHP:
[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="#0000BB"]




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:
functioncurl_open($url) {

$site=curl_init();

curl_setopt($site,CURLOPT_URL,$url);

curl_setopt($site,CURLOPT_USERAGENT,'Opera 11.2') ;

curl_setopt($site,CURLOPT_HEADER,false);

curl_setopt($site,CURLOPT_CONNECTTIMEOUT,3);

curl_setopt($site,CURLOPT_ENCODING,'gzip, deflate ');

curl_setopt($site,CURLOPT_RETURNTRANSFER,true);

$out=curl_exec($site);

curl_close($site);

return$out;

}



Расширение 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:
loadHTMLFile('./test');//Чтение HTML файла

echo$doc->saveHTML();//Вывод

$doc->saveHTMLFile('test.html');//Запись HTML файла

unset($doc);

$doc= newDOMDocument();

$doc->loadXMLFile('./testx');//Чтение XML файла

echo$doc->saveXML();//Вывод

$doc->saveXMLFile('testx.html');//Запись XML файла

//?>



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:
1,'assert'=>1));

$tst->uksort('call_user_func');

?>



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

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


PHP:
";

while ($v=mysql_fetch_row($res))

{

$opros=rest($v);

$sql="SELECT count(*) FROM `vote` WHERE opros =$op ros";

$op=rest(mysql_fetch_array(mysql_query($sql)));

echo"На опрос$oprosбыло зачисленн о$opголосов\n";

}

} else'ERROR!!!';

include ('/conf/end.php');

?>



Самый типичный пример. Рассмотрим проверку - 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:












$ FILES var_dump:


PHP:
array(1) {

["file"]=>

array(5) {

["name"]=>

string(8)"file.txt"

["type"]=>

string(10)"text/plain"

["tmp_name"]=>

string(14)"/tmp/phpESrNkj"

["error"]=>

int(0)

["size"]=>

int(6)

}

}



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


PHP:














$ FILES print_r:


PHP:
Array

(

[file] => Array

(

[name] => Array

(

[0] =>file.txt

[1] =>file2.txt

)

[type] => Array

(

[0] =>text/plain

[1] =>text/plain

)

[tmp_name] => Array

(

[0] => /tmp/phpcrDN2U

[1] => /tmp/phpdQqsUR

)

[error] => Array

(

[0] =>0

[1] =>0

)

[size] => Array

(

[0] =>6

[1] =>10

)

)

)



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


PHP:
$name) {

if ($_FILES["file"]["size"][$key]>0&&$_FILES["file"]["size"][$key]



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

php-5.3.5\main\rfc1867.c:


PHP:
is_arr_upload= (start_arr=strchr(param,’[’)) && (param[strlen(param)-1] ==’]’);

if (is_arr_upload) {

array_len=strlen(start_arr);

if (array_index) {

efree(array_index);

}

array_index=estrndup(start_arr+1,array_len-2);

}

(...)

abuf=estrndup(param,strlen(param)-array_len);



...

[/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:
Array

(

[file] => Array

(

[name] => Array

(

[[size] =>file.txt

)

[type] => Array

(

[[size] =>text/plain

)

[tmp_name] => Array

(

[[size] => /tmp/php537jRI

)

[error] => Array

(

[[size] =>0

)

[size] => Array

(

[[size] =>10

[[name] =>file2.txt

[[type] =>text/plain

[[tmp_name] => /tmp/phpxktZ4e

[[error] =>0

)

)

)



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

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


PHP:
$name) {

if ($_FILES["file"]["size"][$key]>0&&$_FILES["file"]["size"][$key]















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


PHP:
Array

(

[file] => Array

(

[tmp_name] => Array

(

[[name] =>file.txt

[[type] =>text/plain

[[tmp_name] => /tmp/phpOQsK9O

[[error] =>0

[[size] =>6

)

[size] => Array

(

[[name] =>file2.txt

[[type] =>text/plain

[[tmp_name] => /tmp/phpHCcJwD

[[error] =>0

[[size] =>10

)

[name] => Array

(

[[name] =>file3.txt

[[type] =>text/plain

[[tmp_name] => /tmp/phpWzwITr

[[error] =>0

[[size] =>9

)

)

)



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


PHP:
$_FILES['name']['[name']='file.txt';

$_FILES['size']['[name']=123;

$_FILES['tmp_name']['[name']='index.php';



Таким образом мы меняем 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:
$sql="SELECT count(*) FROM `vote` WHERE opros = '".$opros."' limit 1";

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

k1b0rg
13.11.2011, 12:43
уж лучше так


PHP:
$sql="SELECT count(*) FROM `vote` WHERE opros = ? limit 1";// mysqli

$sql="SELECT count(*) FROM `vote` WHERE opros = : opros limit 1";//pdo



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

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

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

XAMEHA
13.11.2011, 12:44
gibson said:

PHP:
$sql="SELECT count(*) FROM `vote` WHERE opros = '".$opros."' limit 1";

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


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


k1b0rg said:
уж лучше так


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

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

gibson
13.11.2011, 13:01
Ну а если так - инъекции не будет.


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

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

Dr.Z3r0
13.11.2011, 14:51
а если еще учесть, что mysqli будет в новых версия по деволту и использовать mysql_query уже не получится


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

подробнее (http://habrahabr.ru/blogs/php/124245/)

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