R's Hacking Daily Log

SSRF - Lab (4) 본문

Port Swigger/SSRF

SSRF - Lab (4)

hanhxx 2023. 7. 10. 11:56

SSRF with whitelist-based input filters

Lab(3)에서는 Blacklist 기반의 input filter를 적용한 사례를 살펴보았다.

이번 Lab에서는 그와 반대로 whitelist 기반으로 input filter가 적용된다고 한다.

 

Blacklist가 list에 해당하는 경우를 차단하는 식이라면

Whitelist는 list에 해당하는 경우만 허용하는 식으로 동작한다. 

 

 

whitelist 기반의 input filter가 동작하는 경우

1) @ 기호를 사용해 hostname 앞에 Credential을 작성할 수 있다.

: 흔히 말하는 이메일의 형태를 생각하면 된다. 

http://expeted-host:fakeCred@evil-host

 

2) # 기호로 URL fragment를 할 수 있다. 

: fragment를 사용하게 되면 # 기호 이전에 작성된 내용만을 유효하게 인식한다. 

https://evil-host#expected-host

https://evil-host#expected-host/dir1/dir2

첫 번째 url의 경우 #을 기준으로 뒤에 작성된 expected-host는 실질적인 url 값으로 반영되지 는다. 

두 번째 url의 경우는 #을 기준으로 expected-host가 무시되고 "/"부터 다시 값을 취하게 된다.

 

#은 hostname 영역에서만 영향을 미치기 때문에 #이 나오기 전까지의 hostname을 사용한다고 생각하면 된다. 

다른 말로 하면 #에서부터 path가 나오는 /까지의 값은 날아가버린다.

 

3) double URL encoidng으로 url pasing 과정을 우회할 수 있다. 

: Lab(3)에서 admin의 'a'만 두 번 url encoding 한 값을 사용한 경우를 생각하면 된다. 

 

4) 그밖의 방법들까지 혼합해서 사용한다. 

 

 

Lab - SSRF with whitelist-based input filter

위에서 정리한 내용을 바탕으로 4번째 lab을 풀어보자!

재고를 확인하는 버튼을 눌러 packet을 확인해 봤더니 지금까지 봤던 localhost는 보이지 않고 

"stock.weliketoshop.net"이라는 hostname이 보인다. 

 

 

http://localhost/admin으로 값을 조작해 보내봤더니 host는 반드시 stock.weliketoshop.net 이어야 한다고 한다.

url 값에 stock.weliketoshop.net이라는 값이 반드시 포함되어야 하는 거 같다. 

 

 

그렇다면..!

localhost/admin에 접근하기 위해 stock.weliketoshop.net을 포함한 url을 만들어야 한다.

우선 @를 사용할 수 있는 지 확인해 봤더니 internal server error가 발생한다. 

@ 기호는 유효하다는 소리다. 유효한 값이 아니면 아래와 같이 응답이 온다. 

 

 

fragment 하기 위해 #을 추가해 봤더니 오른쪽과 같은 응답이 돌아왔다. 

 

host가 stock.weliketoshop.net이어야 한다는 문구인데

url 값에서 #을 stock.weliketoshop.net 앞에 사용했기 때문에 해당 값이 적용되지 않아 발생하는 문구이다. 

 

 

# 기호를 double url encoding하면 다시 아래와 같은 에러가 난다.

 

 

url encoding을 한 번만 한 경우에는 #을 그대로 사용했을 때와 동일한 에러가 발생한다. 

 


! 여기서 url encoding을 두 번한 값을 사용하는 이유를 생각해 보자.

현재 문제는 stockApi 값에 stock.weliketoshop.net이 host로 포함되어야 한다는 것이다. 

 

그래서 stock.weliketoshop.net이 url에 포함되어 whitelist를 통과하되

실제 url로 유효하지 않기를 바란다. 

 

이를 이루기 위해서 @ 기호를 사용해 host를 두 개 작성할 것이다. (위에서 살펴본 1) 형태)

그러고 나서 # 기호를 이용해 stock.weliketoshop.net은 whitelist를 통과한 후 버려지게 만들고자 하는 것이다.

 

이때 whitelist를 통과하기 위해서는 #이 바로 기능을 수행하게 되면 안 된다.

(그러면 stock.weliketoshop.net 값이 날아가버림)

 

따라서 URL encoding을 해서 internal server error가 발생시키는 경우를 찾은 것이다. 

해당 에러가 난다는 건 # 기호를 사용했지만 아직까지 포함해야 하는 host 값이 적용되고 있다는 뜻이다. 


지금까지 알아낸 내용을 정리해 보면 

@ 기호와 double url encoded # 기호를 사용할 수 있다는 것이다.

 

그렇다면 이젠 localhost/admin에 접근하기 위한 url을 작성해 보자. 

http://localhost%25%32%33@stock.weliketoshop.net/admin

위와 같은 값을 stockApi에 넣으면 admin panel이 나오는 페이지에 접근할 수 있을 것이다.

이번 Lab의 목표인 carlos 계정을 삭제하기 위한 url도 만들어보자. 

 

http://localhost%25%32%33@stock.weliketoshop.net/admin/delete?username=carlos

%25%32%33이 # 기호를 두 번 url encoding 한 값이다. 

 

 

해당 url이 파싱 되어 사용되는 과정에서 # 기호를 기준으로 뒤에 작성된 @stock.we~.net은 날아가고

결과적으로 만들어지는 url은 

http://localhost/admin/delete?username=carlos

위와 같아진다.

 

 

 

재고 확인 버튼을 눌러 packet을 가로챈 다음 stockApi 값을 수정해 보내면 

 

 

Lab이 성공적으로 해결된 걸 볼 수 있다!

'Port Swigger > SSRF' 카테고리의 다른 글

SSRF - Lab (5)  (0) 2023.07.11
SSRF - Lab (3)  (0) 2023.07.09
SSRF - Lab (2)  (0) 2023.06.28
SSRF - Lab(1)  (0) 2023.06.27
SSRF (1)  (0) 2023.06.27
Comments