Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Показать сообщение отдельно
WhiteMind
Hello Kitty
680 / 554 / 400
Регистрация: 12.02.2016
Сообщений: 1,440
Записей в блоге: 1
03.07.2016, 05:19  [ТС] 0

Задачка. Есть ли уязвимость

03.07.2016, 05:19. Просмотров 925. Ответов 14
Метки (Все метки)

Ответ

Цитата Сообщение от Cra3y Посмотреть сообщение
Хех... а я почти весь код откоментировал...
спасибо
Цитата Сообщение от Cra3y Посмотреть сообщение
// получаем смещение из ключа(странное место... возможны одинаковые смещения при разных ключах)
ну (если я не где не допустил ошибку) по индексу получается не данные а записи с ключами/данными и далее в
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    while ($next) {
        $info = $rdata($next);
        if ($info->key === $key) {
            if ($data === null) {
                fclose($f);
                return @unserialize($info->data);
            }
            if ($info->data === $data) {
                goto _end;
            }
            // Обновление данных
            $dword($info->data_s, $buf(null, $data));
            goto _end;
        }
        $next = $info->next;
    }
идет уже перебор и точное сравнение с ключем.

Цитата Сообщение от Cra3y Посмотреть сообщение
/*
* * * * * * * * ** Честно, не понимаю,
* * * * * * * * ** зачем здесь _повторный_ поиск
* * * * * * * * ** _того_же_ пользователя
* * * * * * * * ***/
копировал не заметил,
Цитата Сообщение от Cra3y Посмотреть сообщение
// exit перед return true - облом. Обидно.
также. дописал exit

Добавлено через 36 минут
а ошибка в _d всетаки была.
PHP
1
2
3
4
5
6
7
8
$key1 = "fgdnoayczswlxrvuqijkthebpm";
$key2 = "vepihjmaxlouqndyscbgktrfwz";
 
_d('test' , $key1 , 'data for key 1');
_d('test' , $key2 , 'data for key 2');
 
var_dump( _d('test' , $key1 ) );    // null
var_dump( _d('test' , $key2 ) );
при ключах дающих коллизию даные сохраняются только для последнего ключа, и доступ к данными по другим ключам получить уже нельзя
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
function _d($section, $key, $data = null) {
    if ($data !== null) {
        $data = serialize($data);
    }
    /**
     * дополняет файл блоком размера $size*strlen($c)
     * забивает данный блок значениями $c
     * 
     * @param int $size
     * @param string $c
     * @return integer старое значение размера файла
     */
    $gmem = function ($size, $c = "\0") use (&$f) {
        fseek($f, $ptr = fstat($f)['size']);
        fwrite($f, str_repeat($c, $size));
        fseek($f, $ptr);
        return $ptr;
    };
    /**
     * Если $data === null считывает с позиции $index и возвращает 32битное число
     * Иначе записывает в данную позицию $data, упакованную в последовательность чисел
     * 
     * @param integer $index
     * @param string|null $data
     * @return integer|null
     */
    $dword = function ($index, $data = null) use (&$f) {
        fseek($f, $index);
        if ($data === null) {
            return unpack('L', fread($f, 4))[1];
        }
        fwrite($f, pack("L", $data));
        fseek($f, $index);
        return null;
    };
    /**
     * Если $data === null считывает с позиции $index и возвращает строку символов
     * иначе записывает $data в формате размер+данные
     * Данные добавляются в конец файла
     *
     * @param integer $index
     * @param string|null $data
     * @return string
     */
    $buf = function ($index, $data = null) use (&$f, &$dword, &$buf, &$gmem) {
        fseek($f, $index);
        if ($data === null) {
            $size = $dword($index);
            fseek($f, $index + 4);
            return fread($f, $size);
        }
        $new = $gmem(4 + strlen($data));
        // запись длинны
        $dword($new, strlen($data));
        fseek($f, $new + 4);
        // запись данных
        fwrite($f, $data);
        return $new;
    };
    /**
     * Считывает запись по смещению $index
     *
     * @param integer $index
     * @return object
     */
    $rdata = function ($index) use (&$f, &$dword, &$buf) {
        return (object)[
            // ссылка на следующую запись
            'next' => $dword($index),
            // ID(?) записи
            // которое находятся по смещению,
            // которое(смещение ID) находится по смещению ($index + 4)
            'key' => $buf($dword($index + 4)),
            // собственно данные
            // которые находятся по смещению,
            // которое(смещение data) находится по смещению ($index + 8)
            'data' => $buf($dword($index + 8)),
            // смещение смещения ID
            'key_s' => $index + 4,
            // смещение смещения данных
            'data_s' => $index + 8,
        ];
    };
    // открываем базу данных
    $f = fopen(__DIR__ . "/" . md5($section) . ".kv", "c+");
    flock($f, LOCK_EX);
    // если размер базы меньше заданного, то значит, что база только что создана
    if (fstat($f)['size'] < (0xFFFF << 2)) {
        fseek($f, 0);
        // застолбить место нулями
        fwrite($f, str_repeat("\0", 0xFFFF << 2));
    }
    // получаем смещение из ключа(странное место... возможны одинаковые смещения при разных ключах)
    $_key = hexdec(substr(md5($key), 0, 4));
    $next = $dword($_key);
    while ($next) {
        $info = $rdata($next);
        if ($info->key === $key) {
            if ($data === null) {
                fclose($f);
                return @unserialize($info->data);
            }
            if ($info->data === $data) {
                goto _end;
            }
            // Обновление данных
            $dword($info->data_s, $buf(null, $data));
            goto _end;
        }
        $next = $info->next;
    }
    if ($data === null) {
        goto _end;
    }
    
    // исправление ошибки
    $next = $dword($_key);
 
    // добавление данных
    // добавляем участок для записи смещений
    $mem = $gmem(4 + 4 + 4);
    // запоминаем указатель на новый элемент
    $dword($_key, $mem);
    // запоминаем указатель на следующий
    $dword($mem + 4 * 0, $next);
    // записываем ID
    $key_ptr = $buf(null, $key);
    // запоминаем указатель на смещение ID
    $dword($mem + 4 * 1, $key_ptr);
    // записываем данные
    $data_ptr = $buf(null, $data);
    // запоминаем указатель на смещение данных
    $dword($mem + 4 * 2, $data_ptr);
 
    _end:
    fclose($f);
    return null;
}


