[웹 해킹] SQL 인젝션 - 로그인 인증우회

2024. 4. 28. 16:35복습/인터넷 보안 실습

1. SQL 인젝션이란?
2. 실습 전 원리 이해
3. SQL 인젝션을 이용해 로그인 하기 [실습]

 

SQL 인젝션

 

데이터베이스 서버에서 실행되는 SQL문에 악의적인 코드를 추가하거나 삽입하여 권한이 없는 사람이 정보를 획득하거나 데이터를 삭제, 수정하는 공격기법을 말한다. 

 

 

SQL 인젝션 실습 전 배경지식

 

그럼 어디에 SQL문을 삽입할 수 있을까? 

가장 간단하게 떠올릴 수 있는 곳은 아마 로그인 창일 것이다.

 

기존에 구축했던 사이트 로그인 창에서 SQL 인젝션을 이용해 인증 우회를 해볼 것이다. 

(아무 사이트에서나 시도하면, 성공 여부와 관계없이 시도 자체가 불법적인 행위로 간주될 수 있으니 주의하길 바란다.) 

 

인증 우회란, 정상적인 인증 경로나 절차가 아닌 우회된 경로를 통해 인증을 거치지 않고 권한을 획득하거나 권한이 필요한 행위를 수행하는 보안 공격을 말한다.

 

즉, 올바른 ID와 PW를 입력해 로그인 하는 것이 아니라 로그인 창에 SQL문을 입력해 로그인을 하는 것이다.

 

그러기 위해서는 로그인 창에 작성되어있을 구문을 유추해볼 필요가 있는데,

지금은 처음이니 로그인 체크 asp의 일부를 보면서 이해해보도록 한다.

 

 

ID와 PW 체크는 이 구문에서 이루어진다.

 

구문을 자세히 살펴보면,

 

입력받은 아이디와 비밀번호를 DB에 있는 정보와 비교해본 뒤,

ID, PW가 모두 같은 회원의 모든 정보를 출력하도록 하는 구문이라는 것을 알 수 있다. 

 

순서대로 한 번 살펴보자.

 

1. DB에 저장된 ID와 로그인 창에서 입력 받은 ID가 같아야 하고(and),

DB에 저장된 비밀번호와 로그인 창에서 입력 받은 비밀번호가 같은 회원의

 

2. 모든(*) 정보를 찾는다(select).

 

3. member table 에서(from)

 

아이디 중복 사용 금지가 걸려있다면 올바르게 로그인 했을 때 해당 회원으로 로그인이 될 것이다.

 

 

member table이 다음과 같을 때, ID: test01, PW: aaaaaa 를 입력한다면 aaa로 로그인이 되는 것처럼..

 

 

하지만 ID: test01, PW: aaaaaa 를 입력하지 않아도 aaa로 로그인 할 수 있는 방법이 있는데, 

이게 sql 구문을 이용한 인증우회인 것이다.

 

SQL 인젝션 실습

 

 

where 의 조건을 만족시켜야 로그인을 성공시킬 수 있는데,

and 로 두 개의 조건이 묶여있기 때문에 두 조건 모두 충족시켜주어야 하는 것으로 보인다.

 

 

 

빨간색 박스로 표시한 곳이 우리가 아무 값이나 넣을 수 있는 곳이다. (로그인 창)

우리는 저 부분에 특정 구문을 삽입해 where 조건을 참으로 만들어주어야한다. 

 

 

어떤 값을 넣어주어야 할까?

 

사실 아주 다양한 방법으로 성공시킬 수 있다.

 

심지어, 

 

1. 아이디, 비밀번호 둘 다 모를 경우 (아이디 인증우회)

2. 아이디는 알고, 비밀번호를 모를 경우 (패스워드 인증우회)

3. 주석을 이용한 인증우회

 

모두 가능하다. 

 

하나씩 살펴보자.

 

아이디와 비밀번호 둘 다 모를 경우 (DB 맨 위에 있는 사람으로 로그인 됨)

 

하나를 알려주면 다른 것들도 감이 잡힐 것이다.

 

아이디와 비밀번호 둘 다 모를 경우 SQL 인젝션 인증우회를 하기 위해서는

 

각각의 값을 넣어주면 된다. 

 

ID : 아무거나 
PW : 아무거나' or '1'='1 

 

 

이렇게 되면 where 문이 참이 된다. 

 

왜?

 

or 를 넣어줌으로써 조건이 두 개로 나뉘게 되고

 

하나의 조건만 만족해도 참이 되는 구문으로 바뀌었기 때문에,

 

조건 1은 거짓, 조건 2는 참이므로 로그인을 성공할 수 있다.

 

 

이럴 경우엔 DB의 맨 위에 있는 회원으로 로그인이 된다. 

 

 

아이디는 알고, 비밀번호를 모를 경우 (해당 ID를 가진 사용자로 로그인)

 

 

이제 ID를 안다고 가정하자. 

 

이 때도 이전에 했던 방식과 비슷하게 하면 된다.

 

ID가 test01 이라고 주어졌을 경우

 

다음과 같이 입력해주면 된다. 

ID : test01' or '1'='1 (이 때, test01은 올바른 ID)
PW : 아무거나

 

 

여기서는 조건 1이 참, 조건 2가 거짓이 되고,

 

둘 중 하나가 참이면 되는 or가 있으므로 where는 참이 된다.

 

 

주석을 이용한 인증우회

 

 

DB에서 -- 는 주석이다.

 

 

그렇기 때문에 다음 사진에서도 where 조건이 무시 당한채 모든 사람의 정보가 뜬다.

 

만약, ID: test01 이라는 점을 알 때, 주석을 이용해 로그인을 해준다면

 

ID : test01'-- (이 때, test01은 올바른 ID)
PW : 아무거나

 

or를 사용해줄 때보다 훨씬 깔끔하게 처리해줄 수 있다. 

 

 

다양한 SQL 인젝션 쿼리

 

 

다음은 글에서 직접 설명하지 않은 조합인데 

 

직접 한 번씩 해보길 추천한다. 

 

(비슷해보이지만 조금씩 다르다.)

1. ID [ ‘or ‘1’=’1’ — ] PW [아무거나]
2. ID [ ‘or 1=1 — ] PW [아무거나]
3. ID [아무거나] PW [ 1’or 1=1 — ]
4. ID [아무거나] PW [ 1’ or ‘1’ = ‘1’ — ]