IISPL
Intelligent Information & Signal Procesing Lab.
Dept. of Computer Engineering, Hanbat National University, South Korea
[
로그인
]
Lab. Info.
About
Services
About me
Research
Members
Projects
IRP
Course
LecturelList
Schedule
Student list
Info.
Lecture Board
LabInfo
Membership
Log in
Regist
Modify
Find account
Gallery
Learning Gallery
YJK'S Gallery
Links
Mypage
Sechedule
커뮤니티
게시판전체
Python
Python/TensorFlow
NOTICE
자유게시판
강좌게시판
WEB-PROG
DP 알림판
C.P.
WebSC
SR Board(V)
OS전체
COMPILER
SSE
DSP
Multimedia
C#
Notice
데이터로표현하는세상
CMPLg RPT
방명록
자료모음
LAB Board
자료모음
제목:
Injection virus 종류 및 공격 방법
1626 김윤중
1. 시작하기 가끔 뉴스나 방송에서 xx 사이트 해킹 당했다 라고들 많이 들어보았을 겁니다 이런 뉴스를 접할때 대체 어떻게 해서 해킹이 당하는걸까? 라고들 많이 생각해 보았을 겁니다 어떻게 해킹이 일어나는지 알아야 방어도 가능하기 때문에 이번 강좌는 웹해킹에 대해 알아볼 것입니다 첫번재 시간으로 SQL Injection을 배울 것이며 그다음 두번째에는 파일조작으로 인한 해킹을, 그리고 마지막 시간에는 자바스크립트 조작에 대해 알아보겠습니다 도표에서도 알수 있듯이 SQL Injection으로 인한 해킹이 가장 간단하고 쉽기 때문에 이를 가장먼저 알아보겠습니다 SQL Injection 이란 서버나 OS의 구멍을 이용한 해킹방법이 아닌 웹 어플리케이션 자체의 버그를 이용한 새로운 형태의 웹해킹 방법입니다 정의를 하자면 SQL Injection은 웹페이지를 통해 입력된 파라미터값을 이용하여 쿼리를 재구성하는 방법이다 라고 할수 있습니다 즉 많은 웹페이지들은 사용자나 프로그램이 생성한 파라미터값을 이용해 쿼리를 만들고 실행하는데, 이때 정상적인 값이 아닌 파라미터값이 입력될 때 비정상적인 쿼리가 실행되며, 따라서 원하지 않는 결과가 나올수 있다는 것입니다 이해를 위해 바로 코드로 들어가 봅시다 아래 코드는 사용자가 입력한 로그인 아이디와 비밀번호로 로그인을 시도하는 로직입니다 // 입력받은 사용자 아이디와 비밀번호 String param1 = request.getParameter("user_id"); String param2 = request.getParameter("user_pw"); rs = stmt.executeQuery("SELECT count(*) FROM user_t WHERE userid = '"+param1+"' AND userpw = '"+param2+"'"); rs.next(); if (rs.getInt(1) == 1) { // 로그인 성공로직 } else { // 로그인 실패로직 } 무엇이 잘못되었을 까요? 코드상으로 보면 실행하는데 전혀 이상이 없는 코드이지만 쫌 아는사람들에게는 비밀번호 없이 아이디만 안다면 로그인을 성공할 수 있는 로직입니다 아아디가 goodbug 이고 비밀번호가 1111 인 계정이 있다고 합시다 ^^; 입력란에 googbug / 1111 을 입력하니 정상적으로 로그인이 true가 되었습니다 하지만 만약 다음과 같이 사용자가 입력한다면 어떻게 될까요? 로그인이 됩니다! 비밀번호에 상관없이 로그인이 되는군요!! 하다 더 보도록 하지요 위의 소스는 MySQL을 사용하고 있습니다 MySQL의 라인 주석처리는 # 입니다 아시죠? 즉 뒷부분 password를 체크하는 로직은 주석처리되어 버린겁니다 뜨아~ 같은 의미이지만 아래처럼 여러가지 섞어서도 가능합니다 이게 만약 관리자 아이디였다면 문제는 더 심각해 집니다 이처럼 사용자의 고의로 인한 SQL을 조작하여 웹 어플리케이션 자체를 공격하는것이 SQL Injection 입니다 그렇다면 위의 소스를 어떻게 변경하는게 좋을까요? // 입력받은 사용자 아이디와 비밀번호 String param1 = request.getParameter("user_id"); String param2 = request.getParameter("user_pw"); //validate 라는 함수는 아이디와 비밀번호 생성시 생성 로직에 맞게 되었는지 체크하는 함수 //만약 특수문자나 아이디 생성 규칙에 맞지 않는 값이면 exception을 throw 한다 validateID(param1); validatePW(param2); pstmt = conn.prepareStatement("SELECT userid, userpw FROM user_t WHERE userid = ?"); pstmt.setString(1, param1); rs = pstmt.executeQuery(); if (rs.next()) { // 문자를 직접 비교한다 (대소문자 구분) if (rs.getString(1).equals(param1) && rs.getString(2).equals(param2)) { // 로그인 성공로직 } else { // 로그인 비밀번호 혹은 아이디 오류 로직 } } else { //로그인 부재 아이디 오류 로직 } 위처럼 하면 어느정도 되겠네요 ^^ 2. SQL Injection 패턴 그럼 SQL Injection에 사용될만한 문자열에는 어떤것이 있을까요? 아래 문자들은 해당 데이터베이스에따라 달라질 수 있습니다 문자 설명 ' 문자 데이터 구분기호 ; 쿼리 구분 기호 --, # 해당라인 주석 구분 기호 /* */ /* 와 */ 사이 구문 주석 일반적으로 알려진 몇가지 패턴입니다 ' or 1=1-- " or 1=1-- or 1=1-- ' or 'a'='a " or "a"="a ') or ('a'='a ' or password like '% 이러한 패턴들로 타겟 데이터베이스가 오라클인지 MySQL인데 혹은 M$SQL인지