Конкурс SQL-injection challenge

Всем привет!

В продолжение серии статей 1 2 3 4 5 6 я решил приготовить вам сюрприз в виде таска. По моей оценке сложность задачи 8 из 10 баллов. Предлагаю всем желающим пошевелить мозгами, и испытать свои навыки по внедрению произвольного кода в базы данных.

Условия конкурса

1. Взломать базу данных, и вытащить оттуда secret_key
2. Прислать своё решение мне в л.с. (подробное прохождение)
3. Дать свою оценку сложности таска по 10 балльной шкале

Конкурс продлится 10 дней, окончание конкурса 8 сентября в 23 ч по МСК.

Ответы от зарегистрированных на форуме после старта конкурса НЕ принимаются.

Администрация форума предоставила призы для конкурса:

1. Место - Alfa AWUS036H
2. Место - 500 рублей
3. Место - 500 рублей

Места победителей распределяются по очерёдности решения - кто первый выполнит задание, тот и первый, и т.д.
Запрещается писать до окончания конкурса в теме прохождение и подсказки. После окончания конкурса, будут опубликованы имена победителей и write up.

hacker.gif


GO!!!
 
Тебе нужно было не в безопасность, а в рекламу и маркетинг - господи помилуй, да что ж такое. Но хорошо, id=1';%00 так id=1';%00.
 
