| 접근 통제 취약점 공격
- 취약한 접근 통제 리스크 사례
ㄴ URL이나 파라미터를 조작해 다른 사용자의 리소스에 접근하거나 허용되지 않은 기능을 실행할 수 있는 경우
ㄴ 적절한 인증 및 인가 과정을 거치지 않고 관리자 페이지에 접근할 수 있는 경우
ㄴ 디렉터리 트래버설 취약점과 같이 웹 디렉터리 경로를 벗어난 호스트 내부 경로의 리소스에 접근할 수 있는 경우
안전하지 않은 직접 객체 참조(IDOR 공격)
- IDOR(Insecure Direct Object Reference) 공격은 공격자가 요청 메시지의 URL이나 파라미터를 변경해 정상적으로 허용되지 않은 기능 실행 및 다른 사용자 리소스에 접근하는 공격
- 웹 사용자가 웹을 통해 제공되는 메뉴대로만 사용할 것이라 생각하고, 서버측 입력값 검증을 소홀이 하는경우 취약해지는 경우가 많음
- 실습은 버프 스위트의 인터셉트 기능을 이용해 POST 요청의 바디 부분에 전달되는 파라미터 조작 후 물건 가격 변경하기
ㄴ 극장 예매 사이트에서 티켓을 구매하는 페이지를 간단하게 구현한 것
ㄴ 영화 티켓 몇 장을 구매하시겠습니까? (티켓 가격 15유로)
티켓을 1(사용자 입력)장 주문합니다.
- 사용자 입력란에 티켓 개수 입력 후 Confirm 버튼 클릭 시 입력 개수만큼 티켓을 주문함, 가격은 15유로로 정해져 있고 사용자가 웹을 통해 변경할 수 없음
ㄴ 티켓을 주문하며 버프 스위트의 인터셉트 기능을 이용해 전달되는 요청메시지 확인
ㄴ 요청 메시지의 바디를 보면, ticket_quantity, ticket_price, action 파라미터가 각각 전달되고 있음
ㄴ 웹 페이지에서는 사용자가 티켓 가격을 변경할 수 없도록 되어 있었지만 ticket_price 파라미터를 통해 티켓 가격 정보가 전달되고 있음
==> 웹 페이지 메뉴 등 사용자 인터페이스로 변경할 수 없는 값이 파라미터를 통해 전달되면 주의깊게 봐야함
- 티켓 수량과 가격을 변경하고 요청을 전송시키면 1500장을 0유로에 구매했다고 표시됨
+Medium level
- 미디움 레벨의 요청 확인을 해보면 가격을 수정할 수 없게 파라미터가 나오지 않는다.
ㄴ &ticket_price= 의 파라미터를 추가하여 전송시켰더니 성공하였다.
ㄴ 소스코드를 확인해보면 미디움 레벨에서는 티켓 가격에 대한 내용이 있으면 처리가 되는 코드의 내용
+High level
- 위 방법으로 해도 하이레벨은 티켓 가격을 바꿀 수 없도록 되어있음
- 미디움 레벨과 파라미터가 동일하게 잡히나 소스코드를 확인해보면 ticket_price를 기존에 적혀있는 값으로 *연산하므로 수정이 되지 않음
| 추가 실습 Insecure Direct Object References
Insecure DOR (Change Secret)
+Low Level
- 검증단계(ID조회) 없이 패스워드 힌트 정보를 변경할 경우 발생하는 취약점을 이용한 공격
ㄴ 그러므로 접속된 계정을 이용해 다른 계정의 패스워드 힌트 정보를 변경할 수 있다.
- 아래 시나리오를 선택(SQL Injection(Login Form/user)) 후 bee/bug 로그인하여 패스워드 힌트 변경을 확인한다.
- 실습용으로 bee/bug계정이 아닌 SQL 인젝션으로 알아낸 A.I.M.의 계정 패스워드 힌트정보를 바꾸어 볼 것이다.
- Insecure DOR (Change Secret)로 돌아가 폼을 적고 요청내용을 확인해보면 입력한 내용과 현재 로그인 되어 있는 계정이 파라미터로 전달되고 있다.
ㄴ bee를 SQL인젝션으로 찾은 A.I.M.으로 바꾸고 보낸 뒤 다시 SQL 인젝션 페이지로 돌아가 확인하면 바뀐 것이 확인 가능하다.
+Medium Level, High Level
- 레벨로 설정 후 요청을 잡아보면 로그인정보가 나타나지 않고, 토큰값이 보내지고 있다.
ㄴ 이전의 실습방법처럼 &login= 로 파라미터를 추가, 수정하여 요청했으나 바뀌지 않았다.
- 소스코드를 확인해보면 미디움, 하이레벨은 토큰값이 보내지도록 되어있다.
ㄴ 검증단계가 들어가 있다.
Insecure DOR (Reset Secret)
- 버튼을 누르면 해당 로그인 계정의 패스워드 힌트가 버튼내용으로 초기화된다.
- 버튼 클릭 후 요청을 잡아서 내용 확인을 해보면 로그인계정과 내용이 파라미터로 전달되고 있다.
ㄴ 로그인 정보와 내용을 바꾸어 보낸 후 SQL 페이지로 이동해 확인했더니 바뀌어 있다.
+Medium Level, High Level
- 앞의 방법으로 실행이 되지 않음
ㄴ 소스코드 확인 시 해당 로그인한 계정에 대해서만 세션변수를 확인하여 실행하도록 구현이 되어있다.