2024-04-15 12:00 (월)
쇼핑몰 솔루션 위즈몰 0-day 취약점 다수 발견
상태바
쇼핑몰 솔루션 위즈몰 0-day 취약점 다수 발견
  • 길민권
  • 승인 2011.10.21 08:55
이 기사를 공유합니다

File Download, LFI, SQL Injection 취약점…근본 문제 해결해야
국내에서 인지도가 높은 쇼핑몰 솔루션 위즈몰에 대한 최신 취약점이 다수 발견되었다.
 
이번 취약점은 File Download, LFI, SQL Injection 등이다. 지난 18일 데일리시큐는 위즈몰에 대한 SQL Injection 취약점 관련 기사를 보도한 바 있다. 이에 추가적인 취약점이 발견돼 기술적인 부분을 구체적으로 보여주고 대응방안에 대해 공유하고자 한다. 취약점 정보 출처는 국제정보보안교육센터(i2Sec)다.  
 
◇File Download
 <파로스를 이용하여 요청 URL을 확인>
 
웹 프록시로 확인된 URL을 이용하여 전달되는 파라미터 값을 체크한다. URL 요청 시 넘겨줄 파라미터가 어떠한 것들이 있는지 분석해 다른 파라미터 값을 전달하여 중요파일을 다운로드 하도록 한다.
 
 
변경된 패턴을 추가로 삽입하여 URL을 요청하였다.
 
 < 패턴을 추가하여 URL요청 시 다운로드 창 활성화>
 
File Download 대응방안
 
 <download.php 소스코드>
 
Download.php 파일의 소스 코드 부분 중 URL 생성코드 부분이다. URL 생성 시 어떠한 필터링 작업을 하지 않고 있다.
 
<filedownload 함수 소스코드>
 
Filedownload 함수에서는 전달받은 파라미터를 필터링하는 부분 찾을 수 있다.
 
$filename = str_replace(" ", "+", $filename);
 
소스 코드 부분에서는 전달 받은 filename중에서 ‘’(스페이스, 공백)부분을 ‘+’로 변경한다.
 
Filename 파라미터 값으로 상위경로 요청 패턴 등을 검색하는 필터링 작업은 이루어 지지 않고 있다. 다운로드를 하기 위해서는 Base64로 인코딩 되어 웹 서버에 저장된 파일을 불러오기 때문에 ‘/’는 filename에 포함되지만 ‘.’, ‘%’는 포함될 수 없으므로 ‘.’을 찾아서 필터링 해주어야 한다.
 
$filename = str_replace("../", "./", $filename);
$filename = str_replace("./", "..", $filename);
$filename = str_replace("..", "", $filename);
$filename = str_replace(".", "", $filename);
$filename = str_replace("%", "", $filename);
 
전달받은 url과 filename을 이용하여 fullpath라는 최종 경로를 생성한다.
 
$fullpath = $ url.$ filename;
:
:
$fullpath = str_replace("../../", "", $ fullpath);
 
Fullpath 생성 후 위와 같은 방법으로 필터링을 하고 있습니다.
 
‘../../’ 부분을 찾아서 삭제해주는 작업을 1회만 실시하고 있어 다양한 우회 패턴을 만들 수 있다.
필터링 항목을 추가하여 패턴 생성을 할 수 없도록 해야 한다.
 
$fullpath = str_replace("../../", ".../", $ fullpath);
 
위와 같은 필터링 작업 후 찾을 수 없는 경로를 생성하도록 하여 다운로드 취약점을 방지 하도록 한다.
 
◇LFI (Local File Inclusion)
 
<DB 정보 파일 요청> 
 
<Linux OS - /etc/passwd 파일 요청>

◇LFI (Local File Inclusion) 대응방안
소스 코드 분석 시 path 변수 생성 시 사용된 변수 folder 와 imgname은 상위 경로를 요청할 필요가 없는 변수이므로 변수 대입 전에 필터링 작업을 하여 불 필요한 값을 사용 할 수 없도록 해야 한다.
 
$imgname = str_replace(".", "", $imgname);
$folder = str_replace(".", "", $folder);
$path = "../config/uploadfolder/productimg/".$folder."/".$imgname;
 
위와 같은 코드를 path 생성 전에 추가하여 변수 내에 불 필요한 문자(폴더명과 이미지 이름에는 ‘.’을 사용하지 않음)를 찾아서 필터하여 삭제 하여 취약점을 보안 할 수 있다.
 
◇SQL Injection
위 파일들은 전달 받은 파라미터를 이용하여 연산된 결과를 프린터 출력을 하기 위한 PHP파일들이며, 각 위치한 디렉터리는 다르지만 소스 내용은 동일 하여 동일한 방식으로 점검했다.
 
<SQL Injection 취약점이 발견된 소스 코드 부분> 
 
<UID 2번의 회원의 ID와 Passwd>
 
파라미터를 입력하자 인쇄 페이지가 활성화 되고, 출력된 값을 확인해 보면 UID 2번의 회원 ID와 Passwd가 출력되는 것이 확인 되었다.
 
DB에서 조회된 정보 중 제일 처음 페이지와 그중 8번째 11번째 컬럼의 값만을 출력하기 때문에 많은 정보를 획득하기 위해서는 시간이 많이 소요 되겠지만 입력한 파라미터의 결과에 맞춰 DB의 주요 정보가 노출 되고 있다는 것을 확인했다.  
 
◇SQL Injection 대응방안
쿼리문 생성 과정에서 파라미터로 넘어온 값의 검증하지 않는 취약점을 이용한 SQL 인젝션 방법이므로 전달 받은 파라미터에서 필요하지 않은 입력 값에 대한 필터링 작업을 실시 하여 보안 하는 방법을 사용할 수 있다.
 
변수에서 테이블명 생성 전에 BID변수값을 필터링 한다.
 
$BID = str_replace(" ", "@", $BID);
$BID = str_replace("SELECT", "@", $BID);
$BID = str_replace("union", "@", $BID);
$BOARD_NAME="wizTable_${GID}_${BID}";
 
쿼리문 생성전에 사용되는 변수 UID값 필터링 한다.
 
$UID = str_replace(" ", "@", $UID);
$UID = str_replace("SELECT", "@", $UID);
$UID = str_replace("union", "@", $UID);
$sqlstr="SELECT * FROM $BOARD_NAME where UID='$UID'";
 
이번 취약점을 발표한 국제정보보안교육센터(i2Sec) 이창한 씨는 “대중화되어 있는 취약점에 대해서 관심과 신속한 대응이 이루어져야 한다”고 강조했다. [데일리시큐=길민권 기자]
 
■ 보안 사건사고 제보 하기

▷ 이메일 : mkgil@dailysecu.com

▷ 제보 내용 : 보안 관련 어떤 내용이든 제보를 기다립니다!

▷ 광고문의 : jywoo@dailysecu.com

★정보보안 대표 미디어 데일리시큐 / Dailysecu, Korea's leading security media!★