개요
해당 취약점은 unlink 인자로 사용되는 변수를 조작하여 data/dbconfig.php 파일을 삭제한 뒤, 재설치하는 과정에서 Command Injection으로 임의의 명령어를 실행시키는 취약점 인 것 같습니다.
(제보자가 어떤식으로 익스플로잇 했을지는 알 수 없기 때문에 ㅎㅎ...)
취약점 관련 정보
정보 | 내용 |
취약 버전 | Young Cart <= 5.4.2.4 |
패치 버전 | Young Cart 5.4.2.5 |
취약점 종류 | Command Injection |
KVE 번호 | KVE 2020-0200,0202 |
패치 내역(-는 패치 이전 코드, +는 패치 이후 코드)
adm/shop_admin/itemdelete.inc.php
# 22 Line
- $file = G5_DATA_PATH.'/item/'.$it['it_img'.$i];
+ $file = G5_DATA_PATH.'/item/'.clean_relative_paths($it['it_img'.$i]);
if(is_file($file) && $it['it_img'.$i]) {
@unlink($file);
# 81 Line
- $destfile = G5_PATH.$data_path;
+ $destfile = G5_PATH.clean_relative_paths($data_path);
# 83 Line
- if(is_file($destfile))
+ if(is_file($destfile) && preg_match('/(\.(gif|jpe?g|png))$/i', $destfile))
@unlink($destfile);
# 98 Line
- $destfile = G5_PATH.$data_path;
+ $destfile = G5_PATH.clean_relative_paths($data_path);
# 100 Line
- if(is_file($destfile))
+ if(is_file($destfile) && preg_match('/(\.(gif|jpe?g|png))$/i', $destfile))
@unlink($destfile);
install/install_db.php
# 26 ~ 30 Line
- $mysql_host = $_POST['mysql_host'];
- $mysql_user = $_POST['mysql_user'];
- $mysql_pass = $_POST['mysql_pass'];
- $mysql_db = $_POST['mysql_db'];
- $table_prefix= $_POST['table_prefix'];
+ $mysql_host = safe_install_string_check($_POST['mysql_host']);
+ $mysql_user = safe_install_string_check($_POST['mysql_user']);
+ $mysql_pass = safe_install_string_check($_POST['mysql_pass']);
+ $mysql_db = safe_install_string_check($_POST['mysql_db']);
+ $table_prefix= safe_install_string_check($_POST['table_prefix']);
# 38 Line
- $g5_shop_prefix = $_POST['g5_shop_prefix'];
+ $g5_shop_prefix = safe_install_string_check($_POST['g5_shop_prefix']);
# 41 Line
- if (preg_match("/[^0-9a-z_]+/i", $table_prefix) ) {
+ if (preg_match("/[^0-9a-z_]+/i", $table_prefix) || preg_match("/[^0-9a-z_]+/i", $g5_shop_prefix)) {
분석
패치 내역으로 관리자 페이지의 상품 관리 메뉴에서 상품을 삭제할 때 unlink 인자로 사용되는 변수를 조작 가능한 것을 확인하였습니다.
저는 이 중 adm/shop_admin/itemdelete.inc.php의 destfile 변수를 이용하여 data/dbconfig.php 파일을 삭제하였습니다.
(dbconfig.php 파일을 삭제할 경우 그누보드, 영카트를 재설치할 수 있으며, 인스톨 페이지에서 Command Injection 취약점이 발생하였습니다.)
아래는 adm/shop_admin/itemdelete.inc.php에서 해당 취약점이 발생하는 코드입니다.
$sql = " select it_explan, it_mobile_explan, it_img1, it_img2, it_img3, it_img4, it_img5, it_img6, it_img7, it_img8, it_img9, it_img10 from {$g5['g5_shop_item_table']} where it_id = '$it_id' ";
$it = sql_fetch($sql);
$imgs = get_editor_image($it['it_explan'], false);
for($i=0;$i<count($imgs[1]);$i++) {
$p = parse_url($imgs[1][$i]);
if(strpos($p['path'], "/data/editor/") === false)
continue;
if(strpos($p['path'], "/data/") != 0)
$data_path = preg_replace("/^\/.*\/data/", "/data", $p['path']);
else
$data_path = $p['path'];
$destfile = G5_PATH.$data_path;
if(is_file($destfile))
@unlink($destfile);
}
간단히 설명하자면, it_explan에 존재하는 이미지 경로들을 확인하여 해당 경로에 실제 파일이 존재할 경우 unlink 함수를 이용하여 삭제하는 코드입니다.
해당 코드를 악용하기 위해, 먼저 상품 관리 메뉴에 등록된 상품의 설명창에서 임의의 사진을 첨부합니다.
사진을 등록한 후 확인 버튼을 클릭한 뒤, Burp Suite를 이용하여 Request 데이터의 it_explan 파라메터에 <img> 태그의 경로를 dbconfig.php 파일을 가르키도록 변경합니다.
이후 해당 상품을 삭제할 경우, 로직에 따라 data/dbconfig.php 파일이 삭제되는 것을 확인할 수 있습니다.
지금까지는 unlink 함수에 사용되는 인자를 변조하여, data/dbconfig.php 파일을 삭제함으로써 그누보드 설치 페이지에 접속할 수 있었습니다.
다음은 install/install_db.php에서 Command Injection 취약점이 발생하는 코드입니다.
# 30 Line
$table_prefix= $_POST['table_prefix'];
# 537 Line
$file = '../'.G5_DATA_DIR.'/'.G5_DBCONFIG_FILE;
$f = @fopen($file, 'a');
fwrite($f, "<?php\n");
fwrite($f, "if (!defined('_GNUBOARD_')) exit;\n");
fwrite($f, "define('G5_MYSQL_HOST', '{$mysql_host}');\n");
fwrite($f, "define('G5_MYSQL_USER', '{$mysql_user}');\n");
fwrite($f, "define('G5_MYSQL_PASSWORD', '{$mysql_pass}');\n");
fwrite($f, "define('G5_MYSQL_DB', '{$mysql_db}');\n");
fwrite($f, "define('G5_MYSQL_SET_MODE', {$mysql_set_mode});\n\n");
fwrite($f, "define('G5_TABLE_PREFIX', '{$table_prefix}');\n\n");
그누보드, 영카트를 재설치하는 과정에서 TABLE명 접두사에 명령문을 삽입하여 설치할 경우, Command Injection 취약점이 발생하였습니다.
설치가 완료된 후, 사이트에 재접속해보면 모든 페이지에 명령 구문이 삽입되어 실행되는 것을 확인할 수 있습니다.
해당 취약점을 통하여 실제 위협이 발생하려면 두 가지의 선행 조건이(관리자 계정의 로그인 선행, DB 계정 정보 필요) 필요하기 때문에, 실제 Exploit 가능성은 낮다라고 생각이 됩니다.
Reference
https://github.com/gnuboard/youngcart5/commit/478dd0ffdad51a8ed4aa9a628f95e809ebe8c019
'Hack > Web' 카테고리의 다른 글
strtoupper를 이용한 XSS 공격 (0) | 2021.01.06 |
---|---|
[KVE-2020-0164] YoungCart 1Day 취약점 분석 (SQL Injection) (0) | 2020.09.22 |
[KVE-2020-0656] YoungCart 1Day 취약점 분석 (Command Injection) (0) | 2020.09.22 |
Node js Prototype Pollution (0) | 2020.09.22 |
Relative Path Overwrite(RPO) (0) | 2020.09.22 |
댓글