WEB/SQL

[SQL INJECTION] SQL 기본 문법 정리 Ⅲ (연산자)

뇨롱 2020. 8. 22. 22:55

이 포스트는 인프런의 성공적인 SQL 인젝션 공격을 위한, SQL 기본 문법 강의를 보고 작성하였습니다!

 

SQL 의 연산자는 기존에 다른 언어들과 비슷한 형식이다. 

 

0. 연산자와 피연산자

1. 산술연산자

(1) 종류: +,-,*,/

 

ex) select 절을 이용해서 출력가능.

select 1+4;

(2) 산술 연산자와 injection간의 관계

: seq에 숫자를 받는 경우.

 

<코드>

select * from member where seq=6-1;

2. 비교 연산자(관계)

(1) 종류: < , < =, >=, !=, ~, =

3.1 논리 연산자

(1) 종류: 

AND, OR, NOT

 

*우선순위: NOT → AND → OR

 

3.2 비트 논리 연산자

(1) 종류: 

AND, OR, NOT (논리연산자와 같다)

DBMS AND OR XOR
ORACLE bitand(피연산자1, 피연산자2) X X
MSSQL 피연산자 & 피연산자2 피연산자1 | 피연산자2 피연산자1 ^ 피연산자2
MYSQL 피연산자 & 피연산자2 피연산자1 | 피연산자2 피연산자1 ^ 피연산자2

★비트 논리 연산자를 쓰는 이유: 이진연산이 십진수 연산보다 빠르기 때문.

(2) 특징

① ORACLE 은 bitand함수를 이용 → OR, XOR 연산도 bitand를 이용해서 표현

비트 연산이기 때문에 비트각각으로 따져줘야함.

(3) 비트 논리 연산자와 injection간의 관계: blind base 를 이용한 sql injection 비트 단위의 공격이 많이 사용됨.

 

4. 연결 연산자

(1) 종류

DBMS 연산자 표현식 예시
ORACLE || 피연산자1 || 피연산자2 'TE' || 'ST'
MSSQL + 피연산자1 + 피연산자2 'TE' + 'ST'
MYSQL 공백 피연산자1 공백 피연산자2 'TE' 공백 'ST'

★DBMS 공통적으로 CONCAT(문자열1, 문자열2...) 함수 사용이 가능하다

 

 

mysql 에서는 문자열 형태이면 공백이 두개를 붙여주는 역할을 함. 

▶concat 함수를 사용한 경우,

5. IN 연산자

(1) 형식

ex)

SELECT name, email, FROM member WHERE id in('adimin','guest');

∨ or 연산자를 계속 사용한 효과가 나옴.

서브쿼리도 넣을 수 있다.

 

NOT IN :제외한 나머지를 출력

 

6. LIKE 연산자

: 문자 패턴을 이용하는 연산자. 

 

(1) 종류

와일드 카드 의미 예시
% 모든 문자 id like 'ad%'
_ 하나의 문자 id like 'admi_'

 

(2) 사용 예시:

select * from member where name like '%admin%';