Dreamhack/Dreamhack Wargame (Challenge)

[101] IT 비전공자 [dreamhack]baby-Case문제 풀기

imaginefuture-1 2024. 12. 19. 08:53

 

 

ag.js 소스코드

module.exports = [
    {
        "id": 1,
        "name": "FLAG",
        "description": "DH{fake_flag}"
    },
    {
        "id": 2,
        "name": "DRAG",
        "description": "To pull something along forcefully, often on the ground or another surface, causing friction or resistance. It also refers to the delay in performance or response time."
    },
    {
        "id": 3,
        "name": "SLAG",
        "description": "The waste material produced by the smelting process, which involves separating metal from its ore. Slag is typically a mixture of metal oxides and silicon dioxide."
    },
    {
        "id": 4,
        "name": "SWAG",
        "description": "Refers to stylish confidence in one's appearance or demeanor. It can also mean promotional goods or items given away for free as a form of advertising."
    }
]

ㅋㅋㅋㅋㅋㅋㅋㅋ킹받죠?

 

 

 

 

app.js 소스코드

 

const express = require("express")
const words = require("./ag")

const app = express()
const PORT = 3000
app.use(express.urlencoded({ extended: true }))

function search(words, leg) {
    return words.find(word => word.name === leg.toUpperCase())
}

app.get("/",(req, res)=>{
    return res.send("hi guest")
})

app.post("/shop",(req, res)=>{
    const leg = req.body.leg

    if (leg == 'FLAG'){
        return res.status(403).send("Access Denied")
    }

    const obj = search(words,leg)

    if (obj){
        return res.send(JSON.stringify(obj))
    }
    
    return res.status(404).send("Nothing")
})

app.listen(PORT,()=>{
    console.log(`[+] Started on ${PORT}`)
})

 

 

 

 

이 코드는 간단한 Express.js 웹 서버를 설정하고, POST 요청을 처리하여 데이터를 검색하는 애플리케이션입니다. 사용자로부터 입력을 받고, 특정 조건에 따라 응답을 반환합니다. 코드에서 사용하는 주요 기능과 보안상 취약점 등을 분석합니다.


주요 구성 분석

  1. Express.js 설정:
    • express: Node.js의 웹 프레임워크.
    • words: 외부 모듈 ./ag에서 불러오는 데이터로, 이 데이터는 search() 함수에서 검색 대상이 됩니다.
    • express.urlencoded({ extended: true }):
      • POST 요청의 url-encoded 형식 데이터를 파싱하는 미들웨어.
  2. const express = require("express") const words = require("./ag") const app = express() const PORT = 3000 app.use(express.urlencoded({ extended: true }))
  3. 라우팅:
    • 두 가지 주요 엔드포인트:
      • GET /: 간단한 메시지를 반환.
      • POST /shop: 사용자 입력(leg)을 처리하고 데이터를 검색.
  4. search 함수:
    • words 배열에서 name 속성이 leg.toUpperCase()와 일치하는 객체를 찾습니다.
    • 반환값:
      • 일치하는 객체가 있으면 해당 객체.
      • 없으면 undefined.
  5. function search(words, leg) { return words.find(word => word.name === leg.toUpperCase()) }
  6. POST /shop 엔드포인트:
    • req.body.leg에서 leg 값을 받아 처리.
    • leg === 'FLAG'이면 403: Access Denied를 반환.
    • search 함수로 words 배열에서 leg와 일치하는 데이터를 찾습니다:
      • 일치하는 데이터가 있으면 JSON 문자열로 반환.
      • 없으면 404: Nothing을 반환.

기능 분석

1. GET / 엔드포인트:

  • 단순한 메시지를 반환:
    app.get("/",(req, res)=>{
        return res.send("hi guest")
    })
    
  • 예시 요청:
    curl http://localhost:3000/
    
  • 응답:
    hi guest
    

