응용 프로그램 보안 상의 허점을 의도적으로 이용해, 악의적인 SQL문을 실행되게 함으로써 데이터베이스를 비정상적으로 조작하는 코드 인젝션 공격 방법
GET
, POST
요청 필드, HTTP 헤더값, 쿠키값 등에 특수문자(싱글 쿼드(') 혹은 세미콜론(;)) 삽입 시, SQL 관련 에러를 통해 데이터베이스 정보 예상'
(작은 따옴표) 입력 후 검색 시도zipcode_id
라는 컬럼 값 확인' and db_namd() > 1--
입력하여 DB명(web
) 확인int
)으로 비교하려고 함에 따라 에러 메시지 출력' having 1=1--
입력하여 테이블명.컬럼명(zipcode.zipcode_id
) 확인💡 Union
2개 이상의 쿼리를 요청하여 결과를 얻은 SQL 연산자
union
과 select
절을 이용해 컬럼 갯수를 알아냄select
는 검색을 하려던 테이블의 컬럼 명 대신 컬럼 순서를 대신 입력 가능💡 저장 프로시저(Stored Procedure)
- 사용하고자 하는 Query에 미리 형식을 지정하는 것
- 일련의 쿼리를 하나의 함수처럼 실행하기 위한 쿼리의 집합
- 운영상 편의를 위해 만들어둔 SQL 집합 형태
User
라는 테이블이 있다고 가정CREATE TABLE User(
username VARCHAR(50),
password VARCHAR(50)
)ENGINE=InnoDB;
username
과 password
선택String Query = "SELECT * FROM username = ' " + username
+ " ' AND password = ' " + password + " ' ";
execute_query(Query);
//문제 없이 수행
SELECT * FROM `User` WHERE UserName = 'Hady' AND Password = 'root';
//SQL Injection 공격 - 테이블 삭제
SELECT * FROM `User` WHERE UserName = '' AND Password = '';drop table User;--'
abc123’ OR (LENGTH(DATABASE())=1 AND SLEEP(2)) –
이라는 구문을 주입LENGTH()
: 문자열의 길이 반환DATABASE()
: 데이터베이스의 이름 반환LENGTH(DATABASE()) = 1
1
부분을 조작하여 데이터베이스의 길이 알아낼 수 있음
/*
, –, ‘, “, ?, #, (, ), ;, @, =, *, +, union, select, drop, update, from, where, join, substr, user_tables, user_table_columns, information_schema, sysobject, table_schema, declare, dual,…
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/* 특수문자 공백 처리 */
final Pattern SpecialChars = Pattern.compile(“[‘\”\\-#()@;=*/+]”);
UserInput = SpecialChars.matcher(UserInput).replaceAll(“”);
final String regex = “(union|select|from|where)”;
final Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
final Matcher matcher = pattern.matcher(UserInput);
if(matcher.find()){
out.println(“<script>alert(‘No SQL-Injection’);</script>”);
}
try{
String uId = props.getProperty(“jdbc.uId”);
String query = “SELECT * FROM tb_user WHERE uId=” + uId;
stmt = conn.prepareStatement(query);
ResultSet rs = stmt.executeQuery();
while(rs.next()){
.. …
}
}catch(SQLException se){
.. …
}finally{
.. …
}
try{
String uId = props.getProperty(“jdbc.uId”);
String query = “SELECT * FROM tb_user WHERE uId= ?”
stmt = conn.prepareStatement(query);
stmt.setString(1, uId);
ResultSet rs = stmt.executeQuery();
while(rs.next()){
.. …
}
}catch(SQLException se){
.. …
}finally{
.. …
}
📖 참고
- [Web Hacking] OWASP A1 인젝션 종류
- https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=shackerz&logNo=220449932926
- SQL Injection 대응 방안
- [DB] SQL 인젝션 (SQL Injection )
- SQL Injection 취약점(2)_Error Based Injection
- SQL Injection 이란?
- SQL Injection inside Stored Procedures
- SQL Injection 이란? (SQL 삽입 공격)