Another Login Challenge

2026. 3. 15. 22:13·Alpacahack
반응형

문제설명

Topic: Login

분야: Web

난이도: Medium

Login!, login!, and login!

문제 URL: https://alpacahack.com/daily/challenges/alert-my-flag


코드 분석

let users = {
  admin: {
    password: crypto.randomBytes(32).toString("base64"),
  },
};
  • users는 사용자 정보를 저장한 객체
    현재 admin 한 명만 있음
  • password는 랜덤한 비밀번호 생성
app.get("/", (req, res) => {
  res.send(`
    <h2>Login</h2>
    <form method="POST">
      <input name="username" placeholder="username" required />
      <br />
      <input name="password" type="password" placeholder="password" required />
      <br />
      <button>Login</button>
    </form>
  `);
});
  • GET / 요청 시 로그인 폼 HTML을 보여줌
  • 브라우저에서 /에 접속하면 아이디/비번 입력창이 나옴
app.post("/", (req, res) => {
  const { username, password } = req.body;
  const user = users[username];
  if (!user || user.password !== password) {
    return res.send("invalid credentials");
  }

  res.send(FLAG);
});
  • 로그인 폼 제출되면 POST / 로 들어온다
  • 사용자가 입력한 username, passowrd가 바디로 요청함
  • user 변수엔 {password: "랜덤 비밀번호"} 가 들어있음
  • !user : username의 계정이 없으면 실패 / 비밀번호 다르면 실패 

취약점 분석

  • 사용자가 넣은 문자열을 객체 키로 사용함
    → __proto__ 같은 특수 키를 이용하면 의도하지 않은 객체가 user에 들어감

익스플로잇

username="__proto__" 를 입력해주면 


username에 __proto__를 넣으면

const user = users[username]; ===> const user = users["__proto__"];

객체의 프로토타입에 연결된 특수한 키 처럼 동작이 가능하다. 그래서 users["__proto__"]는 보통 Object.prototype 같은 값을 가져오게 된다

 

즉,

users["__proto__"] -> Object.prototype

 

따라서 user = Object.prototype이 되고 조건문을 살펴보면

if (!user || user.password !== password) {
    return res.send("invalid credentials");
  }

user은 truthy가 되고, !user는 false가 된다.

 

그리고 password를 아예 안 보내면 password === ubdefined가 된다.

또한 Object.prototype.password도 기본적으로 undefined라서 

undefined !== undefined로 결과가 false가 된다.

 

즉 

if(false || false)

가 되어 통과하고 FLAG가 나온다.

반응형

'Alpacahack' 카테고리의 다른 글

Alert my Flag  (0) 2026.03.05
Rock Paper Scissors Lizard Spock  (0) 2026.03.03
Alpaca Rangers  (0) 2026.03.03
omikuji  (0) 2026.02.23
Emojify  (0) 2026.02.20
'Alpacahack' 카테고리의 다른 글
  • Alert my Flag
  • Rock Paper Scissors Lizard Spock
  • Alpaca Rangers
  • omikuji
y3onbug5
y3onbug5
y3onbug5 님의 블로그 입니다.
  • y3onbug5
    y3onbug5 님의 블로그
    y3onbug5
  • 전체
    오늘
    어제
    • 분류 전체보기 (167) N
      • Alpacahack (19) N
      • Dreamhack 워게임 (49)
        • Lv.1 (40)
        • Lv.0 (4)
        • LV.2 (3)
        • LV.3 (2)
      • [Dreamhack] Web Beginner (3)
      • [Dreamhack] Web Hacking (17)
        • 웹 기초 지식 (4)
        • Cookie & Session (2)
        • Cross-Site Scripting(XSS) (1)
        • Cross-Site Request Forgery (1)
        • SQL Injection (4)
        • NoSQL Injection (2)
        • Command Injection (1)
        • File Vulnerability (1)
        • Server-Side Request Forgery (1)
      • [Dreamhack] Web Hacking Client-Side (10)
        • XSS Filtering Bypass (2)
        • Content Security Policy (CSP) (2)
        • CSRF,CORS Bypass (2)
        • Client-Side Template Injection (CSTI) (1)
        • CSS Injection (1)
        • Relative Path Overwrite (RPO) (1)
        • DOM Vulnerability (1)
      • [Dreamhack] Web Hacking Server-Side (15)
        • SQL Injection Advanced (4)
        • SQL Injection Advanced - Fingerprinting (2)
        • NoSQL Injection Advanced (3)
        • Command Injection Advanced - Web Servers (3)
        • File Vulnerability Advanced - Web Server (3)
      • [Dreamhack]Black-Box Penetration Testing (15)
        • DreamCommunity Penetration Testing (11)
      • [Dreamhack] LLM (2)
        • [Dreamhack] LLM과 프롬프트 엔지니어링 (2)
      • Web 공부 (4)
      • Web Study (15)
      • JavaScript (17)
        • 기초 (12)
        • 중급 (4)
      • 웹 개발(Flask) (0)
      • [Security First] web 기초교육 (1) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    cve
    LLM
    web
    JavaScript
    CSRF
    JS
    webhacking
    hacking
    webstudy
    xss
    DreamHack
    alpacahack
    드림핵
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
y3onbug5
Another Login Challenge
상단으로

티스토리툴바