За последние 24 часа нас посетили 37303 программиста и 1721 робот. Сейчас ищут 588 программистов ...

Есть ли уязвимость

Тема в разделе "PHP для новичков", создана пользователем Schrodinger, 2 июл 2016.

  1. Schrodinger

    Schrodinger Новичок

    С нами с:
    8 июн 2016
    Сообщения:
    40
    Симпатии:
    5
    Вот мини регистрация:
    Код (Text):
    1.  
    2. <?php
    3. header('Content-Type: text/html; charset=utf-8');
    4.  
    5. function _d( $section , $key , $data = null ) {
    6.     if ( $data !== null ) { $data = serialize($data); }
    7.     $gmem  = function($size, $c="\0") use(&$f) { fseek($f,$ptr=fstat($f)['size']); fwrite($f , str_repeat($c , $size)); fseek($f,$ptr); return $ptr; };
    8.     $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); };
    9.     $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; };
    10.     $rdata = function($index) use(&$f,&$dword,&$buf) { return (object)[ 'next' => $dword($index), 'key'  => $buf( $dword($index + 4) ), 'data' => $buf( $dword($index + 8) ) , 'key_s' => $index + 4 , 'data_s' => $index + 8 , ]; };
    11.     $f = fopen(__DIR__ . "/" . md5($section) . ".kv", "c+");
    12.     flock($f, LOCK_EX);
    13.     if ( fstat($f)['size'] < (0xFFFF << 2) ) { fseek($f, 0); fwrite($f, str_repeat("\0",0xFFFF << 2)); }
    14.     $_key = hexdec( substr(md5($key),0,4) );
    15.     $next = $dword($_key);
    16.     while($next) {
    17.         $info = $rdata( $next );
    18.         if ( $info->key === $key ) { if ( $data === null ) { fclose($f); return @unserialize($info->data); }
    19.             if ( $info->data === $data ) { goto _end; } $dword($info->data_s , $buf(null, $data));
    20.             goto _end;
    21.         } $next = $info->next;
    22.     }
    23.     if ( $data === null ) { goto _end; }
    24.  
    25.     $mem = $gmem( 4 + 4 + 4 ); $dword($_key, $mem); $dword($mem+4*0, $next); $dword($mem+4*1, $buf(null,$key)); $dword($mem+4*2, $buf(null,$data));
    26.    
    27.     _end:
    28.     fclose($f);
    29.     return null;
    30. }
    31. function au() {
    32.     if ( @$login = $_REQUEST['login'] AND @$password = $_REQUEST['password'] ) {
    33.         if ( preg_match('~[^a-zа-я0-9]|(^.{1,3}$)|(^.{13,}$)~iu' , trim($login)) ) { return "Логин содержит не допустимые символы или не верной длинны(можно от 4 до 12 смиволов)"; }
    34.         if ( preg_match('~[^a-zа-я0-9]|(^.{1,3}$)|(^.{13,}$)~iu' , trim($password)) ) { return "Пароль содержит не допустимые символы или не верной длинны(можно от 4 до 12 смиволов)"; }
    35.         $hash = md5($password.'20bolwmclvz');
    36.  
    37.         while(1) {
    38.             $userID = _d('users_by_login',$login);
    39.             if ( $userID === null ) {
    40.                 $userID = md5(mt_rand(111111,999999).mt_rand(111111,999999).mt_rand(111111,999999).mt_rand(111111,999999));
    41.  
    42.                 _d('users_by_login',$login,$userID);
    43.                 _d('users',$userID,['login'=>$login,'password'=>$hash,'sess' => null]);
    44.                 continue;
    45.             } else {
    46.                 $userID = _d('users_by_login',$login);
    47.                 $info = _d('users',$userID);
    48.                 if ( $info['password'] !== $hash ) {
    49.                     return "Пароль неверен";
    50.                 }
    51.             }
    52.             break;
    53.         }
    54.        
    55.         _d('users_sess' , $sess = md5(mt_rand(111111,999999).mt_rand(111111,999999).mt_rand(111111,999999).mt_rand(111111,999999)) , [$userID, time()]);
    56.         setcookie('sid' , $sess);
    57.         $_COOKIE['sid'] = $sess;
    58.         header('Location: '.parse_url($_SERVER['REQUEST_URI'])['path']);
    59.         exit;
    60.         return true;
    61.     }
    62. }
    63. function drawRG( $error_text ) {
    64. ?>
    65. <form class="rg-form" >
    66.     <div><?= $error_text; ?></div>
    67.     <label for="login" />Введите логин:</label>
    68.     <input id="login" value="<?= @$_REQUEST['login']; ?>" name="login" />
    69.     <label for="login" />Введите пароль:</label>
    70.     <input id="password" value="<?= @$_REQUEST['password']; ?>"  name="password" />
    71.     <input name="au" type="submit" />
    72. </form>
    73. <?php
    74. }
    75. while(1) {
    76.     if ( @$sid = $_COOKIE['sid'] ) {
    77.         if ( $info = _d('users_sess',$sid)) {
    78.             $userID = $info[0];
    79.             $login = _d('users',$userID)['login'];
    80.             $f = fopen(__DIR__.'/online.list' , 'c+');
    81.             flock($f,LOCK_EX);
    82.             $online = @fread($f,fstat($f)['size']);
    83.             $online = @unserialize($online);
    84.             if ( !$online ) $online = [];
    85.             $online[$userID] = time();
    86.            
    87.             $onlineLogins = [];
    88.             foreach($_=$online as $userOnlineID => $ltime) {
    89.                 if ( time() > $ltime + 60*4 ) {
    90.                     unset($online[$userOnlineID]);
    91.                     continue;
    92.                 }
    93.                 $onlineLogins[] = _d('users',$userOnlineID)['login'];
    94.             }
    95.            
    96.             $online[ $userID ] = time();
    97.  
    98.             ftruncate($f,0);
    99.             fseek($f,0);
    100.             fwrite($f, serialize($online));
    101.             fclose($f);
    102.  
    103.             $onlineLogins = array_flip($onlineLogins);
    104.             unset($onlineLogins[$login]);
    105.             $onlineLogins = array_flip($onlineLogins);
    106.            
    107.             $rs = sprintf("<div>Привет %s</div>", $login);
    108.             $rs .= sprintf("<div>Пользователи онлайн: </div>", $login);
    109.             $rs .= '<span>'.implode(',',$onlineLogins).'</span>';
    110.             echo $rs;
    111.             break;
    112.         }
    113.     } else {
    114.         $s = au();
    115.         if ( $s === true ) {
    116.             continue;
    117.         }
    118.         drawRG( $s );
    119.         break;
    120.     }
    121. }
    122. ?>
    123.  
    124. <style>
    125. * { box-sizing: border-box; }
    126. .rg-form {
    127.     position: fixed;
    128.     left: 50%; margin-left: -150px;
    129.     top: 20%;
    130.     width: 300px;
    131.     border: 2px solid #AAA; border-radius: 10px;
    132.     padding: 10px;
    133. }
    134. .rg-form * { width: 100%; }
    135. .rg-form div { color: #f33; }
    136. [name=au] { margin-top: 10px; }
    137. </style>
    есть ли тут уязвимость
     
    #1 Schrodinger, 2 июл 2016
    Последнее редактирование: 2 июл 2016
  2. Schrodinger

    Schrodinger Новичок

    С нами с:
    8 июн 2016
    Сообщения:
    40
    Симпатии:
    5
     
  3. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    это типа апнул что ли? устное предупреждение
     
  4. Schrodinger

    Schrodinger Новичок

    С нами с:
    8 июн 2016
    Сообщения:
    40
    Симпатии:
    5
    уязвимость обнаружена.
    суть-неправильная валидация входных данных
     
  5. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    похоже ты не указал начало строки ^ чтобы регулярное выражение проверяло всю строку полностью, а не только часть которая попадает под regex
     
  6. Schrodinger

    Schrodinger Новичок

    С нами с:
    8 июн 2016
    Сообщения:
    40
    Симпатии:
    5
    не. дело в другом совсем
    --- Добавлено ---
    http://www.cyberforum.ru/php-beginners/thread1774815.html
     
  7. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    в чём же?
     
  8. Schrodinger

    Schrodinger Новичок

    С нами с:
    8 июн 2016
    Сообщения:
    40
    Симпатии:
    5
    возможно
    Код (Text):
    1. if ( !preg_match( '~^[a-zа-я0-9]{4,12}$~iuD' , trim($login) ) ) { return "Логин содержит не допустимые символы или не верной длинны(можно от 4 до 12 смиволов)"; }
    и верно, но я писал про utf впринцепе