комментарии вроде бываю 3 видов
- -, /*, #
А %00 видимо что бы обрубить какой то фильтр
 
Расскажешь о типах комментариев? Вообще не представлял, что есть нечто подобное, что браузер не станет декодировать в обычный символ
Уже рассказывал, и даже в этой теме давал ссылку на статью
Здесь использовался нулевой байт %00, 0x00, null byte это недокументированный комментарий. Нулевой байт применяется в языке СИ, и является концом строки. Таким образом он работает.
комментарии вроде бываю 3 видов
- -, /*, #
А %00 видимо что бы обрубить какой то фильтр
Нет, больше, ещё есть
 
  • Нравится
Реакции: HebiNeco
Осталось 36 часов до окончания. Пересмотрел логи. Есть несколько человек, которые ходят прямо рядом, но почему-то до сих пор используют не то окончание в запросах. И часть юзеров поняли буквально мою подсказку и ставят запрос после id=1';%00payload а нужно id=1'payload;%00

Также есть люди абсолютно верно справившиеся с фильтром, и узнавшие верное количество колонок. Но потом застряли, ибо или не знают этот вариант инъекции, или не догадались.

Вторая подсказка
Это уже даже больше чем подсказка routed injection
Кто не знает что это гуглим.
 
Последние новости - есть ещё один решивший. Хочу сказать, что он проявил адскую настойчивость и очень старался. Только за настойчивость можно дать высокую оценку.
Так что как говорится "дорогу осилит идущий". Большое спасибо за участие!!!

Осталось ещё достаточно времени чтобы решить, хоть уже и с подсказкой. Самое главное в этом таске - не пытаться сразу делать сложные запросы, всё проще, чем кажется. Уделяйте внимание мелочам.
 
Может, я конечно, чего-то не понимаю (99,9% так и есть), но, эм, где собственно база данных? На адресе открытой базы нету (есть только защищённая брандмауэром). Вроде люди говорят про то, что на главной странице есть запросы к базе данных, но эм, как на такой странице
HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>SQL Injection</title>
</head>
<body>
<style>
.marginauto {
    margin: 10px auto 20px;
    display: block;
    
}
@media (max-width:600px)
{
.marginauto{width: 100%;}
}
</style>
You Hacker???<div>
<br>
<p>Bla-bla-bla!</p>
</div>
</body>
</html>
где-то могут быть вообще какие-то запросы? Вроде как получить исходный php код страницы можно только с помощью некоторых уяизвимостей, которых, судя по всему, на сервере нет.
 
Может, я конечно, чего-то не понимаю (99,9% так и есть), но, эм, где собственно база данных?
где-то могут быть вообще какие-то запросы? Вроде как получить исходный php код страницы можно только с помощью некоторых уяизвимостей, которых, судя по всему, на сервере нет.

Исходный код php вы и не должны видеть, а он есть ) Если коротко - PHP предназначен для сервера, а для клиента HTML. Поэтому исходный код страницы полностью увидеть нельзя, кроме случаев когда есть на сайте уязвимости позволяющие это сделать.

База данных находится собственно в базе данных, тут у вас огромный пробел в понимании. Чтобы с этим вопросом разобраться у меня написана серия статей, ссылки есть в начале темы. Первые 3 ссылки как раз по работе с БД.

Запрос к базе данных здесь bypassing.su/?id=1
В коде страницы запрос выглядит примерно так $sql="SELECT *** FROM *** WHERE id='$id'";
звёздочек там нет конечно, а есть обращение к конкретным столбцам из таблицы.
 
  • Нравится
Реакции: ilyamikheevcoder
Сегодня в 23 часа конкурс завершается!

Ещё есть много времени чтобы решить, с такими подсказками первая вторая там уже ничего не остаётся как обойти фильтрацию средней сложности и всё.
 
  • Нравится
Реакции: ilyamikheevcoder
Это сообщение "Discovered Hacker!" меня уже совсем с толку сбивает. Что это? Сообщение от фильтра? Перехват ошибки? И то и другое? Аааааааа...
 
Это сообщение "Discovered Hacker!" меня уже совсем с толку сбивает. Что это? Сообщение от фильтра? Перехват ошибки? И то и другое? Аааааааа...
Дам уже третью подсказку - это сообщение выходит и при ошибке БД, и при срабатывании фильтра. Таким образом я всех запутал ))) Однако эту логику несложно было отследить, и понять когда есть начальная страница, а когда картинка появляется.
 
Да я писал не для того чтобы как-то приуменьшить твои достижения, а чтобы ты обратил внимание на недочёты. Часть мелочей была упущена, из-за этого много времени ушло. Можешь до райтапа попробовать ещё обойти фильтр без использования hex.

Твоя воля к победе заслуживает 10 баллов из 10. Если бы все участники проявили бы такую же стойкость, то решивших было бы в разы больше. Райтап будет или сегодня, или завтра вечером/ночью.
 
  • Нравится
Реакции: Сергей Попов
Райтап готов! Все, кому не удалось решить таск, могут теперь его пройти в спокойной обстановке, и разобраться что к чему.
 
По "просьбам трудящихся" выкладываю код таска.

Сначала создаём базу

create database routed;

Потом заполняем её

CREATE TABLE IF NOT EXISTS fantastik (
ID int(11)UNSIGNED NOT NULL AUTO_INCREMENT,
Name VARCHAR(40) NOT NULL,
Money int(11)UNSIGNED NOT NULL,
PRIMARY KEY (ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO fantastik (Name, Money) VALUES
('Bill', 500000),
('Debil', 100),
('Krokodil', 500),
('Gamadril', 200);


CREATE TABLE IF NOT EXISTS xz (
ID int(11)UNSIGNED NOT NULL AUTO_INCREMENT,
_Name_ VARCHAR(40) NOT NULL,
Text VARCHAR(40) NOT NULL,
PRIMARY KEY (ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO xz (_Name_, Text) VALUES
('token', '3a6f2hj5fd85ar35'),
('schlyapa', 'luser'),
('secret_key', '_your_win_'),
('chuvak','nishtyak');


Картинку hacker.gif берём со страницы таска и закидываем её в папку images
Ну и самое главное, код index.php

HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>SQL Injection</title>
</head>
<body>
<style>
.marginauto {
    margin: 10px auto 20px;
    display: block;
    
}
// Медиа запрос для мобилы
@media (max-width:600px)
{
.marginauto{width: 100%;}
}
</style>
// Данные для обращения к базе
<?php
$server = "localhost";
$user = "root";
$password = "";
$db = "routed";
 
// Открываем соединение
$link = new mysqli($server, $user, $password, $db);
 
// Проверка результата подключения
if ($link->connect_error) {
    die("Подключение не удалось: " . $link->connect_error);
}
// Первый запрос к базе идёт к двум колонкам через параметр id
if(isset($_GET['id']))
{
$id=$_GET['id'];
$id= blacklist($id);
$sql="SELECT ID,Name FROM fantastik WHERE id='$id'";
// Срабатывание алерта первый запрос
$result=mysqli_query($link,$sql);
if(!$result){
echo '<font color= "#0000ff"><H2 align="center">';
echo "Discovered Hacker!";
echo "<br>";
echo "</font></H2>";
echo '<img class="marginauto" src="http://localhost/images/hacker.gif">';
exit;
}
$row = mysqli_fetch_array($result);

    if($row)
    {
      echo '<font color= "#0000ff">';   
      
      
      //echo 'Your Name: ' .$row['Name']; Это вывод из первого запроса, но он закомментирован
      echo "</font>";
      }
    }
// Второй запрос к базе данных для одной колонки

$sql="SELECT Money FROM fantastik WHERE Name='".$row['Name']."'";
  
$result=mysqli_query($link,$sql);
// Срабатывание алерта второй запрос
if(!$result){
echo '<font color= "#0000ff"><H2 align="center">';
echo "Discovered Hacker!";
echo "<br>";
echo "</font></H2>";
echo '<img class="marginauto" src="http://localhost/images/hacker.gif">';

exit;
}
// Вывод из второго запроса
$row = mysqli_fetch_array($result);

    if($row)
    {     
      echo 'Money: ' .$row['Money'];
      }
    else { echo "You Hacker???";}   
// Здесь фильтрация
function blacklist($id)
{
    $id= preg_replace('/or|and|[\s]|--|[+]|[#]|=|[`]/i',"", $id);   
    
    return $id;
}   
?>
<div>
<br>
// Просто текст на странице
<p>Bla-bla-bla!</p>
</div>
</body>
</html>

Теперь можете гонять таск на локалке, и как угодно его модифицировать )
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

Похожие темы