강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của nyahn0608
nyahn0608

câu hỏi đã được viết

Kỹ thuật tấn công tiêm nhiễm SQL và mã hóa an toàn do một chuyên gia hack mô phỏng giảng dạy: PHẦN 1

Phương pháp phân tích lỗ hổng (4) - (Sửa đổi: 2022.06.22)

In-line Query 와 Terminating Query

Đã giải quyết

Viết

·

166

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' 가 있어 앞에가 싱글 쿼터로 똑같이 시작되는데 왜 싱글쿼터로 마무리를 안해도되는지 궁금합니다.

 

 

모의해킹인젝션

Câu trả lời 2

1

crehacktive님의 프로필 이미지
crehacktive
Người chia sẻ kiến thức

질문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# '

 

 

nyahn0608님의 프로필 이미지
nyahn0608
Người đặt câu hỏi

답변 감사드립니다. 이해했습니다!

제가 처음에는 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 구문에 대한 궁금증

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Hình ảnh hồ sơ của nyahn0608
nyahn0608

câu hỏi đã được viết

Đặt câu hỏi