Сьогодні я створив вебсайт для лабораторії CTF з вразливістю параметричного маніпулювання.
Опис процесу
Спочатку ми знайшли сторінку входу для головної сторінки
сторінка входу
Але я навіть не знаю облікових даних, тож давайте з'ясуємо це.
Знайдено! Ми можемо знайти їх у вихідному коді сторінки.
вихідний код
Тепер заходимо за допомогою цих облікових даних.
І ось ми на панелі керування.
панель керування
Тепер натискаємо кнопку показати секретний рецепт.
повідомлення
Ми не шеф-кухар, що це означає?
Виходимо з системи і аналізуємо логіку вебсайту за допомогою Burp Suite.
Тепер заходимо з перехопленням через Burp Suite, і отримуємо ось це.
запит
Чи повинні ми змінити роль на шеф-кухаря?
Давайте спробуємо.
запит
Тепер перенаправляємо і перевіряємо, яке повідомлення з’явиться, якщо ми натиснемо кнопку знову.
флаг
Круто, ми отримали флаг!
Вихідний код
Сервер:
import express from "express";
import session from "express-session";
import * as path from "path";
const app = express();
const users = [
{
id: 1,
username: "rocky",
password: "rocky123",
},
{
id: 2,
username: "admin",
password: "admin123",
},
];
app.use(express.urlencoded({ extended: true }));
app.use(express.static(path.join(import.meta.dirname, "public")));
app.use(
session({
secret: "keyboard-cat",
resave: false,
saveUninitialized: true,
cookie: { secure: false },
})
);
app.set("view engine", "ejs");
app.set("views", path.join(import.meta.dirname, "views"));
app.get("/", (req, res) => {
res.render("login");
});
app.post("/login", (req, res) => {
const { username, password, role } = req.body;
const user = users.find(
(u) => u.username === username && u.password === password
);
if (!user) {
return res.redirect("/");
}
req.session.orang = {
id: user.id,
username: user.username,
password: user.password,
role: role,
};
res.redirect("/dashboard");
});
app.get("/dashboard", (req, res) => {
const user = req.session.orang;
if (!user) return res.redirect("/");
res.render("dashboard", {
user,
});
});
app.get("/logout", (req, res) => {
req.session.destroy(() => {
res.redirect("/");
});
});
app.listen(5000, () => console.log("server started on http://localhost:5000"));
Клієнт:
login.ejs
It looks like you typed "test." Is there something specific you'd like to test or try out?
текст перекладу
form div {
display: flex;
flex-direction: column;
gap: 0.5rem;
justify-content: center;
align-items: center;
font-weight: bold;
}
form div input {
padding: 0.5rem;
border-radius: 0.2rem;
border: none;
background-color: var(--cerah);
color: var(--gelap);
}
form button {
padding: 0.5rem 1rem;
border-radius: 0.2rem;
border: none;
background-color: var(--gelap);
color: var(--cerah);
font-weight: bold;
transition: all ease 0.3s;
}
form button:hover {
background-color: var(--cerah);
color: var(--gelap);
}
## Сторінка входу
Ім’я користувача
Пароль
It looks like you’ve provided some HTML with an embedded code snippet. How would you like me to assist with this? Would you like a translation or clarification on the code?
текст перекладу
padding: 1rem 1.5rem;
background-color: rgb(197, 27, 27);
color: var(--primary);
border: none;
border-radius: 0.2rem;
transition: all 0.3s ease;
cursor: pointer;
}
button:hover {
background-color: var(--cerah);
color: #1e2022;
}
.box {
width: 50vw;
height: 30vh;
display: flex;
font-size: small;
flex-direction: column;
justify-content: center;
animation: fade 5s ease;
}
@keyframes fade {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.content {
display: none;
}
## Вихід
Ласкаво просимо, name
Тобі подобається насгор? 😁
Хочеш спробувати інші страви, наприклад, tahu tek? 😔
Показати секретний рецепт
<% if (user.role === "chef") { %> FLAG{S3CR3T_R3C1P3} <% } else { %> Ти не наш кухар, йди звідси! <% } %>
текст перекладу
``` **Пункт** 1.
текст перекладу
just create new session with role
app.post("/login", (req, res) => {
const { username, password, role } = req.body;
const user = users.find(
(u) => u.username === username && u.password === password
);
if (!user) {
return res.redirect("/");
}
req.session.orang = {
id: user.id,
username: user.username,
password: user.password,
role: role,
};
res.redirect("/dashboard");
});
```
2. роль з значенням за замовчуванням
Ім’я користувача
Пароль
Увійти
``` 3.
текст перекладу
and that input is hidden type
so we can manipulate that parameter become chef on intercept
це все, тримай так і дякую 🦖
Перекладено з: [Create simple web lab with Parameter Tampering vulnerability using express and EJS](https://medium.com/@sirsebasers/create-simple-web-lab-with-parameter-tampering-vulnerability-using-express-and-ejs-dbb6f1085c1a?source=rss------nodejs-5)