Вернуться к обсуждению:
Задачка. Есть ли уязвимость
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2016, 05:19
Готовые ответы и решения:

Уязвимость сайта
Всем привет! Сайт сделан на старой самописной CMS. На формуме сайта стали...

Проверка сайта на уязвимость
Скажите пожалуйста как можно проверить свой сайта на уязвимость, например на...

Уязвимость в коде убрать
Здравствуйте. Есть две SQL базы на одной висит форум на другой скрипт для...

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

Уязвимость php файла
Здравствуйте Уважаемые! Есть файл myfile.php, и в начале этого файла стоит...

14
Другие темы раздела
PHP 500 ошибка http://www.cyberforum.ru/php-beginners/thread1774813.html
Всем доброй ночи, выходит 500 ошибка. текст ощибки: PHP Notice: Undefined index: items in /home/mycare00/yenimulk.az/www/oc-includes/osclass/core/View.php function _next($key) { ...
PHP Данные в базу Здравствуйте. Я делаю запрос в БД и у меня данные в таком формате при utf8_general_ci Мне нужно чтобы вместо таких данных были нормально русские. Сам SQL. (shp_about) DB::insert('INSERT... http://www.cyberforum.ru/php-beginners/thread1774769.html
Php запрос к MYSQL полученные значения нужно передать скрипту javascript PHP
Доброго времени суток такая задача php запрос к MYSQL, полученные значения заносятся в переменные - работает нормально. А дальше не знаю как значения передать скрипту javascript, чтобы эти значения...
Сделать route.php как .htaccess PHP
При настройке возникла проблема изменить .htaccess RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule .* index.php на файл route.php ...
PHP предупреждение при изменении файла http://www.cyberforum.ru/php-beginners/thread1774657.html
здравствуйте. как следить за текстовым файлом и когда он будет изменён выдать предупреждение. звук с окошком сообщения о изменениях.
PHP Массив и путь к файлу Почему он ругается?Что не так? Разобрался, такая переменная просто уже была. подробнее
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru