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 요청을 처리하여 데이터를 검색하는 애플리케이션입니다. 사용자로부터 입력을 받고, 특정 조건에 따라 응답을 반환합니다. 코드에서 사용하는 주요 기능과 보안상 취약점 등을 분석합니다.
주요 구성 분석
- Express.js 설정:
- express: Node.js의 웹 프레임워크.
- words: 외부 모듈 ./ag에서 불러오는 데이터로, 이 데이터는 search() 함수에서 검색 대상이 됩니다.
- express.urlencoded({ extended: true }):
- POST 요청의 url-encoded 형식 데이터를 파싱하는 미들웨어.
- const express = require("express") const words = require("./ag") const app = express() const PORT = 3000 app.use(express.urlencoded({ extended: true }))
- 라우팅:
- 두 가지 주요 엔드포인트:
- GET /: 간단한 메시지를 반환.
- POST /shop: 사용자 입력(leg)을 처리하고 데이터를 검색.
- 두 가지 주요 엔드포인트:
- search 함수:
- words 배열에서 name 속성이 leg.toUpperCase()와 일치하는 객체를 찾습니다.
- 반환값:
- 일치하는 객체가 있으면 해당 객체.
- 없으면 undefined.
- function search(words, leg) { return words.find(word => word.name === leg.toUpperCase()) }
- 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)에 따라 동작이 결정됩니다.
- 코드 흐름:
- req.body.leg 값을 가져옵니다.
- 입력값이 'FLAG'이면 403: Access Denied를 반환.
- search() 함수로 데이터를 검색:
- 일치하는 데이터가 있으면 JSON 형식으로 반환.
- 없으면 404: Nothing 반환.
보안 및 취약점 분석
- 403 금지 조건 (FLAG 차단):
- leg 값이 'FLAG'로 입력되면 강제로 차단합니다.
- 이를 통해 중요한 데이터나 민감한 정보를 노출하지 않으려는 시도.
- 차단은 단순 문자열 비교로 이루어지며, 우회 가능성이 있습니다.
- 입력값을 조작하여 'flag', 'Flag'와 같은 대소문자 변형을 시도할 경우 차단되지 않을 수 있음.
- if (leg == 'FLAG'){ return res.status(403).send("Access Denied") }
- 데이터 검증 부족:
- leg 값이 제대로 검증되지 않고 바로 사용됩니다.
- 이는 SQL 인젝션, 경로 조작과 같은 공격에 취약할 가능성을 높입니다.
- 예: req.body.leg 값에 예상치 못한 문자를 삽입해 테스트.
- 외부 의존성 취약점 (words 모듈):
- ./ag 모듈에서 불러온 words 데이터가 어떤 구조인지 명시되지 않았습니다.
- 악의적인 데이터나 예기치 못한 값이 포함될 경우, 애플리케이션 동작이 불안정해질 수 있습니다.
- JSON 응답으로 민감한 데이터 노출 가능성:
- search() 결과가 바로 JSON 문자열로 반환됩니다:
return res.send(JSON.stringify(obj))
- 만약 words 배열에 민감한 정보가 포함되어 있다면, 이를 통해 쉽게 노출될 수 있습니다.
- search() 결과가 바로 JSON 문자열로 반환됩니다:
- HTTP 상태 코드 일관성 문제:
- 데이터가 없는 경우 404를 반환:
return res.status(404).send("Nothing")
- 하지만, 검색 실패는 반드시 404로 처리해야 하는 것은 아니며, 애플리케이션의 동작 의도에 따라 200 응답과 함께 실패 메시지를 반환하는 것이 더 자연스러울 수 있음.
- 데이터가 없는 경우 404를 반환:
개선 방안
- 403 조건 강화:
- 'FLAG'를 포함한 다양한 변형(대소문자 및 공백 포함)을 차단하려면 대소문자를 무시한 비교를 사용:
if (leg.toUpperCase().trim() === 'FLAG') { return res.status(403).send("Access Denied") }
- 'FLAG'를 포함한 다양한 변형(대소문자 및 공백 포함)을 차단하려면 대소문자를 무시한 비교를 사용:
- 입력값 검증:
- req.body.leg의 길이 및 유효성을 검증:
if (!leg || typeof leg !== 'string' || leg.length > 50) { return res.status(400).send("Invalid input") }
- req.body.leg의 길이 및 유효성을 검증:
- 외부 데이터의 신뢰성 강화:
- words 모듈의 데이터 구조를 명확히 정의하고, 서버 시작 시 검증:
if (!Array.isArray(words) || !words.every(item => typeof item.name === 'string')) { throw new Error("Invalid words data") }
- words 모듈의 데이터 구조를 명확히 정의하고, 서버 시작 시 검증:
- JSON 응답의 보안 강화:
- 검색 결과가 없을 때도 명확한 응답 제공:
if (!obj) { return res.status(404).json({ error: "No match found" }); } return res.json(obj);
- 검색 결과가 없을 때도 명확한 응답 제공:
- HTTP 상태 코드 일관성:
- 검색 실패를 200으로 반환하고 결과를 명확히 전달:
if (!obj) { return res.json({ success: false, message: "No match found" }); } return res.json({ success: true, data: obj });
- 검색 실패를 200으로 반환하고 결과를 명확히 전달:
요약
이 애플리케이션은 간단하지만 다음과 같은 보안 취약점을 내포하고 있습니다:
- 입력값 검증 부족.
- 단순한 조건 비교로 인한 우회 가능성.
- 외부 데이터에 대한 신뢰성 문제.
위에서 제시한 개선 방안을 적용하면, 보안성과 안정성이 강화된 애플리케이션을 만들 수 있습니다. 😊
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/
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 문서를 관리하는 데 널리 사용됩니다.
주요 기능
- API 요청 및 응답 관리
- GET, POST, PUT, DELETE, PATCH 등 다양한 HTTP 메서드를 지원.
- URL, 헤더, 파라미터, 본문(body) 등을 설정해 API 요청을 보낼 수 있음.
- JSON, XML, HTML 등 다양한 데이터 형식을 지원.
- 테스트 자동화
- JavaScript 기반 스크립트를 사용해 API 응답의 유효성을 테스트할 수 있음.
- 예: 상태 코드 확인, 응답 데이터 검증 등.
- 환경 변수 관리
- URL, 인증 키 등을 환경 변수로 설정해 여러 API 요청에서 재사용 가능.
- 개발, 스테이징, 프로덕션 환경 간 쉽게 전환 가능.
- 콜렉션(collection)
- API 요청을 그룹화해 관리.
- 요청 흐름을 설계하고 저장할 수 있어 테스트와 협업에 용이.
- 모니터링
- API의 상태를 주기적으로 모니터링해 응답 시간을 측정하거나 이상 여부를 감지.
- 협업 기능
- 팀 간에 API 요청, 테스트 스크립트, 환경 설정 등을 공유할 수 있음.
- Postman Workspaces를 사용해 실시간 협업 지원.
- API 문서화
- API 요청과 응답을 기반으로 자동으로 문서를 생성.
- 문서를 팀원이나 클라이언트와 공유 가능.
- 통합
- GitHub, GitLab, Jenkins 등과 통합해 CI/CD 워크플로우에서 활용 가능.
Postman의 주요 구성 요소
- 워크스페이스 (Workspace)
- API 요청, 환경 변수, 테스트 스크립트 등을 저장하고 관리하는 공간.
- 개인용 또는 팀용으로 설정 가능.
- 콜렉션 (Collection)
- API 요청 그룹. 프로젝트별 또는 API별로 요청을 정리해 관리.
- 환경 변수 (Environment)
- API 호출에 필요한 변수(예: URL, 토큰)를 설정해 여러 환경에서 쉽게 전환.
- 테스트 스크립트
- 요청 전후(Post-Request, Pre-Request)에 실행되는 JavaScript 코드로, 요청과 응답의 유효성을 검사.
Postman의 활용 사례
- API 개발 및 테스트
- 백엔드 API를 개발할 때 요청을 보내보고, 응답 데이터를 확인하며 디버깅.
- 프론트엔드와 백엔드 통신 테스트
- 프론트엔드가 구현되기 전, Postman을 사용해 API를 먼저 테스트.
- 테스트 자동화
- QA 팀에서 API 테스트 스크립트를 작성해 지속적으로 검증.
- API 문서화
- API 호출 흐름과 응답 예시를 문서화해 팀원이나 클라이언트에게 제공.
- 데이터베이스와의 통신
- 데이터베이스 관련 API 호출을 테스트하거나 디버깅.
Postman 사용 방법
- 요청 보내기
- Postman 앱 실행 → New Request 클릭.
- HTTP 메서드 선택(GET, POST 등).
- URL 입력.
- 필요한 헤더와 본문(body) 데이터 설정.
- Send 버튼 클릭.
- 응답 확인
- 서버로부터 받은 응답 코드(200, 404 등)와 데이터를 확인.
- JSON, XML 등으로 포맷팅된 응답 데이터를 보기 쉽게 표시.
- 콜렉션 만들기
- 여러 API 요청을 그룹화해 관리.
- New Collection 클릭 → 요청을 추가.
- 테스트 추가
- 요청의 Post-Script 영역에 JavaScript를 추가해 응답 데이터를 확인.
- 예:
pm.test("Status code is 200", function () { pm.response.to.have.status(200); });
- 환경 변수 설정
- Environments에서 환경 변수 생성.
- 예: {{base_url}} → https://api.example.com.
장점
- 사용자 친화적 인터페이스:
- 직관적인 UI로 초보자도 쉽게 사용 가능.
- 강력한 기능:
- 테스트 자동화, 모니터링, 협업 등 다양한 기능 제공.
- 무료 및 유료 버전:
- 기본적인 기능은 무료로 제공되며, 팀 협업과 같은 고급 기능은 유료 플랜에서 제공.
Postman 설치
- Postman 공식 웹사이트에서 다운로드.
- Windows, macOS, Linux에서 사용 가능.
Postman 대체 도구
- Insomnia: API 테스트 및 디버깅 도구로 간단한 UI 제공.
- cURL: 명령줄 기반의 HTTP 요청 도구.
- Swagger UI: API 문서화와 테스트를 위한 웹 기반 도구.
Postman은 개발과 테스트, 협업까지 지원하는 API 중심 개발 환경으로, API 작업이 필요한 거의 모든 상황에서 유용하게 활용할 수 있습니다. 😊
postman이랑 brute suite랑 뭐가달라?
Postman과 Burp Suite는 둘 다 웹 애플리케이션과 API의 테스트를 위해 사용되지만, 목적과 기능에서 중요한 차이가 있습니다. 아래에서 두 도구의 차이를 비교합니다.
1. Postman
목적
- API 개발, 테스트, 디버깅, 문서화.
- 개발자와 QA 팀이 정상적인 API 요청 및 응답을 테스트하는 데 초점.
주요 기능
- API 요청 및 테스트:
- GET, POST, PUT, DELETE 등 다양한 HTTP 메서드 지원.
- 헤더, 본문, 파라미터 등 요청 데이터 세부 설정 가능.
- 테스트 자동화:
- JavaScript 기반 스크립트를 사용해 응답 데이터와 상태를 검증.
- 환경 관리:
- 여러 환경(개발, 스테이징, 프로덕션)의 API 엔드포인트를 쉽게 관리.
- 협업 및 문서화:
- API 요청 흐름을 문서화하고 팀과 공유.
사용 사례
- API 개발 중 응답 데이터의 형식 검증.
- API가 클라이언트 요청을 적절히 처리하는지 확인.
- 네트워크 연결 및 동작 테스트.
2. Burp Suite
목적
- 웹 애플리케이션 및 API의 보안 테스트 및 취약점 분석.
- 침투 테스터 및 보안 전문가가 취약점을 발견하고 공격을 시뮬레이션하는 데 초점.
주요 기능
- 프록시 (Proxy):
- 브라우저 트래픽을 가로채고 HTTP/HTTPS 요청 및 응답을 수정.
- 요청을 변경하여 취약점을 탐지.
- 스캐너 (Scanner):
- 웹 애플리케이션에서 취약점을 자동으로 탐지 (유료 버전 기능).
- 브루트포스 공격 (Brute Force):
- 인증 우회, 세션 토큰 탈취, 파일 경로 추측 등 다양한 공격 시뮬레이션.
- 페이로드 테스트 (Intruder):
- 자동화된 공격(예: SQL Injection, XSS)을 수행하여 취약점을 테스트.
- 리포트 생성:
- 보안 평가 결과를 기반으로 상세 리포트를 생성.
사용 사례
- SQL Injection, XSS, CSRF 등 취약점 탐지.
- 인증 우회 및 세션 관리 테스트.
- 취약점 자동화 스캔.
비교
특징 Postman Burp Suite
목적 | API 개발 및 정상 동작 테스트 | 웹 애플리케이션 취약점 분석 및 보안 테스트 |
주 사용자 | 개발자, QA | 침투 테스터, 보안 전문가 |
기본 기능 | API 호출, 응답 검증, 문서화 | 프록시, 스캐너, 페이로드 테스트 |
테스트 대상 | API와 서버 간 정상 요청/응답 | 웹 애플리케이션, API, 인증 시스템 |
공격 기능 | 없음 | 다양한 자동화 공격 기능 |
프록시 지원 | 지원하지 않음 | 브라우저 트래픽 가로채기 및 수정 가능 |
자동화된 취약점 분석 | 없음 | 유료 버전에서 제공 (스캐너) |
학습 난이도 | 쉽고 직관적임 | 높은 난이도 (보안 지식 필요) |
Postman이 더 적합한 경우
- API 개발 및 테스트:
- RESTful API나 GraphQL API의 요청과 응답을 확인.
- 정상적인 API 요청/응답:
- 응답 코드(200, 400, 500 등)를 확인하고 데이터의 정확성을 테스트.
- 팀 협업 및 문서화:
- API 호출 흐름을 문서화하고 팀과 공유.
Burp Suite가 더 적합한 경우
- 보안 테스트:
- SQL Injection, XSS, CSRF 같은 취약점을 찾고 공격 시뮬레이션.
- 웹 애플리케이션 침투 테스트:
- 인증 시스템 우회, 세션 토큰 탈취 등 다양한 공격 수행.
- 자동화 스캐닝:
- 대규모 취약점 스캔과 보고서 생성.
결론
- 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요청을 보내주면 짜자잔~
'Dreamhack > Dreamhack Wargame (Challenge)' 카테고리의 다른 글
[102] IT 비전공자 [dreamhack]Cherry문제 풀기 (0) | 2024.12.20 |
---|---|
100번째 문제 기념! 500등대 진입! (1) | 2024.12.18 |
[100] IT 비전공자 [dreamhack]FFFFAAAATTT문제 풀기 (1) | 2024.12.18 |
[99] IT 비전공자 [dreamhack]pwn-library문제 풀기 (0) | 2024.12.17 |
[98] IT 비전공자 [dreamhack]Small Counter문제 풀기 (1) | 2024.12.16 |