THM: Intro to SSRF
Jr Penetration Tester > Introduction to Web Hacking > Intro to SSRF
SSRF = Side Request
항목 | SSRF | RFI |
뜻 | 서버가 공격자가 지정한 URL로 요청을 보내도록 유도 | 서버가 공격자가 지정한 URL의 파일을 include(포함) 하도록 유도 |
목적 | 내부망 접근, 메타데이터 조회, 포트스캔, 내부 서비스 공격 | 외부 파일을 서버에 포함/실행하여 명령 실행 등 |
이용 함수 | curl, file_get_contents(), fetch() 등 요청 관련 함수 | include(), require() 등 파일 불러오는 함수 |
주요 피해 | - 내부망 접근 (ex. 127.0.0.1:8000) |
구분 | SSRF | RFI |
서버가 요청하는가? | ✔️ 서버가 요청만 함 (데이터 가져오기) | ✔️ 요청 + 코드 실행 |
코드 실행 가능? | ❌ (보통 불가) | ✔️ (PHP로 실행) |
목표 | 내부 시스템 접근, 스캔, 우회 | 원격 코드 실행 (웹쉘, RCE) |
SSRF는 서버에게 내부망 또는 외부망 요청을 대신하게 만드는 것이고, RFI는 원격 파일 코드를 실행시키는 것
ssrf 방법도 여러가지가 있지만, 그 중 주목할만한 부분은 여기. 서브도메인을 조작하는 것이다. 페이로드가 &x=로 끝나는 것은 url 끝에 서버가 추가 path를 덧붙이지 않도록 막는 용도이고, 이후에 붙는 문자열을 url 경로가 아니라 쿼리 스트링 파라미터(?=)로 전환하는 역할을 한다.
server=http://attacker.com → 서버가 실제 요청하는 주소:
http://attacker.com/item/9
예를 들어서 나는 첫번째 주소처럼 요청을 한건데, 두번째처럼 /item/9가 붙는다. 이때
server=http://attacker.com&x=
이런식으로 &x=를 붙이면 뒤에 따로 경로가 안붙게 됨
원하는 주소가 https://server[.]website[.]thm/flag?id=9이거라서 server=뒤에 뒤에 server.website.thm/flag?id=9까지 적고, 뒤에는 &x로 날렸다.
&x이 없었다면 server.website.thm/flag?id=9/item/9 이런식으로 붙어버림 &x=를 붙이면 서버는 /item/9 같은 경로를 붙이지 않고, 그 뒤는 더 이상 경로(path)가 아닌, 추가적인 쿼리 문자열로 처리함
SSRF의 4가지 예
- URL 전체가 주소창에 파라미터로 쓰였을 때
- hidden field를 사용했을 때
- hostname 같은.. 부분 url
- only 경로
만약 아무런 출력값도 보이지 않는 블라인드 SSRF 공격 수행시 외부 HTTP 로깅툴을 사용해야 할 것이다.. requestbin.com 같은 걸로 모니터링할 수 있게.. 나만의 HTTP 서버나 버프스위트를 사용해도 되고
Deny List와 Allow List
- 추가 우회 방법은 바로 open redirect를 이용하는 것
예를들어 https://website.thm/link?url=https://tryhackme.com.
광고/마케팅 목적으로 visitors이 얼마나 많이 방문했는지 기록하려고 카운트를 세는 역할을 함
https://website[.]thm/ 으로 시작하는 주소여야만 할 때. 이때 이 기능을 사용할 수 있다. 내부 http 요청을 해커의 선택에 따른 도메인에.. 입력할 수 있도록
ACME 웹사이트에 들어가면
첫번째 /private 경로, 이 컨텐츠는 우리 ip로는 접근이 안된다는 에러 메시지를 표출할 것임
두번째 /customers/new-account-page에 있는 새 버전의 customer account page임
avatars의 경로가 /assets/avatars/1.png 라는 것 확인할 수 있음
그리고 내가 고른 아바타를 다시 보면 base64 인코딩된 것을 확인할 수 있음
이후 avatar를 다시 바꾸면서 값을 private으로 바꿔봄
x/../private !?
디렉터리/../ 구조로 경로를 정규화했을 때 원래보다 상위로 이동하는 효과가 있음