
안녕하십니까 코딩 파인애플입니다
이번에는 SQL INJECTION WAF에 관해 알아보겠습니다.
SQLi WAF는 SQL Injection(SQL 인젝션)
공격을 막아주는 웹 방화벽을 의미합니다.
SQLi: SQL Injection (데이터베이스를 공격하는 기법)
WAF: Web Application Firewall (웹 애플리케이션 방화벽)
보편적으로 패턴 매칭이라는 정적인 방법을 통해 거릅니다
예, 쉽게말해서 그냥 블랙리스트를 따로 만드는 겁니다.
keywords = ['Kilroy', 'was', 'here', 'and', 'or']
이런 식으로 따로 블랙리스트를 만들어 만일 사용자가 악의적인 쿼리문을 집어넣게 된다면 필터링에 걸려서 방지하는 겁니다.
하지만 블랙리스트를 만들어도 특정한 방법을 통한 쌀먹도 가능합니다

우우우 쌀쌀쌀
특정한 키워드 필터링을 우회할 때 쓰입니다
예를 들어 'UNION','SELECT','OR' 따위 등이 필터링 된다면
그냥 'uNiOn'이나 'SelEcT', 'oR' 이딴 것들로 대소문자를 구분하지 않는 특성을 이용해 우회가 가능합니다
헌데 만일 .lower나 .upper가 있다면 그냥 대/소문자 중 하나로 완전히 퉁치겠다는 뜻이니 씨알도 안먹힙니다.
'or' 이나 'and'의 경우
or은 파이프 두 개 (||) , and는 앰퍼샌드 두 개 (&&) 로 대체가 가능합니다.
그 외에도 '='가 차단된다면
'='은 a like b 등의 like함수를 혹은 a in ('b')의 in 함수
쓰면 됩니다.
마지막으로 concat 함수를 통해서도 우회가 가능합니다
SELECT password... SELECT CONCAT('pass', 'word')...

말 그대로 공백 (' ')이 우회될 때 쓰입니다
주석을 이용해서 단어를 쪼개거나
UNION SELECT UNION//SELECT
UNION SELECT UNION/**/SELECT
괄호를 활용해서 같은 의미의 문장을 만들거나
SELECT column FROM table SELECT(column)FROM(table)
공백 대체 문자를 사용하면 됩니다
주로 탭(%09), 줄바꿈(%0a), 캐리지 리턴(%0d), 혹은 더하기 기호(+)를 사용해 공백이 필요한 사이사이에 낉이면 됩니다.

문자를 인코딩해서 우회합니다
문자나 키워드를 %HEX 형태로 변환하거나
' OR 1=1 -- %27%20OR%201%3D1%20--
유니코드 및 다중 바이트 인코딩을 통해서 변환합니다
s %u0073, e %u0065
SELECT %u0073%u0065%u006c%u0065%u0063%u0074
+만일 참값 (1=1) 이 막힌다면 True나 2-1, 0+1을 써보시길 바랍니다 mysql 내부적으로는 1=True 로 취급되기에 가능합니다
만일 WAF가 특정 키워드를 탐지했을 때, 단순히 그 단어를 공백이나 빈 문자("")로 치환하는 취약한 로직을 가졌을 경우 사용하는데
SELSELECTECT 중간 SELECT가 치환 양옆의 SEL+ECT가 붙어 SELECT가 됨.
UNIUNIONON, anandd, oandr 이런 식으로 우회가 가능합니다.
이 외에도 더 많은 SQLI WAF 우회가 있기에 이 글은 앞으로도 업데이트될 예정입니다.
한번 배웠던 내용을 실습해봅시다
이상으로 글을 마치겠습니다 감사합니다
