Is IMAGE and Shell

dakata__92

Super Moderator
Добре. Мм да погледнем една базова ситуация с проста функция. Имаме:
PHP:
function is_image($path)
{
    $a = getimagesize($path);
    $image_type = $a[2];
     
    if(in_array($image_type , array(IMAGETYPE_GIF , IMAGETYPE_JPEG ,IMAGETYPE_PNG , IMAGETYPE_BMP)))
    {
        return true;
    }
    return false;
}
Проверява посредством getimagesize от GD библиотеката типа на изображението. Да но идва един интересен факт, че се байпасва лесно с преименуване на екстеншъна и кажи речи е уязвимо за вкарване на шел. Как се прави превент на този проблем като впрочем регулярните изрази също имат този проблем до някаква степен, като естествено зависи от това как са написани. Малко е банална темата но ме интересува понеже си правя библиотека на фрейма и искам да имам защита от този вид атака. Шела е опасно нещо, поради което искам да се защитя максимално.
 
Според мен първо трябва да го направиш само определен формат
изображения да могат да се качват:

пример:
PHP:
if (!preg_match("/((https?:\/\/|www\.).+?\.(?:jpg|jpeg|gif|png|bmp))/",$avatar))

също така ето и още един допълнителен вариянт които аз ползвам и съм доволен от него:

в папката с изображенията правиш един .htaccess фаил със следното съдържание:

Код:
<Files ~ "^.*\.(php|cgi|pl|php3|php4|php5|php6|phtml|shtml|txt|html|asp)">
Order allow,deny
Deny from all
</Files>

така дори някои да успее да ти качи шелл тои няма да работи
за сега поне за тези вариянти се сещам.

Ето тук намерих още инфо по темата:http://it-log.info/text-124.html
 
systems каза:
Според мен първо трябва да го направиш само определен формат
изображения да могат да се качват:

пример:
PHP:
if (!preg_match("/((https?:\/\/|www\.).+?\.(?:jpg|jpeg|gif|png|bmp))/",$avatar))

също така ето и още един допълнителен вариянт които аз ползвам и съм доволен от него:

в папката с изображенията правиш един .htaccess фаил със следното съдържание:

Код:
<Files ~ "^.*\.(php|cgi|pl|php3|php4|php5|php6|phtml|shtml|txt|html|asp)">
Order allow,deny
Deny from all
</Files>

така дори някои да успее да ти качи шелл тои няма да работи
за сега поне за тези вариянти се сещам.

Ето тук намерих още инфо по темата:http://it-log.info/text-124.html
Функцията набързо тук във форума я драснах. За preg_match филтъра е ясно, че е нужен, а бях забравил да напиша че има и .htaccess файл в директорията, но благодаря за допълнението. :) Впрочем точно за този тип филтри говорих, че се заобикалят така: image.php.png като това е стринга и се матчва от .+?\.(?:jpg|jpeg|gif|png|bmp).
https://regex101.com/r/mY2lW7/1
 
Според мен е хубаво да се направи една подобна тема като важна, и в нея да се описват всички видове злонамерени атаки(хакове:() и как да се защитим от тях. Все пак това е един от най-важните елементи при изработката на някакъв сайт, защото колкото и да е хубав може да бъде съсипан за отрицателно време. По повод това че preg_match написан по този начин може да се заобиколи image.php.png, ще кажа че аз лично бих предпочел да ползвам вместо регулярни изрази, прости стрингови операции за постигането на търсения ефект. Например в случая с image.php.png може да се проверява дали има само една точка и къде точно се намира в стринга.
 
teroristd каза:
Според мен е хубаво да се направи една подобна тема като важна, и в нея да се описват всички видове злонамерени атаки(хакове:() и как да се защитим от тях. Все пак това е един от най-важните елементи при изработката на някакъв сайт, защото колкото и да е хубав може да бъде съсипан за отрицателно време. По повод това че preg_match написан по този начин може да се заобиколи image.php.png, ще кажа че аз лично бих предпочел да ползвам вместо регулярни изрази, прости стрингови операции за постигането на търсения ефект. Например в случая с image.php.png може да се проверява дали има само една точка и къде точно се намира в стринга.
Mimetype на finfo класът си върши страхотна работа за снимките. Имай в предвид, че простите стрингови операции не винаги са решението особено от към ограничения на потребителя за качване примерно в дадена галерия.
 
teroristd каза:
Сигурно е така, но тук ставаше въпрос за някакъв preg_match ако се не лъжа :).
Да, говорехме за зобикаляне чрез шел проверката на регулярен израз. :)
 
Така и така се заговорихме :D да питам за хеширането. Например хеширам някаква парола с md5, и чета как хакера използва някакви таблици с хешове за сравнение и след 5 минути е разбил паролата. Не ми стана ясно само от къде аджаба тоя хакер ще вземе дадения хеш на на някой потребител за да го сравнява :D?
 
teroristd каза:
Така и така се заговорихме :D да питам за хеширането. Например хеширам някаква парола с md5, и чета как хакера използва някакви таблици с хешове за сравнение и след 5 минути е разбил паролата. Не ми стана ясно само от къде аджаба тоя хакер ще вземе дадения хеш на на някой потребител за да го сравнява :D?
Първо повярвай ми това си е brute force атака тоест познаване на хеша и неговата стойност. Второ трябва да разбие базата ти за да достъпи до хеша или да вземе некоя бисквитка. Трето просто правиш md5('STRING'.'parola');
и нека си търси в стандартните таблички. Все пак защитата в интернет се базира на аритметични операции с много големи цифри или стрингове които наличните машини не успяват да разбият.
 
Аз говорех хипотетично за md5, в момента творя някакъв суперсложен(направо невъзможен за разбиване) алгоритъм за хеширане според автора :D, ама мисълта ми беше друга. Ако хакера се добере до базата данни всичко свършва. За какво му е на някой да се занимава с глупости и да сравнява стрингове при положение че вече има достъп до базата :D.
 
teroristd каза:
Аз говорех хипотетично за md5, в момента творя някакъв суперсложен(направо невъзможен за разбиване) алгоритъм за хеширане според автора :D, ама мисълта ми беше друга. Ако хакера се добере до базата данни всичко свършва. За какво му е на някой да се занимава с глупости и да сравнява стрингове при положение че вече има достъп до базата :D.
Пълна липса на въображение! :D Може много неща да прави с паролите на потребителите. От там се тръгва по една доооста плодородна верига. Затова се запаметяват хеширани в базата :)
 

Back
Горе