Public/Portswigger Lab

Portswigger Lab: SSRF, Path Traversal, xxe(1)

haru0909 2025. 2. 1. 20:24

1. SSRF : Open Redirect 취약점과 콜라보레이션

 

 

check stock 버튼을 누르면 /product/stock POST 요청을 보낸다.

 

 

/product/stock 엔드포인트에서는 문제에서 나와있듯이 로컬 애플리케이션에 접근하도록 제한되어 있었다.

stockApi 파라미터를 통해 접근할 path를 입력할 수 있는 것이 중요 포인트이다.

stockApi=/product/stock/check?productId=1&storeId=1

 

 

 

다음 제품을 클릭하면 /product/nextProduct 엔드포인트를 요청하는데,

path 파라미터에 http://192.168.0.12:8080/admin/ 를 입력하면 찾아가려고 한다. 오픈 리다이렉트 취약점이 있다.

다만 해당 ip는 내부이기 때문에 이 포인트에서 사용할 수가 없다.

 

 

그래서 해당 파라미터를 로컬 애플리케이션에 제한된 stockApi에 넣어준다.

stockApi=/product/nextProduct?currentProductId=3%26path=http://192.168.0.12:8080/admin

그러면 192.168.0.12:8080/admin 페이지에 접속이 가능하며, carlos를 삭제할 수 있다.

 

 

SSRF는 아쉽게도 위 문제 빼고 다 풀어져 있어서(*burp pro 버전 문제 제외) 끝이났다. 

 


2. Path Traversal: url decoding

 

 

 

문제에서 말한 대로 이미지에 공격이 가능하게 생긴 param이 있다. 

 

 

url decoding을 수행한다기에, 그러면 더블 인코딩도 막을 것인가 하면서 ../../../../etc/passwd를 더블인코딩 해서 보냈더니 바로 끝났다. 이런 것도 기록을 남겨야 하나.. 흠.

 


 

3. Path Traversal: 경로 지정 우회

 

번역이 잘 안 되어서 무슨 상황인지 잘 모르겠다. 일단 들어간다.

 

 

이미지를 확인하면 filename 파라미터가 있는 것을 볼 수 있다.

 

 

filename 값을 /etc/passwd로 바꿔 보내면 filename 파라미터가 없다는 오류가 나타난다. 

filename 파라미터는 존재하는데 왜 이런 에러가 나타나는지 모르겠지만 일단 후퇴한다.

 

 

아마 지정된 경로(여기선 /var/www/image)를 확인하는 코드가 있는 것 같다.

/var/www/image를 그대로 두고 뒤에 path traversal 구문을 넣어주면 /etc/passwd를 에러없이 확인할 수 있다. 

 

 

Path traversal도 남은 문제가 2개였어서 종료.

 


4. XXE: XXE를 이용하여 SSRF 취약점 실행  

 

 

 

문제에서 언급한 대로, 재고 확인 기능이 있다. Check stock을 클릭한다.

 

 

클릭 시 xml 형식으로 data를 보낸다. xxe를 실행하는 source인가 보다.

 

 

xml에 'haru'라는 외부 entity를 추가했다. (system은 이 개체가 외부 시스템 리소스를 가리키고 있음을 의미)

그리고 productId에 haru를 참조했다. &haru;는 xml 이 파싱될 때  "http://169.254.168.254/" 내용으로 대체된다.

전송 후 invalid product ID: latest 라는 응답이 왔다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE stockCheck [
<!ELEMENT stockCheck ANY>
<!ENTITY haru SYSTEM "http://169.254.169.254/">
]>
<stockCheck>
  <productId>&haru;</productId>
  <storeId>1</storeId>
</stockCheck>

 

 

latest를 path로 붙여서 전송하니 응답에서 meta-data라는 값이 출력됐다.

meta-data도 path에 넣으며 계속 이어간다.

 

 

 

출력된 값을 모두 path에 넣었더니 결국 key가 노출되었다.

 

xxe는 2탄에서 계속...