SQL Injection (CWE-89)
SQL 인젝션은 웹 애플리케이션과 데이터베이스 사이의 인터페이스 취약점을 악용하는 코드 인젝션 기법입니다. 가장 치명적이고 흔한 웹 취약점 중 하나입니다.
Injection
SQL 인젝션 작동 방식
공격자가 데이터베이스 쿼리에 직접 연결되는 입력 필드에 악성 SQL 코드를 삽입합니다. 애플리케이션이 조작된 쿼리를 실행하면 공격자는 데이터를 읽거나 수정하거나 삭제할 수 있습니다.
취약한 코드
vulnerable.js
// User input directly in query string
const userId = req.params.id;
const query = `SELECT * FROM users WHERE id = '${userId}'`;
db.query(query);공격 페이로드
attack.sh
# Input: ' OR '1'='1' --
# Resulting query:
# SELECT * FROM users WHERE id = '' OR '1'='1' --'
# Returns ALL users in the database안전한 코드
secure.js
// Parameterized query - input treated as data, not code
const userId = req.params.id;
const query = 'SELECT * FROM users WHERE id = ?';
db.query(query, [userId]);SQL 인젝션 유형
1
In-band SQLi: 응답에서 결과가 보이는 방식 (UNION 기반, 에러 기반)
2
Blind SQLi: 출력은 없지만 동작이 변하는 방식 (부울 기반, 시간 기반)
3
Out-of-band SQLi: DNS나 HTTP 요청을 통해 데이터를 유출하는 방식
예방 방법
- 항상 파라미터화된 쿼리 또는 준비된 문(Prepared Statement)을 사용하세요
- ORM 프레임워크를 사용하세요 (Sequelize, Prisma, SQLAlchemy, Hibernate)
- 입력 유효성 검사를 적용하고 허용된 문자를 화이트리스트로 관리하세요
- 최소 권한 데이터베이스 계정을 사용하세요
- SQL 인젝션 패턴용 WAF 규칙을 활성화하세요
VEXLIT 탐지
VEXLIT은 taint 분석을 사용하여 소스(req.params, req.query, req.body)에서 싱크(db.query, pool.execute)까지 함수 경계를 넘어 사용자 입력을 추적합니다. Express, Spring, Django, Flask, Rails 등 30개 이상의 프레임워크에 대한 프레임워크 인식 규칙으로 34개 언어에서 탐지합니다.
npx @vexlit/cli scan . --fail-on warning