From 79f915988bdbec27aa0279689961eb8756be6b8b Mon Sep 17 00:00:00 2001 From: thisgun Date: Tue, 7 Apr 2026 16:20:18 +0000 Subject: [PATCH] =?UTF-8?q?[security]=EA=B0=9C=EC=9D=B8=EA=B2=B0=EC=A0=9C?= =?UTF-8?q?=20hash=20=EA=B2=80=EC=A6=9D=EC=9D=84=20strict=20=EB=B9=84?= =?UTF-8?q?=EA=B5=90(=3D=3D=3D)=EB=A1=9C=20=EA=B0=95=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit shop/personalpayformupdate.php와 lib/shop.lib.php의 ss_personalpay_hash 검증이 loose 비교(==/!=)를 사용하여 PHP type juggling 잠재적 우회 가능성이 있었음. md5 결과 중 "0e..." 형식 hash는 PHP의 loose 비교에서 0e 지수 표기법으로 해석되어 다른 "0e..." 해시와 동등 판정될 수 있음 (소위 magic hash collision 패턴). 실제 익스플로잇 가능성은 낮지만 (md5 출력은 32자 hex 문자열이고 PHP의 문자열 vs 문자열 비교에서는 0e... 패턴이 적용되지 않는 경우가 많음), defense in depth 차원에서 strict 비교로 변경. mobile/shop/personalpayformupdate.php는 이미 strict 비교를 사용 중이라 core 두 곳만 동일한 패턴으로 정렬. - shop/personalpayformupdate.php:35: != / != → !== / !== - lib/shop.lib.php:2333: == → === --- lib/shop.lib.php | 2 +- shop/personalpayformupdate.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/shop.lib.php b/lib/shop.lib.php index ce27d0114..7a4b3258a 100644 --- a/lib/shop.lib.php +++ b/lib/shop.lib.php @@ -2403,7 +2403,7 @@ function exists_inicis_shop_order($oid, $pp=array(), $od_time='', $od_ip='') //개인결제 if( $pp ) { $hash_data = md5($pp['pp_id'].$pp['pp_price'].$pp['pp_time']); - if( $hash_data == get_session('ss_personalpay_hash') ){ + if( $hash_data === get_session('ss_personalpay_hash') ){ // 개인결제번호제거 set_session('ss_personalpay_id', ''); set_session('ss_personalpay_hash', ''); diff --git a/shop/personalpayformupdate.php b/shop/personalpayformupdate.php index 0cc910fe6..e3e857c48 100644 --- a/shop/personalpayformupdate.php +++ b/shop/personalpayformupdate.php @@ -29,7 +29,7 @@ if($pp['pp_tno']) alert('이미 결제하신 개인결제 내역입니다.', $page_return_url); $hash_data = md5($pp_id.$good_mny.$pp['pp_time']); -if($pp_id != get_session('ss_personalpay_id') || $hash_data != get_session('ss_personalpay_hash')) +if($pp_id !== get_session('ss_personalpay_id') || $hash_data !== get_session('ss_personalpay_hash')) die('개인결제 정보가 올바르지 않습니다.'); // PG사의 가상계좌 또는 계좌이체의 자동 현금영수증 초기배열값