- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 재능이의 돈버는 일기
- StresslessLife
- K_JIN2SM
- 소소한 일상
- My Life Style & Memory a Box
- Blog's generation
- 공감 스토리
- 취객의 프로그래밍 연구실
- Love Me
- Dream Archive
- 세상에 발자취를 남기다 by kongmingu
- hanglesoul
- 카마의 IT 초행길
- 느리게.
- 미친듯이 즐겨보자..
- Joo studio
- Gonna be insane
- 악 다 날아갔어!! 갇대밋! 왓더...
- xopowo05
- 맑은공기희망운동
- 엔지니어 독립운동
- 혁준 블로그
- Simple in Complex with Simple
- 무의식이 의식을 지배한다
드럼치는 프로그래머
[Security] SQL 인젝션 본문
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
'★─Programing > ☆─WebProgram' 카테고리의 다른 글
[JavaScript] a태그에서의 onclick 이벤트의 이용법 (0) | 2016.12.09 |
---|---|
[Security] 세션 ID가 업데이트되지 않음 (0) | 2016.11.09 |
[jQuery] jqGrid row vertical alignment not middle (0) | 2016.08.03 |
[HTML] 테이블의 <td> 안에 있는 내용 오른쪽 정렬 (0) | 2016.07.28 |
[JavaScript] createElement, 새로운 요소 생성하기. (0) | 2016.07.28 |