In-line Query 와 Terminating Query
다름이 아니라 취약점 분석 방법론에서 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# '
1
답변 감사드립니다. 이해했습니다!
제가 처음에는 hacker' 를 처리해줘야하는 것을 이해못한 것 같습니다. 사용자 입력값만 변화하면 되지 않나라고 생각했어서 헷갈렸던 것 같습니다.
저희는 조회 공격 활용을 위해 조건문을 넣어야 하고 조건문을 넣기 위해서는 싱글쿼터를 반드시 처리해줘야 하는것이었군요. 감사합니다!
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 구문에 대한 궁금증
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
MsSql php 연결 문의
0
34
1
APMSETUP 대신에 bitnami를 사용해도 되나요?
0
36
1
질문드립니다
0
106
3
PHP 기갑 게시판 설치에서 오라클 게시판 오류
0
102
2
업데이트 부탁드립니다.
0
194
1
강의 환경설정 MSSQL 문제
0
172
1
Prepared Statement 대응방안 궁금사항 질문있습니다!
0
140
2
게시판에서 oracle만 오류가 나는 이유를 모르겠어요
0
171
2
질문
0
178
2
쿼리 결과 오류
1
345
2
오라클 php 연동이 도저히 안됩니다.
0
537
1
Json으로 데이터를 주고 받을 때 인젝션
1
614
1
case when 구문의 활용(2) 부분 질문 있습니다.
1
610
2
주석처리 관련 질문드립니다.
1
304
2
php & mssql 연동이 안됩니다.
2
532
2
xampp 최신버전 oracle 연동방법, 겪은 오류 정리
2
672
2
가상머신환경
1
305
2
현재 SQL 인젝션 강의를 듣고 있어요
0
228
1
? 플레이스 홀더 문자
0
352
1
mysql case when 구문이용
1
393
1
실습환경 오류 발생시 봐주세요!
0
331
1
php 버전 호환 문제
1
292
1
SQL이나 XSS 실습 서버
1
371
2
mysql 연결연산자 질문드립니다.
1
452
2

