-
SQL Injection보안 2017. 11. 17. 14:16
SQL Injection
1. SQL Injection 이란?
사용자가 서버에 제출한 데이터가 SQL query로 사용되어 Database나 시스템에 영향을 주는 공격기법입니다.
데이터 베이스와 연동된 웹 응용 프로그램에서 입력된 데이터의 유효성 검증을 하지 않는 보안취약점을 이용한 공격으로 예상치 못한 SQL문이 실행되어 정보 유출로 이어질 수 있습니다.
SQL Injection은 주로 사용자에게 이름이나 ID와 같은 입력을 요청할 때 발생 하며 정상적인 값 대신에 데이터 베이스에서 실행할 SQL문을 입력합니다.
로그인 창을 예로 들면 ID와 Password를 입력하는 부분이 있는데 이곳에
ID : test, Password : qwerty
이렇게 입력하고 로그인 버튼을 누르게 되면 이 값이 서버의 Database로 가서 ID가 test이고 비밀번호가 qwerty인지 검사합니다. 이 부분에 취약점이 존재하는데 만약 서버에서 ID와 비밀번호를 아래와 같은 방법으로 검사한다고 가정해봅시다.
" SELECT * FROM user WHERE id='test' and password='qwerty'"
여기서 SQL 인젝션을 하여 로그인 창에 ID : test, Password : 9' or '1=1' 이렇게 입력하면
" SELECT * FROM user WHERE id='test' and password='9' or '1=1'"
SQL 문을 이렇게 변경할 수 있습니다. 이렇게 되면 'or' 연산을 통해 SQL문이 참이 되버립니다. 이렇게 되면 test 사용자의 비밀번호를 모르고도 접속할 수 있게 됩니다.
2. SQL Injection 공격 종류
1. 인증 우회
- 이 공격은 위에서 예로 든 것처럼 로그인 페이지를 타켓으로 하는 공격입니다. SQL 문의 True/False의 논리적 연산 오류를 이용하여 로그인 인증 쿼리문이 무조건 True가 나오도록 하는 것이 원리입니다.
ex> admin' /*
admin' or 1=1 /*
admin') or ('1'='1 를 입력
2. 데이터 노출
- Error based 방식
: Database의 에러 메시지를 기반으로 한 공격으로 SQL문 중 group by 와 having 구문을 사용하여 일부로 에러를 발생시켜 에러정보를 바탕으로 Database의 정보(Database 명, table, column)를 파악하는 방법입니다.
ex> www.example.com/?id=1 과 같은 구조를 가지는 URL에서 www.example.com/?id=1' having 1=1-- 를 실행하면 에러가 발생한다. 에러 정보가 웹페이지에 보여지도록 설정되어 있다면
Microsoft OLE DB Provider for SQL Server (0x80040E14)
'member.id' 열이 집계 함수에 없고 GROUP BY 절이 없으므로 SELECT 목록에서 사용할 수 없습니다.
위와 같은 에러 정보가 보여질 것입니다. 그러면 우리는 이 쿼리에 사용되는 테이블이 member이고 첫번째 컬럼이 'id'라는 것을 알 수 있습니다.
그리고 www.example.com/?id=1' group by id having 1=1-- 이렇게 입력하면
Microsoft OLE DB Provider for SQL Server (0x80040E14)
'member.bID' 열이 집계 함수에 없고 GROUP BY 절이 없으므로 SELECT 목록에서 사용할 수 없습니다.
이와 같은 에러 정보를 볼 수 있습니다, 그러면 우리는 또 두번째 컬럼이 'bID' 라는 것을 알 수 있습니다.
이와 같은 방식을 반복하면 해당 테이블의 컬럼명을 모두 알아낼 수 있게 됩니다.
- Union based 방식
: union 연산자를 이용하여 공격자가 입력한 쿼리를 파라미터에 붙여서 원하는 정보를 획득하는 방식입니다.
ex> Error based 방식에서 든 예를 사용하겠습니다.
www.example.com/?id=-100+union+select+1,2,3,4,5--
위와 같이 파타미터 값으로 존재하지 않을만한 값을 지정하거나 and 1=0 과 같이 결과가 참이 나올 수 없는 조건문을 추가하여 union 앞의 쿼리가 부정 조건이 되도록 해줍니다.
그러면 실제 유효한 쿼리는 union을 통해 추가한 부분밖에 없고 웹페이지에 1,2,3,4,5 컬럼중 몇개의 정보가 보여질 것입니다.
3. 원격 명령 실행 (Remote Command Execution)
저장 프로시저를 이용하여 파라미터를 조작하여 쉘 수행, 쿼리 결과를 HTML로 제공, 서비스 시작/중지, 시스템 정보 획득 등 시스템 상에 공격하는 방식입니다.
3. 방어 방법
- 서버에 오류가 발생 했을 때 해당 에러 메시지를 표시하지 않도록 합니다.
- DB로 특수문자가 넘어가지 않도록 PHP의 addslashes 와 같은 함수를 이용하여 특수문자를 일반형으로 변경하여 값을 넘겨주는 방식을 이용합니다.
- SQL 매개변수를 사용하여 SQL 엔진이 매개변수가 올바른지 확인하도록 합니다.
'보안' 카테고리의 다른 글
Cross Site Scripting (XSS) (0) 2017.12.01