<01. SQL Injection : SQL 주입>
발생 원인 : 외부 입력값이 DB Query 작성에 이용되는 환경에서 입력값을 검증하지 않는 경우에 발생
영향 : 조작된 Query를 통해 DB 내용이 노출되거나 변조될 수 있음
Bad Code : Table Name과
name에 대해 검증하지 않은 코드
Connection con = null;
PreparedStatement stmt = null;
try {
String tableName =
pros.getProperty("jdbc.tableName");
String name =
pros.getProperty("jdbc.name");
String query = "SELECT * FROM "
+ tableName + " WHERE Name = " + name;
stmt = con.prepareStatement(query);
rs = stmt.executeQuery();
........
} catch (SQLException slqe) {}
finally {
rs.close();
stmt.close();
con.close();
}
Good Code : Query문의 구조가 변경되지 않는 PreparedStatement 클래스를 이용하여 쿼리를 수행
Connection con = null;
PreparedStatement stmt = null;
try {
String tableName =
pros.getProperty("jdbc.tableName");
String name =
pros.getProperty("jdbc.name");
String query = "SELECT * FROM ? WHERE
Name = ? ";
stmt = con.prepareStatement(query);
stmt.setString(1, tableName);
stmt.setString(2, name);
rs = stmt.executeQuery();
........
} catch (SQLException slqe) {}
finally {
rs.close();
stmt.close();
con.close();
}
<대표적인 취약점>
Case 1 : 서버에서 다음과 같은 쿼리
실행 코드가 있는 경우 취약점 존재
SELECT * FROM " +
tableName + " WHERE name = '" + name + "'"
Case 2 (Blind SQL
Injection) : 아래 Normal Query와 Abnormal Query 실행 결과가 같은 경우 취약점 존재
<Server Query> strSQL =
"select user_id, name, user_pwd from member where
user_id='"&id&'" and
user_pwd='"&password&"'
|
<Normal
Query>http://test.com/member/member_login_check.jsp?user_id=hacker&user_pwd=1234
|
<Abnormal
Query>http://test.com/member/member_login_check.jsp?user_id=hacker&user_pwd=1234'
and 1=1--
|
substr(), ascii() 함수 등을 이용하여 서버의 response가 참, 거짓임을 이용하여 데이터 추출하는 방식
Case 3
: Mass SQL Injection
SQL Injetion 탐지 패턴을 우회하기 위해 CAST 함수 이용하여 쿼리문 인코딩하여 공격
Case 4 : Cookie를 이용한 공격
Query String에 대한 길이를 제한하거나 서버에서 PreparedStatement를 사용하여 해결
트랙백 주소 :: http://www.yongbi.net/trackback/879
트랙백 RSS :: http://www.yongbi.net/rss/trackback/879
댓글을 달아 주세요
댓글 RSS 주소 : http://www.yongbi.net/rss/comment/883