proxy-1 | Write-Up

0xqury·2025년 5월 14일

WebWriteups

목록 보기
2/8

1. 문제



2. 풀이

이 문제는 서버 내부에 존재하는 /admin 라우트에 접근하기 위해, 우회 경로로 /socket 라우트를 이용하는 프록시형 SSRF(Server-Side Request Forgery) 문제였다.

주요 관찰 사항

  • /admin은 내부 요청에만 응답하며, 다음 조건들을 모두 만족해야 플래그를 반환한다.

    • 요청 IP가 127.0.0.1일 것 (request.remote_addr)
    • User-Agent가 "Admin Browser"
    • 헤더 DreamhackUser: admin 포함
    • 쿠키 admin=true 포함
    • POST 파라미터 userid=admin 포함

SSRF 가능 지점

  • /socket 라우트에서 사용자가 임의의 host, port, data를 입력하면 서버가 socket으로 해당 위치에 연결하고 데이터를 전송함.
  • 즉, 이를 통해 서버가 자기 자신(127.0.0.1)에 요청을 보내도록 만들 수 있음.

해결 방법

  • host=127.0.0.1, port=8000 으로 설정하고,
  • data에는 다음과 같은 Raw HTTP POST 요청 문자열을 삽입함:
POST /admin HTTP/1.1
Host: 127.0.0.1
User-Agent: Admin Browser
DreamhackUser: admin
Cookie: admin=true
Content-Type: application/x-www-form-urlencoded
Content-Length: 12

userid=admin
  • Content-Length를 정확히 맞추지 않으면 조건이 깨지므로 userid=admin의 길이(12)를 정확히 명시해야 함.
  • 이 요청을 통해 /admin의 모든 조건을 만족시켜 내부적으로 flag를 반환받을 수 있었고, /socket_result.html에서 확인할 수 있었다.

3. 정리 및 느낀점

이번 문제는 단순한 SSRF가 아닌, Raw socket 조작과 HTTP 요청 구문에 대한 정확한 이해가 요구되는 실전형 문제였다.
단순히 요청을 우회하는 것이 아니라, 요청 헤더와 바디까지 수작업으로 구성해야 한다는 점이 흥미로웠다.

또한 request.remote_addr, 헤더, 쿠키, POST 파라미터 등 여러 요소를 동시에 만족시켜야 했기 때문에, HTTP 요청 구조에 대한 실력이 어느 정도 필요한 문제였다.

이 과정을 통해 SSRF가 얼마나 다양하게 활용될 수 있는지, 그리고 socket 레벨에서의 요청 구성의 중요성을 다시 한 번 체감할 수 있었다.


profile
지망생

0개의 댓글