2. POST /shop 엔드포인트:

  • 사용자의 입력(leg)에 따라 동작이 결정됩니다.
  • 코드 흐름:
    1. req.body.leg 값을 가져옵니다.
    2. 입력값이 'FLAG'이면 403: Access Denied를 반환.
    3. search() 함수로 데이터를 검색:
      • 일치하는 데이터가 있으면 JSON 형식으로 반환.
      • 없으면 404: Nothing 반환.

보안 및 취약점 분석

  1. 403 금지 조건 (FLAG 차단):
    • leg 값이 'FLAG'로 입력되면 강제로 차단합니다.
    • 이를 통해 중요한 데이터나 민감한 정보를 노출하지 않으려는 시도.
    취약점:
    • 차단은 단순 문자열 비교로 이루어지며, 우회 가능성이 있습니다.
      • 입력값을 조작하여 'flag', 'Flag'와 같은 대소문자 변형을 시도할 경우 차단되지 않을 수 있음.
  2. if (leg == 'FLAG'){ return res.status(403).send("Access Denied") }
  3. 데이터 검증 부족:
    • leg 값이 제대로 검증되지 않고 바로 사용됩니다.
    • 이는 SQL 인젝션, 경로 조작과 같은 공격에 취약할 가능성을 높입니다.
    • 예: req.body.leg 값에 예상치 못한 문자를 삽입해 테스트.
  4. 외부 의존성 취약점 (words 모듈):
    • ./ag 모듈에서 불러온 words 데이터가 어떤 구조인지 명시되지 않았습니다.
    • 악의적인 데이터나 예기치 못한 값이 포함될 경우, 애플리케이션 동작이 불안정해질 수 있습니다.
  5. JSON 응답으로 민감한 데이터 노출 가능성:
    • search() 결과가 바로 JSON 문자열로 반환됩니다:
      return res.send(JSON.stringify(obj))
      
    • 만약 words 배열에 민감한 정보가 포함되어 있다면, 이를 통해 쉽게 노출될 수 있습니다.
  6. HTTP 상태 코드 일관성 문제:
    • 데이터가 없는 경우 404를 반환:
      return res.status(404).send("Nothing")
      
    • 하지만, 검색 실패는 반드시 404로 처리해야 하는 것은 아니며, 애플리케이션의 동작 의도에 따라 200 응답과 함께 실패 메시지를 반환하는 것이 더 자연스러울 수 있음.

개선 방안

  1. 403 조건 강화:
    • 'FLAG'를 포함한 다양한 변형(대소문자 및 공백 포함)을 차단하려면 대소문자를 무시한 비교를 사용:
      if (leg.toUpperCase().trim() === 'FLAG') {
          return res.status(403).send("Access Denied")
      }
      
  2. 입력값 검증:
    • req.body.leg의 길이 및 유효성을 검증:
      if (!leg || typeof leg !== 'string' || leg.length > 50) {
          return res.status(400).send("Invalid input")
      }
      
  3. 외부 데이터의 신뢰성 강화:
    • words 모듈의 데이터 구조를 명확히 정의하고, 서버 시작 시 검증:
      if (!Array.isArray(words) || !words.every(item => typeof item.name === 'string')) {
          throw new Error("Invalid words data")
      }
      
  4. JSON 응답의 보안 강화:
    • 검색 결과가 없을 때도 명확한 응답 제공:
      if (!obj) {
          return res.status(404).json({ error: "No match found" });
      }
      return res.json(obj);
      
  5. HTTP 상태 코드 일관성:
    • 검색 실패를 200으로 반환하고 결과를 명확히 전달:
      if (!obj) {
          return res.json({ success: false, message: "No match found" });
      }
      return res.json({ success: true, data: obj });
      

요약

이 애플리케이션은 간단하지만 다음과 같은 보안 취약점을 내포하고 있습니다:

  • 입력값 검증 부족.
  • 단순한 조건 비교로 인한 우회 가능성.
  • 외부 데이터에 대한 신뢰성 문제.

위에서 제시한 개선 방안을 적용하면, 보안성과 안정성이 강화된 애플리케이션을 만들 수 있습니다. 😊

 

 

하이~

 

 

 

 

 

app.js를 보면, /shop에서 request를 받아서 받은 data를 if문에서 비교하고, 해당 데이터의 문자열이 FLAG라면
403 에러와 에러메세지를 반환한다.
 
flag를 얻기 위해서는 리퀘에 flag를 보내야하는데, 에러가 반환되어서 정상적으로 flag를 확인할 수가 없다.

출처ㅣhttps://hackinguko.tistory.com/133

 

https://www.hahwul.com/2021/10/08/bypass-403/

 

403 forbidden을 우회하는 4가지 방법들

때때로 보안 테스팅 시 WAF나 Application의 로직에 따라 403 Forbidden 으로 접근이 제한되는 경우가 있습니다. 보통은 백엔드의 처리 로직을 봐야 정확하게 우회할 수 있는 포인트를 잡겠지만, 몇가지

www.hahwul.com

 

 

Letter case #
대소문자를 이용해 우회할 수도 있습니다. 보통 Application 서버와 WAS 간의 처리 방식 차이로 발생하며 WAS에서 정규식 기반으로 차단하는 경우 이 케이스가 발생할 가능성이 높습니다.
Original: /secret
Upper: /SECRET

출처 ㅣhttps://www.hahwul.com/2021/10/08/bypass-403/

 

 

이를 위해 postman을 사용해야한다

 

 

 

Postman은 API 개발, 테스트, 디버깅 및 문서화를 위한 강력한 도구입니다. 클라이언트-서버 모델에서 API(RESTful, GraphQL, SOAP 등)를 쉽게 호출하고 응답을 분석할 수 있도록 설계되었습니다.

Postman은 개발자와 테스터가 네트워크 요청을 시뮬레이션하고, 요청/응답을 디버깅하며, API 문서를 관리하는 데 널리 사용됩니다.


주요 기능

  1. API 요청 및 응답 관리
    • GET, POST, PUT, DELETE, PATCH 등 다양한 HTTP 메서드를 지원.
    • URL, 헤더, 파라미터, 본문(body) 등을 설정해 API 요청을 보낼 수 있음.
    • JSON, XML, HTML 등 다양한 데이터 형식을 지원.
  2. 테스트 자동화
    • JavaScript 기반 스크립트를 사용해 API 응답의 유효성을 테스트할 수 있음.
    • 예: 상태 코드 확인, 응답 데이터 검증 등.
  3. 환경 변수 관리
    • URL, 인증 키 등을 환경 변수로 설정해 여러 API 요청에서 재사용 가능.
    • 개발, 스테이징, 프로덕션 환경 간 쉽게 전환 가능.
  4. 콜렉션(collection)
    • API 요청을 그룹화해 관리.
    • 요청 흐름을 설계하고 저장할 수 있어 테스트와 협업에 용이.
  5. 모니터링
    • API의 상태를 주기적으로 모니터링해 응답 시간을 측정하거나 이상 여부를 감지.
  6. 협업 기능
    • 팀 간에 API 요청, 테스트 스크립트, 환경 설정 등을 공유할 수 있음.
    • Postman Workspaces를 사용해 실시간 협업 지원.
  7. API 문서화
    • API 요청과 응답을 기반으로 자동으로 문서를 생성.
    • 문서를 팀원이나 클라이언트와 공유 가능.
  8. 통합
    • GitHub, GitLab, Jenkins 등과 통합해 CI/CD 워크플로우에서 활용 가능.

Postman의 주요 구성 요소

  1. 워크스페이스 (Workspace)
    • API 요청, 환경 변수, 테스트 스크립트 등을 저장하고 관리하는 공간.
    • 개인용 또는 팀용으로 설정 가능.
  2. 콜렉션 (Collection)
    • API 요청 그룹. 프로젝트별 또는 API별로 요청을 정리해 관리.
  3. 환경 변수 (Environment)
    • API 호출에 필요한 변수(예: URL, 토큰)를 설정해 여러 환경에서 쉽게 전환.
  4. 테스트 스크립트
    • 요청 전후(Post-Request, Pre-Request)에 실행되는 JavaScript 코드로, 요청과 응답의 유효성을 검사.

Postman의 활용 사례

  1. API 개발 및 테스트
    • 백엔드 API를 개발할 때 요청을 보내보고, 응답 데이터를 확인하며 디버깅.
  2. 프론트엔드와 백엔드 통신 테스트
    • 프론트엔드가 구현되기 전, Postman을 사용해 API를 먼저 테스트.
  3. 테스트 자동화
    • QA 팀에서 API 테스트 스크립트를 작성해 지속적으로 검증.
  4. API 문서화
    • API 호출 흐름과 응답 예시를 문서화해 팀원이나 클라이언트에게 제공.
  5. 데이터베이스와의 통신
    • 데이터베이스 관련 API 호출을 테스트하거나 디버깅.

Postman 사용 방법

  1. 요청 보내기
    • Postman 앱 실행 → New Request 클릭.
    • HTTP 메서드 선택(GET, POST 등).
    • URL 입력.
    • 필요한 헤더와 본문(body) 데이터 설정.
    • Send 버튼 클릭.
  2. 응답 확인
    • 서버로부터 받은 응답 코드(200, 404 등)와 데이터를 확인.
    • JSON, XML 등으로 포맷팅된 응답 데이터를 보기 쉽게 표시.
  3. 콜렉션 만들기
    • 여러 API 요청을 그룹화해 관리.
    • New Collection 클릭 → 요청을 추가.
  4. 테스트 추가
    • 요청의 Post-Script 영역에 JavaScript를 추가해 응답 데이터를 확인.
    • 예:
      pm.test("Status code is 200", function () {
          pm.response.to.have.status(200);
      });
      
  5. 환경 변수 설정

장점

  1. 사용자 친화적 인터페이스:
    • 직관적인 UI로 초보자도 쉽게 사용 가능.
  2. 강력한 기능:
    • 테스트 자동화, 모니터링, 협업 등 다양한 기능 제공.
  3. 무료 및 유료 버전:
    • 기본적인 기능은 무료로 제공되며, 팀 협업과 같은 고급 기능은 유료 플랜에서 제공.

Postman 설치

  1. Postman 공식 웹사이트에서 다운로드.
  2. Windows, macOS, Linux에서 사용 가능.

Postman 대체 도구

  1. Insomnia: API 테스트 및 디버깅 도구로 간단한 UI 제공.
  2. cURL: 명령줄 기반의 HTTP 요청 도구.
  3. Swagger UI: API 문서화와 테스트를 위한 웹 기반 도구.

Postman은 개발과 테스트, 협업까지 지원하는 API 중심 개발 환경으로, API 작업이 필요한 거의 모든 상황에서 유용하게 활용할 수 있습니다. 😊

 

 

 

 

postman이랑 brute suite랑 뭐가달라?
 

 

 

 

 

PostmanBurp Suite는 둘 다 웹 애플리케이션과 API의 테스트를 위해 사용되지만, 목적과 기능에서 중요한 차이가 있습니다. 아래에서 두 도구의 차이를 비교합니다.


1. Postman

목적

  • API 개발, 테스트, 디버깅, 문서화.
  • 개발자와 QA 팀이 정상적인 API 요청 및 응답을 테스트하는 데 초점.

주요 기능

  1. API 요청 및 테스트:
    • GET, POST, PUT, DELETE 등 다양한 HTTP 메서드 지원.
    • 헤더, 본문, 파라미터 등 요청 데이터 세부 설정 가능.
  2. 테스트 자동화:
    • JavaScript 기반 스크립트를 사용해 응답 데이터와 상태를 검증.
  3. 환경 관리:
    • 여러 환경(개발, 스테이징, 프로덕션)의 API 엔드포인트를 쉽게 관리.
  4. 협업 및 문서화:
    • API 요청 흐름을 문서화하고 팀과 공유.

사용 사례

  • API 개발 중 응답 데이터의 형식 검증.
  • API가 클라이언트 요청을 적절히 처리하는지 확인.
  • 네트워크 연결 및 동작 테스트.

