모의해킹/웹

MS-SQL 시스템 함수 PERMISSIONS

경험한사람 2024. 5. 27. 22:01

 

MS-SQL 시스템 함수 PERMISSIONS

 

 

  기능 
     1. 현재 사용자가 SQL 구문 중 어떠한 것들을 사용할 수 있는지 (읽기, 쓰기, 삭제 등)를 확인

     2. 다른 사용자에게 어떤 SQL 권한을 부여해 줄 수 있는지를 확인

 

□  목표 
     SQL인젝션 공격 시
공격 목표 테이블에 대해 접근하고 사용 할 수 있는 권한은 어디까지 인지 확인

 

□  방법 
    목표 테이블의 id(컬럼) 값을 PERMISSIONS에 인자 값으로 대입 / 해석

 

□  퍼미션 확인 순서
    1. 목표 테이블의 id 값을 조회하여 PERMISSIONS의 인자 값에 대입 “PERMISSIONS(인자값)”

    2. PERMISSIONS(인자값) 입력으로 구한 값을 2진수로 변환

    3. 변환된 2진수를, 권한을 알아볼 수 있는 표에 대입하여 해석

 

□  퍼미션 해석 팁
    1. 변환된 값은 2진수(0 또는 1) 형태의, 숫자 값이 32비트로 표현 됩니다.
        ※ 32자가 되지 않을 때에는 부족한 앞쪽을 모두 0으로 채움

    2.  그중에서 상위(좌측) 16비트는 “다른 사용자에게 SQL 권한을 부여할 수 있는 권한”

    3.  하위(우측) 16비트는 “현재 사용자가 SQL 구문 중 어떠한 것들을 사용할 수 있는가”

 

   

여기서 상위보다 중요한 하위 16비트에 대해서만 알아보도록 하겠습니다.

 

위 표는 2진수로 표시되는 결과 값을 해석하는데 사용하는 표입니다. 

녹색의 경우 2 ¹ 이 “1”일때 UPDATE ALL 이라는 권한을 가진다는 의미입니다.

 

32비트로 표현하면 00000000 00000000 00000000 00000010 이렇게 표현 됩니다.  

2 ¹ 인 부분만 1로 셋팅이 되었을 때 권한입니다.

 

 

□  목표 테이블의 id 값을 조회하여 PERMISSIONS의 인자 값에 대입 후 “PERMISSIONS(인자값)” 확인

   1. 우선 DB내 어떤 테이블들이 존재하는지 알아봅시다. (테스트 페이지는 ㅇㅇㅇ 홈페이지 > 우편번호 조회 페이지입니다.)

   2. UNION을 이용해, 테이블 목록을 확인합니다. (xtype 컬럼을 이용해 사용자 테이블만 필터링) 
        ※  UNION 연산자에 대한 세부적인 설명을 하지 않습니다.

        ※ 테스트한 취약 홈페이지정보는 생략하였으니, 참고해서 교육 목적으로 참고해주시기바랍니다.

   3. 여러 가지 테이블중에 member_info 테이블에 대한 권한을 알아보도록 합니다.

   4. member_info 테이블의 id 값을 확인합니다. (id : 357576312)

   5. 획득한 id 값을 PERMISSIONS 함수에 대입합니다. -> 결과값 : 28703

   6. 획득한 결과값을 진수 변환기 프로그램을 이용하여 2진수로 변환합니다. (총 32비트중 부족한 비트는 0으로 채웁니다.)

                                                  00000000 00000000         /          01110000 00011111
                                                         상위 16비트                               하위 16비트

 

  7. 결과 값중 하위 16비트만 위의 표에 대입합니다.

 


 

최종적으로 조회해본 결과 0(거짓) 또는 1(참) 값 중에 1과 매칭되는 권한들을 살펴보면 member_info 테이블에 대한 권한은 REFERENCES ANY ~ SELECT ALL 권한까지 총 8가지 권한을 가지며, EXECUTE 권한은 없는 것으로 확인되었습니다. 이상으로 PERMISSIONS 시스템 함수에 대해서 알아보았습니다

 

이상.  끝.