2016-09-30 6 views
2

Я решении проблем codeshell.krГде уязвимость в этом php-коде?

<?php 
    include("./config.php"); 

    $foo = $_GET['______foo_adm1nkyj______']; 
    $check = urldecode($_SERVER['QUERY_STRING']); 

    if(preg_match("/_| /i", $check)) 
    { 
     die("no hack ~_~"); 
    } 
    if($foo == "adm1nkyj") 
    { 
     echo $flag; 
    } 

    echo "<br/>"; 
    highlight_file(__FILE__); 
    ?> 

Что я должен сделать, чтобы получить $flag? И какова уязвимость этих кодов? Это в $_GET? или preg_match()? Я не могу найти его, несмотря на поиск в google.

+1

Проблема заключается в том, что 'preg_match()' проверяет '_' существует из URL (строка'? ______ foo_ad1nkyj ____ = someValue' и запускает метод 'die()'. Вы пытались заменить _ на Для этого вопрос не является именно этим вопросом, это не вопрос, который программируется, поэтому я ниспровергаю. – KDOT

ответ

4

Решение заключается в следующем:

http://123.111.158.161/codeshell/prob2/?......foo.adm1nkyj......=adm1nkyj 

Это работает, потому что PHP заменяет точки и пробелы с подчеркиванием в клавишах массивов запроса данных ($_GET, $_POST , $_REQUEST, $_COOKIE).

От PHP docs:

Примечание: Точки и пробелы в именах переменных преобразуются в символы подчеркивания. Например, <input name="a.b" /> становится $_REQUEST["a_b"].

Это, вероятно, реликт от времени, когда регистровые глобалы все еще были предметом.

+1

Спасибо !!! Вы, должно быть, гений! –

2

Проблема на самом деле довольно проста, когда вы знаете об одном: php заменяет точки в именах переменных GET символом подчеркивания.

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

Просто позвоните этот адрес:

123.111.158.161/codeshell/prob2/?......foo.adm1nkyj......=adm1nkyj 
Смежные вопросы