Basic SQL injection
Note
- 마지막에 짝이 안맞는 `` '``가 있으면 query가 실행되지 않는다.
1. 짝을 맞춰주거나
2. 주석처리 해주거나
3. escape 해주어야 한다. - ``sql SELECT``가 아니라 ``sql INSERT, UPDATE, DELETE`` 등이어도 injection 가능하다.
단, ``sql UPDATE`` 내부에 sub query로 ``sql SELECT``를 사용할 때 ``sql UPDATE`` 대상 database와 ``sql SELECT``대상 database가 같다면 아무것도 조회되지 않는다.
&& ||
- ``sql AND / OR``는 공백 넣어주어야 하고, ``sql && / ||``는 공백 없어도 된다.
- 공백이 없어도 `` '``로 감싸면 문자열로 인식하기 때문에 ``sql ''or''``같이 사용하는 것은 가능하다. 이 외에 ``sql or1``같이 쓰면 에러난다.
- 숫자형 변수는 ``sql WHERE`` 절에서 `` '``로 감싸지 않기 때문에, ``sql '``를 써주지 않아도 된다.
이 때 ``sql '0'``처럼 감싸서 넘겨도 받는게 숫자형이면 숫자형 `` 0``으로 인식한다
```sql
select * from sqlinj_test where no=1 || 0;
no=1 row
select * from sqlinj_test where no=3 || 0;
Empty set (0.00 sec) no=3 entry가 없음.
SELECT * FROM sqlinj_test WHERE no=3 or 1;
all rows
SELECT * FROM sqlinj_test WHERE no=3 or 9999;
all rows
```
SQL은 전체 row에서 조건에 맞는 row들만 추려나가는 방식으로 동작한다.
아래 설명은 n이 완전한 True/False일 때 라는 점에 유의.
OR ||
``sql no=... or n``에서
``sql n == True``이면 ``sql WHERE True`` (참일 때는 참으로 반환되는 rows가 추가된다고 생각.)
``sql n == False``이면 ``sql WHERE no=...`` (거짓일 때는 거짓인 부분이 없다고 생각.)
이 처럼 ``sql A or B``는 A와 B 각각을 조건으로 실행한 query의 결과의 합집합을 반환한다고 생각하는 것이 좋다.
AND &&
``sql no=... and n``에서
``sql n == True``이면 ``sql WHERE no=...``
``sql n == False``이면 ``sql WHERE False``
이 처럼 ``sql A and B``는 A와 B 각각을 조건으로 실행한 query의 결과의 교집합만 반환한다고 생각하는 것이 좋다.
Basic
주석을 사용할 수 없을 때
Classic SQL Injection
query에서 요청하는 column 개수 파악하기
UNION
Stacked queries
LOAD_FILE()
INTO OUTFILE
```sql
INTO OUTFILE "output_file_path"
```
'Security > WebHacking' 카테고리의 다른 글
SQLMap (0) | 2017.09.05 |
---|---|
Blind SQL Injection (0) | 2017.08.08 |
인증(Authentication)과 인가(Authorization) (0) | 2017.06.28 |
Brute Force / Replay Attack (0) | 2017.06.28 |
Session & HTTP Session hijacking (0) | 2017.06.27 |