인프런 커뮤니티 질문&답변

Jeong Seob Lee님의 프로필 이미지
Jeong Seob Lee

작성한 질문수

모의해킹 실무자가 알려주는, SQL Injection 공격 기법과 시큐어 코딩 : PART 1

대응방안 코드에 대해서 질문이 있습니다.

작성

·

221

1

안녕하세요.

강의  "대응 방안" 파트의 "상세 대응 방안(2)" 강의를 보던 중 궁금한점이 생겨서 질문드립니다.

1) 첫째로, 문자 입력에 대한 대응 방안으로 강의에서 예시로 제시했던 코드가 아래와 같습니다.

---------------------------------------------------------------------------

JAVA

String keyword = request.getParameter("keyword");

// MSSQL, ORACLE 대응 방안 예시

keyword = keyword.replace("'", "''");     <<<<<<<<< (1)

keyword = keyword.replace("\"", "\"\"");

query = "select * from board where keyword like '%" + keyword + "%'";

-------------------------------------------------------------------------------

이 부분에서   <<<<<<<< (1) 표시된 부분의 내용이 잘 이해가 되지 않아서요.

강의 하시면서 공격자가 '(작음따옴표) 하나를 입력하면 두개로 변하여 '(작은따옴표)가 검색이 된다고 말씀하셨는데요 

만약 공격자가 '(작은따옴표) 하나를 입력한 경우라면 이 하나의 '(작은따옴표)가 연속된 두개의 ''(작은 따옴표)로 변하여

query 는 다음과 같이 생성될 것입니다.

select * from board where keyword like '%''%'

이런식으로 되면 % 양쪽으로 그냥 '(작은따옴표)로 깜싸는 정도로 바뀔거라고 짐작하고 있는데요.

어떻게 '(작은따옴표)도 검색이 가능하게 되는지 이해가 되지 않습니다. 그리고 이 경우 mysql 경우 처럼 \' 패턴을 이용하면

우회가 가능한지도 궁금합니다.  

그리고....

2) 두번째로,  컬럼/테이블 입력에 대한 대응 방안으로 제시한 예제 코드의 일부는 다음과 같습니다.

boolean flag = Pattern.matches("^[0-9a-zA-Z-]*$", tb_name);

강의에서 설명해주셨던 것 처럼 이 코드 내용은 숫자, 알파벳 대소문자 그리고 -(대시 또는 하이픈)문자를 필터링하는 것인데요.

제 생각에는 -(대시) 문자 이외의  _(언더바) 문자가 추가되어야 하지 않을까 해서요? 

강의에서 사용하였던 "TB_BOARD" 처럼 _(언더바) 문자가 포함된 테이블이나 컬럼이 존재하는거로 봐서는요,

아니면 제시된 코드의 오타인걸로도 생각이 들고요. 

감사합니다~

답변 2

1

답변 감사합니다~ ㅎㅎ

이해가 팍팍 되네요~ 감사합니다~

0

크리핵티브님의 프로필 이미지
크리핵티브
지식공유자

안녕하세요. 

질문에 대한 답변 드리겠습니다.

1) 싱글쿼터는 SQL 문법에 있어서 메타 문자 기능을 합니다.

즉, 특정 기능을 수행하는 문자라는 거죠. 그 기능은 문장의 시작과 끝을 알리는 문자입니다.

그런데, 이러한 싱글쿼터도 단순 문자로 사용하는 경우가 당연히 있겠죠?

예를 들어, i'm a boy 이런 문장이 있다면 싱글쿼터를 어떻게해서 단순 문자로 인식을 시킬까요?

메타 문자를 단순 문자의 기능으로 변환하는 것을 일반적으로 이스케이프 처리 한다라고 표현을 합니다.

DBMS별 이스케이프 처리 방식을 살펴보면

MSSQL, ORACLE은 '를 '' 싱글쿼터 두개로 처리하면 됩니다.

select 'i''m a boy';  => i'm a boy(출력)

위와 같은 문장이 한 예시입니다. 

아래의 SQL 문장은 질문하신 부분입니다.

select * from board where keyword like '%''%'

그렇다면 위의 SQL 문장은 어떻게 해석이 될까요?ㅎ

이건 공부거리로 남겨드리겠습니다.

MYSQL은 \' , '' 두가지 방식 전부 사용 가능합니다.

그러나 MSSQL, Oracle은 \' 방식은 사용되지 않습니다.

한번 직접 실습을 해보시는게 좋아요! 궁금한점은 바로 실습 고고~

2) 이건 예시일 뿐입니다 ^^;;;ㅋㅋㅋ

네이밍 특성을 고려하여 어플리케이션 환경별로 

특수문자를 추가해주시면 됩니다!

보통 -(대시), _(언더바)를 많이들 사용하십니다!

그냥 예를 든다고 - 문자 하나만 추가한거구요ㅎㅎ 

Jeong Seob Lee님의 프로필 이미지
Jeong Seob Lee

작성한 질문수

질문하기