2025년에 SQL Injection은 사라졌나요? Item Pagination에서 중요한 버그 찾기
Source: Dev.to
Introduction
많은 개발자들은 2025년이 되면 이제는 간단한 SQL 인젝션 취약점을 더 이상 볼 수 없을 정도로 기술이 발전했다고 생각합니다. 유명한 TF2 거래 사이트의 기능을 살펴보던 중, 오래된 습관이 쉽게 사라지지 않는다는 것을 발견했습니다.
How did I find the bug?
Item 페이지에는 사용자가 특정 페이지 번호로 바로 이동할 수 있는 네비게이션 기능이 있습니다. “…” 버튼을 누르면 페이지 번호를 직접 입력할 수 있는 팝업이 나타납니다. 자연스럽게 “내 입력을 신뢰하나요?”라는 생각이 들었습니다.
숫자 대신 문자 e를 입력했습니다. 애플리케이션은 이를 정상적으로 처리하지 못했고, 일반적인 404 혹은 부드러운 오류를 반환하는 대신 치명적인 오류를 발생시켜 대량의 민감한 정보를 노출했습니다.
What did we get here?
- Database Error Code:
SQLSTATE[42000] - Logic Leak: 오류 메시지에 입력이 처리된 정확한 위치가 표시되었습니다(예:
-25,25). - Full Path Disclosure:
var/.../.../...php와 같은 파일 경로가 드러났습니다. - Internal Functions: 기술 스택 및 파일 위치에 대한 상세 정보가 노출되었습니다.
이러한 정보 유출만으로도 공격자는 현재 어떤 스택이 실행 중인지, 파일이 어디에 위치하는지 정확히 파악할 수 있어 매우 위험합니다.
The 0xC trick
입력이 적절히 정제되지 않고 바로 SQL 쿼리로 전달되는지를 확인하기 위해, 고전적인 우회 기법인 0xC를 시도했습니다.
Second try, second vulnerability
범위를 파악하기 위해 Burp Suite를 실행하고 요청을 추가로 조작했습니다. UI에서는 보이지 않는 파라미터들이 요청에 포함되어 있었습니다. 파라미터 이름을 변경함으로써 다양한 모듈에서 일관된 SQL 구문 오류를 유발할 수 있었습니다.
일부 개발자는 정수값, LIMIT 혹은 OFFSET 절을 통한 SQL 인젝션이 활용하기 어렵다고 주장하지만, 아래 참고 자료들처럼 실제로는 가능한 경우가 많습니다.
Disclosure
취약점을 사이트 운영진에게 책임감 있게 보고했습니다. 해당 사이트는 버그 바운티 프로그램을 운영하고 있었지만, 버그가 “알려진” 것이며 “위험도가 낮다”는 답변을 받았습니다. 그 후 곧바로 문제가 패치되고 오류 메시지가 비활성화되었습니다.