해결된 질문
작성
·
84
0
다름이 아니라 취약점 분석 방법론에서 In-line Query 와 Terminating Query 에 대해 설명해주실 때,
In-line Query 에서는
SELECT * FROM member WHERE user_id = 'hacker' and 1=1 and '1'='1'
Terminating Query 에서는
SELECT * FROM member WHERE user_id = 'hacker' and 1=1--'
이렇게 말씀해주셨는데요.
Q.제가 이해하기로는 In-line 에서 'hacker' 의 앞의 싱글쿼터로 시작했기 때문에 마지막을 싱글쿼터로 맞춰주셨다고 했는데요. 왜 맞춰줘야하나요??
Q. In-line 에서는 위와 같이 똑같이 'hacker' 가 있어 앞에가 싱글 쿼터로 똑같이 시작되는데 왜 싱글쿼터로 마무리를 안해도되는지 궁금합니다.
답변 2
1
질문1) 서버 측에는 아래와 같이 쿼리가 작성 되어 있습니다.
SELECT * FROM member WHERE user_id = ' 사용자 입력 값 '
여기서 알 수 있는건 사용자 입력 값 양 옆으로 싱글쿼터가 있으며, 앞의 싱글쿼터와 뒤의 싱글쿼터를 처리해 줘야합니다. In-line 방식 쿼리 작성 시 우선 hacker' 를 통해 앞의 싱글쿼터 마무리가 가능합니다.
SELECT * FROM member WHERE user_id = ' hacker ' '
그러나 뒤의 싱글 쿼터는 아직 마무리가 되어 있지 않습니다. 따라서 and '1'='1 입력을 통해 뒤의 싱글쿼터 마무리가 가능합니다.
SELECT * FROM member WHERE user_id = ' hacker ' and ' 1 '=' 1 '
우선 이렇게 정상적인 문장이 완성되기 때문에 취약점 테스트가 가능합니다.
참: SELECT * FROM member WHERE user_id = ' hacker ' and ' 1 '=' 1 '
거짓: SELECT * FROM member WHERE user_id = ' hacker ' and ' 1 '=' 2 '
그러나 조건문을 만들어주기 위해 중간에 and 1=1 이란 구문을 넣어 줘서 사용하게 됩니다.(그 이유는 데이터 조회 공격에 활용하기 위해)
SELECT * FROM member WHERE user_id = ' hacker ' and 1=1 and ' 1 '=' 1 '
질문 2) Terminating 쿼리에 관련된 질문 이신것 같은데, 주석이 사용되기 때문입니다. 주석이 사용되면 주석 문자 뒤의 모든 문자들은 무시 됩니다.
아래는 hacker ' and 1=1# 입력 예시 입니다. MySQL 주석 문자인 #을 입력 하였으며 뒤의 싱글쿼터 문자는 무시가 됩니다.
SELECT * FROM member WHERE user_id = ' hacker ' and 1=1# '
0
안녕하세요, 인프런 AI 인턴입니다. Any_can_do_it님.
In-line Query와 Terminating Query의 사용 방식에 관한 질문을 주셨군요. SQL 인젝션 공격 방식에서 중요하게 다뤄지는 부분이기에 명확한 이해가 필요합니다.
In-line Query는 SQL문의 구조를 유지하고 조건의 논리적 참, 거짓을 통해 데이터를 조작하는 기법입니다. In-line 방식에서 싱글쿼터로 구문을 시작하고 끝내는 이유는 문법적으로 SQL 구문이 올바르게 인식되면서 공격 구문이 삽입되도록 하는 것입니다. 주어진 예시에서 ‘hacker’ and 1=1 and ‘1’=‘1’은 SQL문의 논리적 구조를 유지하는 동시에 참(데이터를 출력할 수 있는 식)을 만들어주는 방법입니다.
Terminating Query는 SQL문에서 더이상 사용되지 않을 구문을 주석 처리하여 공격을 위한 구문을 삽입하는 기법입니다. Terminating 방식에서는 – 주석 처리 단위로 이후 구문을 무시하게 되어, ‘hacker’ and 1=1 뒤의 구문들을 무시하고, SQL문이 오류로 끝나지 않으면서 유효하도록 만듭니다.
효과적인 공격을 위해 해당 방식에서 각 조건이 어떻게 설정되고 동작하는지 이해하는 게 중요합니다. SQL Injection의 유형과 방어 기법의 차이가 여기에 관련이 있습니다. 관련 강의에는 SQL Injection을 방어하는 다양한 방법들이 설명되어 있으니 추가적인 학습이 도움이 될 것입니다.
관련 링크를 통해 질문의 원댓글을 참고하세요:
- 데이터타입이 문자형인 경우의 Inline-Query에서
- SQL 인젝션 구문 종류 수업에서 stack query 구문에 대한 궁금증
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
답변 감사드립니다. 이해했습니다!
제가 처음에는 hacker' 를 처리해줘야하는 것을 이해못한 것 같습니다. 사용자 입력값만 변화하면 되지 않나라고 생각했어서 헷갈렸던 것 같습니다.
저희는 조회 공격 활용을 위해 조건문을 넣어야 하고 조건문을 넣기 위해서는 싱글쿼터를 반드시 처리해줘야 하는것이었군요. 감사합니다!