KVE에 해당하는 취약점은 SQL Injection을 포함하여 여러 취약점으로 구성되어있지만, SQL Injeciotn에 대해서 먼저 분석을 진행하였습니다.
취약점 관련 정보
정보 | 내용 |
취약 버전 | Young Cart <= 5.4.5.1 |
패치 버전 | Young Cart 5.4.5.2 |
취약점 종류 | SQL Injection |
KVE 번호 | KVE-2021-0172 KVE-2021-0329 KVE-2021-0330 |
패치 내역(-는 패치 이전 코드, +는 패치 이후 코드)
adm/qa_config_update.php
# 추가된 보안 패치 코드1
+ $src_char = array('&', '=');
+ $dst_char = array('&', '〓');
+ $qa_category = str_replace($src_char, $dst_char, $_POST['qa_category']);
+ $qa_category = preg_replace("/[\<\>\'\"\\\'\\\"\%\=\(\)\/\^\*]/", "", $qa_category);
# 추가된 보안 패치 코드2
$sql = " update {$g5['qa_config_table']}
set qa_title = '{$_POST['qa_title']}',
- qa_category = '{$_POST['qa_category']}',
+ qa_category = '{$qa_category}',
qa_skin = '{$_POST['qa_skin']}',
qa_mobile_skin = '{$_POST['qa_mobile_skin']}',
qa_use_email = '{$_POST['qa_use_email']}',
bbs/qawrite_update.php
# 160 Line
- @unlink(G5_DATA_PATH.'/qa/'.$write['qa_file'.$i]);
+ @unlink(G5_DATA_PATH.'/qa/'.clean_relative_paths($write['qa_file'.$i]));
# 207 Line
- @unlink(G5_DATA_PATH.'/qa/'.$write['qa_file'.$i]);
+ @unlink(G5_DATA_PATH.'/qa/'.clean_relative_paths($write['qa_file'.$i]));
# 247 Line
- $qa_category = $write['qa_category'];
+ $qa_category = addslashes($write['qa_category']);
분석
패치 내역을 분석해본 결과, 관리자 페이지에서 1:1문의 분류에 싱글 쿼터를 포함한 데이터를 저장할 경우 해당 데이터가 이용되는 SQL Query문에서 싱글 쿼터를 쿼리 내 문자열로 인식하지 않아 SQL Injeciton이 발생하는 것을 확인하였습니다.
먼저 1:1문의 설정의 분류에서 싱글 쿼터를 포함한 데이터를 저장합니다. 이때 주의해야할 점은 싱글 쿼터 앞에 \가 붙은 동일한 문자열을 한 번 더 입력해줘야 한다는 점입니다. (이를 지키지 않으면 1:1 문의 설정에서 글이 저장 안됨)
예시 : 회원|포인트|123'|123\'
이후 1:1문의의 분류에서 \가 들어가지 않은 분류를 선택한 뒤, 일반적인 문의 내용을 작성하여 저장합니다.
작성된 문의 게시글을 클릭해서 답변을 입력한 뒤, 답변등록 버튼을 클릭합니다.
qa_category에 저장된 싱글 쿼터가 문자열로 인식되지 않아 SQL Injection이 발생하는 것을 확인할 수 있습니다. (Young Cart의 sql_query 함수에서 에러 발생 이유가 노출되도록 설정한 화면입니다.)
더 자세한 Exploit 방법 및 다른 취약점들에 대한 내용은 나중에 추가하도록 하겠습니다.
Reference
github.com/gnuboard/youngcart5/commit/4acf51fb49b3ba8ef4b3b6e56d5f3e3cb5b23f17
'Hack > Web' 카테고리의 다른 글
DOM Clobbering XSS (0) | 2021.09.04 |
---|---|
Padding Oracle Attack (2) | 2021.09.03 |
strtoupper를 이용한 XSS 공격 (0) | 2021.01.06 |
[KVE-2020-0164] YoungCart 1Day 취약점 분석 (SQL Injection) (0) | 2020.09.22 |
[KVE-2020-0200,0202] YoungCart 1Day 취약점 분석 (Command Injection) (0) | 2020.09.22 |
댓글