Portswigger Lab: SSRF, Path Traversal, xxe(1)
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탄에서 계속...