SQL injection 개념, 원리

2017. 9. 1. 21:41WebHacking/Web



[ 원리 파악 하기 ]


SQL injection

- 데이터베이스와 연동되어 있는 애플리케이션의 입력값을 조작하여 DBMS가 의도되지 않은 결과를 반환하도록 하는 공격기법

- 해당 애플리케이션에서 전송되어 오는 입력값에 대해 필터링이 없을경우 발생한다

* DBMS: DataBase Management System )


[ 그림1 ]


게시판에 게시글을 작성하였고, 해당 게시글에는 파일을 첨부하였습니다

해당 파일의 조회수를 알려주는 " Download : 10 " , "Download : 1 " 이 보입니다

파일을 다운로드하면 해당 Download가 1씩 증가합니다

원리를 파악하기 위해서 페이지 소스코드를 확인해보도록 하겠습니다


[ 그림2 ]


파일이름을 클릭하면 " http://address/download.php " 로 이동하도록 되어있습니다

거기에 GET방식으로 변수들을 전달하고 있습니다

다음으로 download.php 페이지 소스코드를 확인해보겠습니다


[ 그림3 ]


해당페이지의 php소스코드를 열어서 확인해보았습니다

<?php include lib.php ?> lib.php파일을 참조하고 있었고, mysql_query() 함수로 쿼리문을 실행하고 있습니다

해당 쿼리문이 어떻게 작동하는지 확인하고 해당 쿼리문을 조작해서 공격을 시도합니다

먼저 사용되어진 변수들이 의미하는 것이 무엇인지 알아야합니다


[ 그림4 ]


lib.php 파일을 확인해보니 

$t_board 는 zetyx_board로 초기화되고 있습니다

$id 는 GET방식을 통해서 board로 초기화 된다

$no 는 GET방식을 통해서 15으로 초기화 된다

$filenum 은 GET방식을 통해서 1로 초기화 된다


그림3의 쿼리문을 완성시키면 다음과 같습니다

 UPDATE zetyx_board_board SET download1=download1+1 WHERE no=15

Table명 : zetyx_board_board

Column명 : download1

=> no=10 의 조건을 만족하는 행의 download1 컬럼을 1 증가시킨다

각 변수들의 의미는 아래쪽에서 설명하겠습니다


[ 그림5 ]


사용명령어 : mysqld_safe--log=[파일명] &     // ( mysqld데몬 백그라운드로 동작 )

로그파일 : /var/lib/mysql/[지정한파일명]

httpd데몬을 통해서 mysql을 실행시키는 것이아니고 mysqld데몬을 직접 실행시킵니다

아파치 웹 서버의 쿼리문의 로그를 남기는 로그파일을 생성시켜서 작동하는 쿼리문이 무엇인지 확인할 수 있다



[ 그림6 ]


UPDATE zetyx_board_board SET download1=download1+1 WEHRE no='15' 쿼리문의 실행된 것이 확인된다


[ 그림7 ]


mysql을 이용해 직접 DB에 들어가 구조를 파악해보았습니다

쿼리문에서 사용하는 table명 : zetyx_board_board 를 확인할 수 있습니다

해당 테이블의 구조를 확인해보도록 하겠습니다


[ 그림8 ]


[ 쿼리문에서 사용하는 변수 ]

id:    zetyx_board_() : ()를 결정하는 변수

no:    게시판에 올린 게시글을 식별하는 번호 ( 15번째 게시글이여서 no=15 )

download1:    게시글의 첫번째 파일의 조회수

download2:    게시글의 두번째 파일의 조회수

GET방식과 $filenum변수를 이용해 download+"x" 에서 x를 결정하여 어떤 파일의 조회수를 증가되는지 결정된다


[ 그림9 ]


15번째 게시글(no=15)의 첫번째 파일의 조회수(download1)를 검색


[ 그림10 ]


웹 페이지에서도 DB에 저장된 조회수와 똑같은 10을 가지고 있습니다


< 결론 >

[ 작동원리 ] 

웹 페이지에서 파일이름을 클릭해서 " http://address/download.php " 페이지로 접속 => 쿼리문 실행

=> DB변경 => 웹 페이지에 반영


살펴본 바와 같이 GET방식을 이용해 쿼리문에 필요한 변수들을 전달하고, php의 mysql_query()함수를 이용해 쿼리문을 실행시킨다

=> 쿼리문이 실행되고, DB의 내용을 변경시킨다 ( 이때, 쿼리문을 조작해서 전달할 수 있다 )



다음 게시글에서 SQL injection을 직접 시도해보도록 하겠습니다