티스토리 뷰

72번째 글.

 

 

1. 시나리오

You are performing a web application penetration test for a software development company, and they task you with testing the latest build of their social networking web application. Try to utilize the various techniques you learned in this module to identify and exploit multiple vulnerabilities found in the web application.

 

 

2. 인터페이스

문제에서 알려준 htb-student / Academy_student!로 로그인을 하면 위 화면과 같이 나온다.

작동되는 기능은 Settings에서 사용자의 비밀번호를 변경할 수 있는 기능 뿐 이었다.

 

3. Walkthrough

3.1 IDOR

먼저 프로필 페이지를 새로고침 해보았다. 눈여겨볼 점은 쿠기에 uid값으로 74가 들어가 있다는 점이다.

forward를 해보면

 

이렇게 REST방식으로 자원에 대한 정보를 가져오는 것 같았다.

 

그래서 uid정보를 1로 바꿔서 보내봤더니 정상적으로 uid=1에 해당하는 사용자 정보를 받을 수 있었다.

분명 admin 계정에 대한 정보도 있을 것 같아서 intruder를 이용했다.

 

역시 이렇게 admin에 대한 계정 정보를 찾을 수 있었다. 

uid=52로 api를 호출할 때 값을 변경해서 다시 보내봤다.

 

이렇게 관리자 계정으로 접근할 수 있었다.

하지만 역시 추가되는 동작은 없었고 비밀번호를 바꾸는 기능밖에 동작하지 않았다.

그렇기 때문에 비밀번호를 변경하여 admin계정으로 로그인을 해봐야 할 것 같다는 느낌이 들었다.

 

 

3.2 HTTP Verb Tampering & Privilege Escalation

버프로 잡아보면 POST방식으로 uid와 토큰 그리고 password를 보내고 있었다.

uid 부분만 바꿔서 보내보면 ACCESS DENIED!라고 나와서 아래와 같이 HTTP method를 바꿔주고 보내보았다.

 

이번에는 정상적으로 비밀번호를 바꿀 수 있었다.

(참고로 우클릭-> change request method를 통해서 POST->GET으로 빠르게 바꿀 수 있다.)

 

admin 계정인 a.corrales와 내가 바꿔준 비밀번호로 로그인을 하면 

 

위 사진처럼 오른쪽에 또 하나의 기능이 추가된 admin의 프로필을 확인할 수 있었다.

 

 

3.3 XXE Injection

이제 admin 계정에 있는 일정 추가 기능을 보겠다.

 

일정추가 기능은 위처럼 XML을 이용해 데이터를 전송하고 있었다.

그리고 화면에는 <name> 태그에 해당하는 데이터를 출력하고 있었다.

 

간단히 PoC 코드를 통해서 injection이 정상적으로 수행됨을 볼 수 있었다.

하지만 우리는 /flag.php 파일을 출력해야 하는데 php 파일 같은 경우는 XML에서 사용하는 특수문자(e.g. </>/&)가

포함되어있기 때문에 외부 객체 참조가 제대로 안될 가능성이 크다. (그냥 해보면 아무것도 안 찍힌다.)

그렇기 때문에 PHP Wrapper를 이용하여 base64로 인코딩해줘야 한다.(이 방법은 PHP 웹 애플리케이션에서만 작동된다.)

 

php://filter/convert.base64-encode/resource=/flag.php로 설정하면 위 사진처럼 인코딩 된 /flag.php의 내용을 확인할 수 있다.