MS-SQL 시스템 함수 PERMISSIONS
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 시스템 함수에 대해서 알아보았습니다
이상. 끝.