----
SQL 주입 공격 [ SQL injection, -注入攻擊 ]
웹 클라이언트의 반환 메시지를 이용하여 불법 인증 및 정보를 유출하는 공격. 웹 응용 프로그램에 강제로 구조화 조회 언어(SQL) 구문을 삽입하여 내부 데이터베이스(DB) 서버의 데이터를 유출 및 변조하고 관리자 인증을 우회할 수도 있다. 이 공격은 MS SQL 서버뿐만 아니라 모든 관계형 데이터베이스 관리 시스템(RDBMS)에서 가능하다.
SQL 주입 취약점 [ SIV, SQL Injection Vulnerability, -注入脆弱點 ]
입력문에 구조화 조회 언어(SQL)문에 대한 필터링이 없을 경우 해커가 SQL문으로 해석될 수 있는 입력을 시도하여 데이터베이스에 접근할 수 있는 보호 취약점. 웹 브라우저 주소(URL)창 또는 사용자 ID 및 패스워드 입력 화면 등에서 데이터베이스 SQL문에 사용되는 문자 기호(‘ 및 “)의 입력을 적절히 필터링하지 않은 경우에 해커가 SQL문으로 해석될 수 있도록 조작한 입력으로 데이터베이스를 인증 절차없이 접근, 자료를 무단 유출하거나 변조할 수 있다. 예를 들어 관리자 ID와 패스워드에 아래 문자열을 입력했을 때 로그인되면 취약점이 존재한다. ID : ’or 1=1 ; -- 패스워드 : ’or 1=1 ; --
출처 : 네이버 용어사전
----
----
SQL injection
웹 사이트의 취약점을 이용해 권한 없는 사용자가 정보를 할 수 있는 공격기법이라고 합니다.
SQL injection에대해 설명 드리기전에 Datebase와 Query문에 대해 조금은 알고 계셔야 하는대
기초 과정이니까 보시면서 이해하시는 방향으로 진행하겠습니다
DateBase에
test 테이블이 있고 그곳에 필드 userid와 userpw 가있다고 치고
그 필드 각각 userid 부분엔 nisam userpw부분엔 1234 이란 값 저장되어 있다고 치고
다음 Query문을 보면서 설명드리겠습니다.
Query문은
select 필드명1,필드명2 from 테이블명;
이런식으로 구성되는대 위에 만든 DB로 설명드리자면
select uesrid,userpw from test where userid='nisam' and userpw='1234' |
라고 입력하고 Query문을 위에 만든 DB에 보내게 된다면
userid='nisam'(true) userpw='1234' (true) |
가 되어 true and true = true로 정상적으로 작동하게 됩니다.
select uesrid,userpw from test where userid='nisam' and userpw='1023' |
만약 이런 Query문을 입력해서 보내게 된다면 어떻게 될까요?
userid='nisam'(true) userpw='1023' (false) |
가되어 true and false = false로 정상적으로 작동하지 않게 됩니다.
이제 직접 SQL injection을 해보면서 원리를 파악해보록 합시다.
이곳으로 접속해보세요
(이곳은 데모사이트 인대 웹해킹을 아무곳에서나 시도하면 잡혀갑니당)

이러한 로그인 창이 뜨는대요. 이 사이트의 SQL문을 추측해보자면
select uesrid,userpw from account where username='입력값' and password='입력값'
라고 추측할 수 있습니다 ( 필드명이나 테이블명 따윈 중요하지 않음)
이제 여기다가 아무값이나 입력해서 Query문을 보내보도록 합시다.

아이디와 비밀번호를 asdf로 입력해서 로그인을 시도한다면 아이디가 없다고 뜨고 로그인이 되지않습니다. 그이유는
select uesrid,userpw from account where username='asdf' and password='asdf' |
이라는 Query를 보내게 됬을탠대
username='asdf'(false) and password='asdf'(false) |
아이디가 존재하지 않아 비정상적으로 처리되어서 로그인이 되지 않았는겁니다.

다음엔 아이디와 비밀번호에 각각 'a을 입력하고 로그인해보세요. 이번에도 로그인이 안될탠대
아까와는 나오는 페이지가 조금 다를겁니다.

바로 에러 메세지 창이 뜨게 됩니다. 그이유는 Query문을 보게되면
select uesrid,userpw from account where username=''a' and password=''a' |
이러한 방식으로 보내졌을탠대
username=''a' and password=''a' |
'로 시작하고 '로 끝나야 하는대 이미 끝났는대 a가 나오게 되어 오류가 발생한것 입니다.
이제 위에 발생한 오류를 이용하여 Query문을 살짝 수정하여 원하는 값을 얻게 되는 SQL injection을
해보도록 하겠습니다.

아이디 부분에 admin 비밀번호에 'or'1'='1 을 입력하고 로그인 한다면 어떻게 될까요?

로그인이 성공하였습니다. 왜 로그인이 성공한걸까요 Query문을 보게되면
select uesrid,userpw from account where username='admin' and password=''or'1'='1' |
이런식으로 보내졌을탠대
username='admin'(true) and password=''(false)or'1'='1'(true) |
true and (false or ture = true) = ture
공백은 비밀번호가 아니기 때문에 false이고 1=1는 true 이니까 or로 인해 true가 된겁니다.
이해가 가시나요? 패스워드 부분에서 or을 넣어서 강제로 true가 되게 만든겁니다.
위에서 쓴 방법과 다르게 주석을 사용하여 Qurey문을 조작해서 로그인 해보도록 하겠습니다
SQL문에서의 주석은 --로 사용되어 --뒤에 입력된 부분은 모두 삭제되어 전송됩니다.

로그인에 admin'-- 비밀번호에는 아무거나 입력하시고 로그인 하시면 역시나

로그인에 성공하게 됩니다. 역시 Query문을 보면
select uesrid,userpw from account where username='admin'--' and password='asdfasdd' |
이렇게 되는대 실제로 주석 때문에 처리된 SQL문은
select uesrid,userpw from account where username='admin'(true) |
이로써 아이디부분이 true가 되어 로그인이 성공하게 됩니다.
대응방안
대응 방안으로는 데이터의 길이에 제한을 두는 방법이 있지만 이 방법보다는
로그인과 비밀번호 입력할때 특수문자의 제한을 두는 방법 또는
오류창을 이용자들에게 보여주지 않아 취약점을 쉽게 찾아낼 수 없게 하는 방법이 있습니다.
출처 : http://drew03011.blog.me/100105788412
----