Расшифровка и чтение данных сессий Suhosin - PullRequest
8 голосов
/ 07 мая 2011

Я только что заметил, что мой хост начал использовать Suhosin Hardening, я не совсем знаком с этим и имею серьезные проблемы с моим приложением, в основном на сессиях.

Сессия в настоящее время сохраняется в следующем формате:

_EzyqHpPJqmQbSpRmXAJTxuFq980aNQlc3XAiRkWxlZQ9B0fnV...

Я не против, но это также нарушает мое приложение, мне нужен способ расшифровки шифрования, потому что это не позволяет мне войти в мое приложение из-за этого.

У меня есть функция для десериализации данных сеанса, не знаю, где я поднял, но вот она:

public function unserialize_session_data($data)
{
    $variables = array();

    $a = preg_split( "/(\w+)\|/", $serialized_string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE );

    for( $i = 0; $i < count( $a ); $i = $i+2 )
    {
        $variables[$a[$i]] = unserialize( $a[$i+1] );
    }

    return($variables);
}

Это дает ошибки смещения с этой функцией, потому что данные сеанса не в том формате, который они ожидали, и поэтому мне было интересно, знает ли кто-нибудь о методе дешифрования / декодирования вышеупомянутых некрасивых данных suhosin, чтобы представить их в оригинале формат

- РЕДАКТИРОВАТЬ -

Публикация функции, которая использует вышеуказанную функцию несериализации

 /***********************************************************************
 #  Get Session Data of a certain session id
 #  --------------------------------------
 #  This function will retrieve all session information related to a certain session id from
 #  the database, after that it unserializes the data and returns an array of data.
 #
 #  @return array  (Containing Session Data)
 ***********************************************************************/
    public function get_session_data($session_id)
    {
        if (isset($session_id) && $session_id != "")
        {
            $sql = mysql_query("SELECT ses_value FROM sessions WHERE (ses_id = '$session_id');") or die ("MySQL Error : <b>" . mysql_error() . "</b><br />");

            if (mysql_num_rows($sql) > 0)
            {
                $res = mysql_fetch_assoc($sql);
                $res = $this->unserialize_session_data($res['ses_value']);
                        return $res;
            }
        }
    }

Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 21 января 2012

Я думал, что расшифровка и шифрование Сухосина были прозрачными?

Parameter       Description
Encrypt         Turns on the transparent encryption

В любом случае, способ генерирования ключа шифрования:

cryptkey + user agent + document root + IP octets

Итак:

12345Mozilla/5.0 (X11; Linux x86_64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2/var/www127.0.0.1

Переменные объединяются без разделителя. Если по какой-либо причине строка криптопровода имеет значение NULL, Suhosin по умолчанию установит значение «D3F4UL7».
После построения строка хешируется с использованием SHA256, а результат используется для генерации 256-битного ключа шифрования rijndael.

1 голос
/ 10 января 2012

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

http://www.idontplaydarts.com/2011/11/decrypting-suhosin-sessions-and-cookies/

Нет собственного способа расшифровки данных Suhosin в PHP - самый простой способ - просто отключить шифрование с помощью session.encrypt = 0 в файле php.ini.

0 голосов
/ 30 мая 2011

Можете ли вы просто использовать ini_set(), чтобы отключить используемое шифрование?

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

...