1. 개요

-  Team82에서 웹 애플리케이션 방화벽(WAF)의 우회방법을 개발

※ 관련 WAF 공급 업체 : Palo Alto Networks, Amazon Web Services, Cloudflare, F5 Big-IP, Imperva

- 공격 방법은 WAF가 구문 분석할 수 없는 SQL Injection 페이로드에 JSON 구문을 추가하는 것

- 대부분의 WAF는 SQL Injection 공격을 쉽게 감지 하지만 SQL 구문에 JSON을 추가하면 WAF 우회가 가능

※ WAF 공급업체는 대부분의 데이터베이스 엔진에서 JSON을 지원했음에도 불구하고 제품에서 JSON 지원이 부족

- 위 5개 업체 모두 SQL Injection 검사 프로세스에 JSON 구문을 지원하도록 업데이트 적용

- 해당 기법을 악용해 타제품 WAF 우회 및 공격이 가능하므로, 패치 적용 또는 관련 설정이 필요

 

2. SQL과 JSON

- 현대에 JSON은 데이터 저장 및 전송의 주요 형식 중 하나로 자리잡음

- JSON 구문을 지원하고 개발자가 다른 애플리케이션에서 데이터와 상호 작용하는 방식과 유사한 방식으로 데이터와 상호 작용할 수 있도록 하려면 SQL에서 JSON 지원이 필요했음

 

- 현재 모든 주요 관계형 데이터베이스 엔진은 기본 JSON 구문을 지원함

※ MSSQL, PostgreSQL, SQLite, MySQL이 포함

- 최신 버전에서는 모든 데이터베이스 엔진이 기본적으로 JSON 구문을 활성화하므로 오늘날 대부분의 데이터베이스 설정에서 널리 사용됨

 

- 개발자는 여러 이유로 SQL 데이터베이스 내에서 JSON 기능을 사용하기로 선택

① 많은 백엔드가 이미 JSON 데이터로 작업

> SQL 엔진 자체에서 모든 데이터 조작 및 전환을 수행하면 필요한 데이터베이스 호출 수가 줄어듦

② JSON 데이터 형식은 데이터베이스 백엔드 API에서 가장 많이 사용하는 형식

> JSON 데이터 형식으로 작동할 수 있는 경우 데이터 전,후처리가 덜 필요하므로 애플리케이션에서 먼저 변환할 필요 없이 즉시 사용이 가능

∴ SQL에서 JSON을 사용할 경우 더 나은 성능과 효율성 즉, 리소스 절약이 가능함

[사진 1] SQL에서 JSON을 사용하는 데이터 흐름

 

- 각 데이터베이스는 서로 다른 구현 및 JSON 파서를 선택했으며, 모두 JSON 데이터 유형과 기본 JSON 검색 및 수정을 지원

[사진 2] 데이터베이스 별 JSON 지원 수준

 

- 그러나 모든 데이터베이스 엔진이 JSON에 대한 지원을 추가했지만 모든 보안장비가 JSON에 대한 지원을 추가한 것은 아님

∴ 보안장비와 실제 데이터베이스 엔진 간의 구문 분석 기본 요소가 일치하지 않아 SQL 구문이 잘못 식별될 수 있음

> 결과적으로 JSON은 WAF의 파서와 데이터베이스 엔진 간의 불일치로 인한 문제

 

3. 취약점

- JSON 구문을 사용하면 새 SQL Injection 페이로드를 만들 수 있음

- 이러한 페이로드는 일반적으로 알려지지 않았기 때문에 보안장비를 우회하는 데 사용될 수 있음

PostgreSQL: '{"b":2}'::jsonb <@ '{"a":1, "b":2}'::json
> b Is the left JSON contained in the right one? True.

SQLite: '{"a":2,"c":[4,5,{"f":7}]}' -> '$.c[2].f' = 7 
> Does the extracted value of this JSON equals 7? True. 

MySQL: JSON_EXTRACT('{"id": 14, "name": "Aztalan"}', '$.name') = 'Aztalan' 
> Does the extracted value of this JSON equals to ‘Aztalan’? True.

 

- WAF가 유효한 SQL로 인식하지 않지만 데이터베이스 엔진에서 SQL Injection으로 분석된다면 우회가 가능함

- JSON 구문을 사용하는 유효한 SQL 문을 전달했을 때 WAF에서 탐지되지 않음

※ 오른쪽 JSON이 왼쪽 JSON에 포함되어 있는지 확인하는 JSON 연산자 @>는 WAF를 우회할 수 있음 ([사진 3] 참고)

[사진 3] JSON 구문이 포함된 SQL Injection에 대한 200 응답값

 

- 간단한 JSON 구문을 요에 추가하여 SQL Injection을 수행할 경우 클라우드에서 민감한 정보를 얻을 수 있음

[사진 4] JSON 구문이 포함된 SQL Injection을 통한 클라우드에서의 정보 탈취

 

- 이 우회의 핵심 문제는 데이터베이스 엔진과 SQL Injection 탐지 솔루션 간의 적합성 부족 문제
- 이는 SQL의 JSON 기능이 잘 알려진 기능이 아니며 해당 구문이 WAF 파서에 추가되지 않았기 때문임

- 공격자가 피해 서버에 어떤 WAF가 있는지 확인할 수 없더라도 JSON 기반 SQL Injeciton 공격을 통해 우회 및 악용할 수 있음.

 

- 오픈소스 SQL Injetion 자동화 툴 SQLMap의 최신 버전에서 JSON 구문 회피 기술이 추가됨.

 

GitHub - sqlmapproject/sqlmap: Automatic SQL injection and database takeover tool

Automatic SQL injection and database takeover tool - GitHub - sqlmapproject/sqlmap: Automatic SQL injection and database takeover tool

github.com

 

- SQLMap에서는 일부 WAF 우회 기술을 제공하지만 일반적인 SQL Injection은 대부분 최신 WAF에서 쉽게 탐지/차단

[사진 5] SQLMap에서 SQL Injection 공격 시 WAF 탐지/차단

 

- 그러나 임의로 생성된 JSON 구문을 추가하여 SQLMap에서 악성 페이로드 공격 시 WAF 우회 및 성공적으로 악용할 수 있음.

- SQLMap 옵션 : --temper json_waf_bypass

[사진 6] JSON 기반 SQL Injection 공격 시 WAF 우회

4. 대응

- 5곳의 주요 WAF 공급업체 모두 SQL Injection 검사 프로세스에 JSON 구문을 지원하도록 업데이트 적용

※ 관련 WAF 공급 업체 : Palo Alto Networks, Amazon Web Services, Cloudflare, F5 Big-IP, Imperva

- 5곳 외 타 보안장비 벤더사에서도 관련된 패치 제공 및 솔루션에 패치 적용 필요

[사진 7] JSON 구문에 대한 지원을 추가한 Amazon AWS ELB 규칙 세트에 대한 AWS 릴리스 정보
[사진 8] JSON 구문에 대한 지원을 추가한 F5 BIG-IP의 승인

5. 출처

 

{JS-ON: Security-OFF}: Abusing JSON-Based SQL to Bypass WAF

Team82 developed a generic web application firewall bypass that exploits a lack of JSON syntax support in leading vendors' SQL injection inspection process.

claroty.com

+ Recent posts