목표
제품 카테고리 필터에 포함된 SQL 인젝션 취약점을 이용하여
사용자가 카테고리를 선택하면 다음과 같은 SQL 쿼리를 실행
[ SELECT * FROM products WHERE category = 'Gifts' AND released = 1 ]
※ 응용 프로그램이 하나 이상의 릴리스되지 않은 제품을 표시하도록 하는 SQL 인젝션 공격을 수행
분석
메인화면에서 원하는 카테고리를 선택 가능
선택한 카테고리가 URL에서 filter 뒤에 위치하고
선택한 카테고리가 상품 리스트 위에 출력
상품 리스트에는 카테고리의 내용이 출력됨
과정
선택한 카테고리가 URL에서 filter 뒤에서 파라미터로 사용됨을 확인
목표 쿼리를 이용한 SQL 인젝션 쿼리를
공백은 [ + ] 문자로 변환하여 입력
취약점
해당 웹 페이지에는 SQL Injection 취약점이 존재하며
URL 입력 값에 대한 필터링 검증이 부재하여
카테고리 검색 기능 이용/사용 시 SQL 쿼리 삽입 및 실행이 가능하며
이로 인해 공격자는 관리자가 의도하지 않은 방식으로 이용이 가능
대응 방법
SQL Injetcion 취약점은
외부 입력이나 외부 변수로부터 받은 값이 직접 SQL 함수의 인자로 전달되거나,
문자열 복사를 통하여 전달되는 것은 위험하므로 인자화된 질의문을 사용해야 함
소스코드에 SQL 쿼리를 입력 값으로 받는 함수나 코드를 사용할 경우,
임의의 SQL 쿼리 입력에 대한 검증 로직을 구현하여
서버에 검증되지 않는 SQL 쿼리 요청 시
에러 페이지가 아닌 정상 페이지가 반환되도록 필터링 처리하고
웹 방화벽에 SQL 인젝션 관련 룰셋을 적용하여 SQL 인젝션 공격을 차단
아래와 같은 특수문자를 사용자 입력 값으로 지정 금지
(사용 DB에 따라 변동 가능)
문자 | 설명 |
' | 문자 데이터 구분기호 |
; | 쿼리 구분 기호 |
--, # | 해당 라인 주석 구분 기호 |
/* */ | *와 */ 사이 구문 주석 |
※ 검증 로직 구현 시 웹 서비스에서 사용하고 있는 명령어 및 특수문자가
필터링 되어 장애가 발생할 수 있음
'PortSwigger' 카테고리의 다른 글
[PortSwigger] SQL injection vulnerability allowing login bypass (0) | 2024.02.11 |
---|