티스토리 뷰

 

필자의 sql injection 독립성을 위해 작성하며, 글의 구성이 불완전하거나 내용이 사실과 다를 수 도 있다.


1. 버전

Mysql Mssql oracle
@@version @@version v$version
version() X X

     Mysql

    - select version()

    - select @@version


      Mssql

    - select @@version


      Oracle

    - select * from v$version


2. 스키마 객체

    Mysql

    - information_schema // Mysql서버가 운영하는 모든 데이터가 저장되어있다.

    - current_user() // 현재 mysql서버에 접속한 유저 목록을 출력해준다.

    - table_name // information_schema.tables 내부의 table을 출력한다.

    - column_name // information_schema.columns 내부의 column을 출력한다.  

    ex) select column_name from infromation_schema.columns where table_name='테이블이름' // 칼럼명 조회

    ex) select table_name from information_schema.tables where table_type='base table'// 테이블 조회


    Mssql

    - information_schema //

    - sys.objects // 동일한 용도로 sysobjects가 있으나 2008 버전부터는 하위 호환성을 위해서 유지하고 있다.

    - sys.columns // 동일한 용도로 syscolumns가 있으나 2008 버전부터는 하위 호환성을 위해서 유지하고 있다.

    - sysobjects // 

    - syscolumns //

    ex) select name from sys.objects where type='u' // 테이블을 조회하며 u는 user-defined table을 의미한다.

        mysql에서의 base table과 의미가 동일하다.

    ex) select name,object_id from sys.objects where type ='u' // 시스템 카탈로그 뷰를 통한 칼럼 조회는 객체 식별을          위한 객체 번호(object_id)가 필요하다.

    ex) select name from sys.columns where object_id=0000000000 // object_id가 테이블 이름이라 생각하면 편하다.  


    Oracle

    - all_tables // 현재 사용자가 접근할 수 있는 모든 테이블에 관한 정보

    - user_tables // 현재 사용자 소유의 관계형 테이블에 관한 정보 

    - dba_tables // 모든 데이터베이스 내의 관계형 테이블에 관한 정보

    - all_tab_columns // 현재 사용자가 접근할 수 있는 모든 테이블에 대한 칼럼 정보

    - user_tab_columns // 현재 사용자 소유의 모든 테이블에 대한 칼럼 정보

    - dba_tab_columns // 모든 테이블에 대한 칼럼 정보

    - tabs // user_tables의 동의어이다.

    - cols // user_tab_columns의 동의어이다.

    - tab // 구 버전에서 사용했던 객체이며 칼럼으로 tname을 사용한다.

    - col // 구 버전에서 사용했던 객체이며 칼럼으로 cname을 사용한다.

    ex) select table_name from tabs // 테이블 이름을 출력해준다.

    ex) select column_name from cols where table_name='테이블 이름' // 테이블 이름의 칼럼을 출력해준다.


3. 주석

Mysql Oracle, mssql
/**/ /**/
--+- --+-
#  

 


4. 문자열 연결

Mysql Mssql Oracle
공백, 탭, 개행 + ||
'a' 'b' 'a'+'b' 'a'||'b'

5. limit

       Mysql

    - limit a,b // a번째부터 b개수만큼 출력한다.

    ex) order by 1 limit 0,3 // 첫 번째부터 3개를 출력한다.


       Mssql

    - offset n rows // order by 절이 나와야 사용 가능 하머 n개를 건너뛴 다음행부터 출력한다. 2012 버전 이후에 생김

    ex) order by 1 offset 3 rows fetch next 1 rows only // 3개를 건너뛰고 다음 1개의 행만 불러온다. 


       Oracle

  - offset n rows // order by 절이 나와야 사용 가능하머 n개를 건너뛴 다음행부터 출력한다. 2012 버전 이후에 생김

    ex) order by 1 offset 3 rows fetch next 1 rows only // 3개를 건너뛰고 다음 1개의 행만 불러온다. 

         mssql과 완전히 동일하다.


6. 칼럼명 하나로 합치기

       Mysql

    - concat(a,b) // a 문자열과 b 문자열을 합친다.

    - concat_ws('n',a,b) //n은 구분자이고 a와 b는 문자열이다.

    - group_concat(a) //a는 칼럼명이며 하나의 문자열로 합쳐서 보여준다.  

    ex) concat(a,b) // 'ab'

    ex) concat_ws('::',a,b) // 'a::b'

    ex) group_concat(name, separator '::') // 'name1::name2::name3...'

 


       Mssql

    - string_agg(a, 'b') // a는 칼럼명이고 b는 구분자이다.

    - concat(a,b) // a와 b를 합친다

    ex) string_agg(name, '::') // 'name::name2::name3 ...'

    ex) concat(a,b) // 'ab'


       Oracle

    - concat(a,b) // a와 b를 합친다.

    - listagg(a,'b') //a는 칼럼명 b는 구분자이다.

    - wm_concat(name) // name을 , 로 구분 지어 나타내어준다.

    ex) concat(a,b) // 'ab'이다. 하지만 oracle은 concat에서 인자를 2개만 받기에 중첩 concat을 사용해야 한다.

    ex) listagg(name, '::') // 'name1::name2...' 뒤에 반드시 within group(order by 1) 이 와야 사용 가능하다.

 

      

 


 

'SQL injection > injection 문법' 카테고리의 다른 글

database 함수 정리  (0) 2022.02.22
댓글