보안 제품정보


Xpress Engine 1.4.5.5 최신 버전 취약점 대응방안 권고 보고서 2011.04.27

회원가입(수정),게시판 글쓰기(글수정)에서의 SQL Injection 취약점


개요

이 취약점은 회원 가입(수정)을 처리하는 파일인 DBMysql(Mssql 등등.).class.php 파일에서 숫자형 데이터를 처리하는 부분의 허점을 이용하여 일어나는 취약점이다.


발생 버전

Xpress Engine 1.4.5.5 버전 이하 모든 버전


발생 원인

$value의 숫자형 변수의 조작이 가능하다.


분석

/xe/classes/db/DBMysql.class.php 파일을 열어 441번 라인 부근을 보면 다음과 같은 부분이 있다.

    

      /xe/classes/db/DBMysql.class.php 파일의 441번 라인 부근


445번 라인에서 변수 타입이 ‘number’일 경우와 아닐 경우가 따로 나뉘고 있다. 숫자가 아닐 때는 ‘addQuotes’라는 함수로 쿼터를 붙여주고 있다. 그러나 문제가 되는 부분은 458라인 이다. ‘is_numeric’ 함수로 숫자형인지 확인한 후 $value 변수를 int형으로 형변환 하고 있다. 공격자가 이곳에 쿼터를 넣으면 ‘addQuotes’라는 함수를 사용하지 않았기 때문에 에러가 날 것이란 것을 예측할 수 있다.

회원가입(수정)부분에서의 취약점이 일어나는 변수는 ‘find_account_question’이다. 이 변수는 비밀번호를 찾을 때 질문 방식을 저장하는 변수이다. 다른 변수들은 전부 초기 값을 가지고 있기 때문에 값을 변조해봐도 인젝션이 일어나지 않는다.

결국 근본적인 문제는 변수 초기화이다. Xpress Engine에서는 무엇때문인지 변수를 초기화하지 않고 있다. 만약 특별한 이유로 초기화를 하지 않았을 경우 문서 최하단 페이지의 있는 패치 방법으로 하면 패치가 될 것이다. 테스트 시에는 쿼리를 출력하는 소스를 추가한 후 시도했다.


    

      find_account_question 변수 값을 조작하는 부분


find_account_question 변수 값에 쿼터를 넣은 후 전송해 보았다. 전송하면 Syntax에러가 뜨는 것을 볼 수가 있다. find_account_question을 보면 쿼터가 그대로 들어간 것을 볼 수가 있다.


게시판 에서의 조작 가능한 변수

readed_count, blamed_count, voted_count, comment_count, trackback_count,

uploaded_count, member_srl


(중간 생략…)


공격 시연 1

회원가입 쿼리를 살펴보겠다.

 

    


‘is_admin’이라는 컬럼은 21번째에 존재한다. ‘find_account_question’ 값에 공격 코드를 삽입해보았다.

 

   


‘find_account_question’의 값 뒤에 데이터들은 임의의 숫자를 넣어준 후 ‘is_admin’ 컬럼 부분에는 ‘Y’ 값을 넣어 주었다. 그러면 ‘hkkiw0823’라는 아이디의 권한은 관리자 권한으로 변경된 채 회원가입이 된다.


공격 시연 2

다음으로 게시판 글쓰기 쿼리를 살펴보겠다.



‘content’이라는 컬럼은 10번째에 존재한다. ‘content’부분에 ‘db.config.php’ 파일의 내용을 삽입하기 위해 ‘readed_count’값에 아래와 같이 공격 코드를 삽입하였다.


   


‘readed_count’ 컬럼 뒤에 값은 임의의 숫자를 넣어준 후 ‘content’ 컬럼에는 ‘db.config.php’ 파일의 내용을 넣어 주었다. 그러면 데이터베이스의 이름과 이이디, 비밀번호를 알아낼 수 있다.


    


패치 방법

위에서 말했듯이 XE개발자가 무엇 때문에 변수 초기화를 하지 않았는지는 모르지만 특별한 이유가 있어서 초기화를 하지 않은 것이라면 이렇게 수정해주면 된다. (MYSQL 뿐만 아니라 다른 파일들도 이러한 형식으로 패치 하면 될 것이다. MSSQL에는 int형 컬럼에 문자가 들어가면 오류가 날 것 같은데 이 부분은 따로 패치 하면 될 것 같다.) 게시판과 회원페이지 말고도 insert 문이나 update 문을 쓰는 곳이 있기 때문에 그 부분도 따로 패치 하면 될 것 같다.


     


이 패치 방식은 인트형이라도 쿼터를 붙여 인젝션이 일어나지 않게 하는 패치이다. Insert 부분 말고도 update문에서도 인젝션이 가능하다. 이 부분도 이렇게 패치해주면 된다.


     


[글_ 강인욱 선린인터넷고등학교 & Sur3x5F Team 1학년(hkkiw0823@naver.com)]


<저작권자: 보안뉴스(http://www.boannews.com/) 무단전재-재배포금지>