관리 메뉴

드럼치는 프로그래머

[Security] SQL 인젝션 본문

★─Programing/☆─WebProgram

[Security] SQL 인젝션

드럼치는한동이 2016. 11. 9. 10:15

1) 취약점 개요

 

데이터베이스 정보와 테이블을 열람하고 수정하거나 삭제하는 것이 가능합니다.

이는 사용자 입력값에서 위험한 문자가 필터링 되지 않아서 발생합니다.

 

2) 기술적 설명

 

사용자가 제어 가능한 입력에서 SQL 구문의 충분한 제거 또는 따옴표 없이, 생성된 SQL 조회에서 이러한 입력이 일반적인 사용자 데이터 대신 SQL로 해석되는 원인이 될 수 있습니다.

예를 들어, 사용자 입력을 사용하여 데이터베이스에서 다음의 SQL 조회를 실행하는 로그인 양식이 있는 HTML 페이지가 있다고 가정하십시오.

  SELECT * FROM accounts WHERE username=’$user’ AND password=’$pass’

두 개의 변수 $user와 $pass에는 로그인 양식에서 사용자가 입력한 사용자 신임 정보가 있습니다.

따라서 사용자가 사용자 이름으로 “jsmith”를 입력하고 비밀번호로 “Demo1234″를 입력한 경우 SQL 조회는 다음과 같습니다.

  SELECT * FROM accounts WHERE username=’jsmith’ AND password=’Demo1234′

그러나 사용자가 사용자 이름으로 “‘”(하나의 어포스트로피), 비밀번호로 “‘”(하나의 어포스트로피)를 입력한 경우 SQL 조회는 다음과 같습니다.

  SELECT * FROM accounts WHERE username=”’ AND password=”’

이는 잘못된 형식의 SQL 조회이며 HTTP 응답에 리턴될 수 있는 오류 메시지를 호출합니다.

이와 같은 오류는 SQL 인젝션에 성공했음을 공격자에게 알리므로 공격자는 추가 공격 벡터를 시도하게 됩니다.

 SELECT * FROM items WHERE owner =  AND itemname = ;

공격자가 itemName으로 “name’ OR ‘a’=’a” 문자열을 입력하는 경우 조회는 다음과 같습니다.

 SELECT * FROM items WHERE owner = ‘wiley’ AND itemname = ‘name’ OR ‘a’=’a’;

OR ‘a’=’a’ 조건의 추가로 where절은 항상 true로 평가되므로 이 조회는 다음과 같은 훨씬 간단한 조회와 논리적으로 동등해집니다.

  SELECT * FROM items;

 

3) 분류 및 참고

 

SQL Injection

 

4) 수정 방안

 

일반적인 2가지 조치 방안이 존재합니다.

첫번째는, PreparedStatement 구문의 사용입니다. PreparedStatement은 JBDC SQL 데이터 유형과 호환 가능한 입력 매개변수를 레지스터하는 setter를 정의합니다. 예를 들어, varchar 또는 longvarchar 유형의 입력 매개변수로 사용됩니다. 이러한 입력 매개변수를 설정하는 방법은 공격자가 어포스트로피와 같은 잘못된 문자의 인젝션을 통해 SQL 명령문을 조작하지 못하도록 막아줍니다.

 

PreparedStatement testStatement = testConnection.prepareStatement(“select * from users where username = ?”);
testStatement.setString(1, userNameField);
ResultSet rs = testStatement.excuteQuery();
Rs.close();

 

두번째는, 입력 파라미터에 대한 유효성 검증을 하는 방법입니다. 아래와 같은 치환로직을 통해, 공격자의 명령에 대한 유효성을 검증하는 방법을 통해 인젝션을 방지 하는 방법입니다.

 

replaceAll(“(?i)select|having|from|drop|where|join|update|union|insert|and|or|substr|declare|openrowset|user_tables|user_tab_columns|table_name|column_name|row_num”,””);

 


[출처] http://www.beomps.com/archives/13734

Comments