Створити просту веб-лабораторію з вразливістю до маніпуляцій з параметрами, використовуючи Express та EJS.

Сьогодні я створив вебсайт для лабораторії CTF з вразливістю параметричного маніпулювання.

Опис процесу

Спочатку ми знайшли сторінку входу для головної сторінки

pic

сторінка входу

Але я навіть не знаю облікових даних, тож давайте з'ясуємо це.

Знайдено! Ми можемо знайти їх у вихідному коді сторінки.

pic

вихідний код

Тепер заходимо за допомогою цих облікових даних.

І ось ми на панелі керування.

pic

панель керування

Тепер натискаємо кнопку показати секретний рецепт.

pic

повідомлення

Ми не шеф-кухар, що це означає?

Виходимо з системи і аналізуємо логіку вебсайту за допомогою Burp Suite.

Тепер заходимо з перехопленням через Burp Suite, і отримуємо ось це.

pic

запит
Чи повинні ми змінити роль на шеф-кухаря?

Давайте спробуємо.

pic

запит

Тепер перенаправляємо і перевіряємо, яке повідомлення з’явиться, якщо ми натиснемо кнопку знову.

pic

флаг

Круто, ми отримали флаг!

Вихідний код

Сервер:

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)

Leave a Reply

Your email address will not be published. Required fields are marked *