2. Burp Suite

목적

  • 웹 애플리케이션 및 API의 보안 테스트 및 취약점 분석.
  • 침투 테스터 및 보안 전문가가 취약점을 발견하고 공격을 시뮬레이션하는 데 초점.

주요 기능

  1. 프록시 (Proxy):
    • 브라우저 트래픽을 가로채고 HTTP/HTTPS 요청 및 응답을 수정.
    • 요청을 변경하여 취약점을 탐지.
  2. 스캐너 (Scanner):
    • 웹 애플리케이션에서 취약점을 자동으로 탐지 (유료 버전 기능).
  3. 브루트포스 공격 (Brute Force):
    • 인증 우회, 세션 토큰 탈취, 파일 경로 추측 등 다양한 공격 시뮬레이션.
  4. 페이로드 테스트 (Intruder):
    • 자동화된 공격(예: SQL Injection, XSS)을 수행하여 취약점을 테스트.
  5. 리포트 생성:
    • 보안 평가 결과를 기반으로 상세 리포트를 생성.

사용 사례

  • SQL Injection, XSS, CSRF 등 취약점 탐지.
  • 인증 우회 및 세션 관리 테스트.
  • 취약점 자동화 스캔.

비교

특징 Postman Burp Suite

목적 API 개발 및 정상 동작 테스트 웹 애플리케이션 취약점 분석 및 보안 테스트
주 사용자 개발자, QA 침투 테스터, 보안 전문가
기본 기능 API 호출, 응답 검증, 문서화 프록시, 스캐너, 페이로드 테스트
테스트 대상 API와 서버 간 정상 요청/응답 웹 애플리케이션, API, 인증 시스템
공격 기능 없음 다양한 자동화 공격 기능
프록시 지원 지원하지 않음 브라우저 트래픽 가로채기 및 수정 가능
자동화된 취약점 분석 없음 유료 버전에서 제공 (스캐너)
학습 난이도 쉽고 직관적임 높은 난이도 (보안 지식 필요)

Postman이 더 적합한 경우

  1. API 개발 및 테스트:
    • RESTful API나 GraphQL API의 요청과 응답을 확인.
  2. 정상적인 API 요청/응답:
    • 응답 코드(200, 400, 500 등)를 확인하고 데이터의 정확성을 테스트.
  3. 팀 협업 및 문서화:
    • API 호출 흐름을 문서화하고 팀과 공유.

Burp Suite가 더 적합한 경우

  1. 보안 테스트:
    • SQL Injection, XSS, CSRF 같은 취약점을 찾고 공격 시뮬레이션.
  2. 웹 애플리케이션 침투 테스트:
    • 인증 시스템 우회, 세션 토큰 탈취 등 다양한 공격 수행.
  3. 자동화 스캐닝:
    • 대규모 취약점 스캔과 보고서 생성.

결론

  • Postman: API가 예상대로 작동하는지 확인하고 정상 요청/응답을 테스트하려는 개발자나 QA에게 적합.
  • Burp Suite: 보안 취약점을 탐지하고 공격 시뮬레이션을 수행하려는 보안 전문가나 침투 테스터에게 적합.

둘은 서로 다른 목적으로 설계되었으며, API 테스트와 보안 평가를 위한 상호 보완적인 도구로 사용할 수 있습니다. 😊

 

 

 

 

 

 

 

 

 

 

nginx.conf 소스코드

events {
    worker_connections  1024;
}

http {
    server {
        listen 80;
        listen [::]:80;
        server_name  _;
        
        location = /shop {
            deny all;
        }

        location = /shop/ {
            deny all;
        }

        location / {
            proxy_pass http://app:3000/;
        }

    }

}

/shop /shop/에 대해 다 deny되어있다

 

 

403 forbidden 우회 방법 중 대소문자를 이용해 우회가 가능하니 /SHOP으로 바꿔 POST요청을 보내주면 짜자잔~

 

어 어서오고~