某电影cms审计处体验
字数 1796 2025-08-29 08:32:24
某电影CMS安全审计报告与漏洞分析
1. 文件读取漏洞
1.1 like.php 文件读取漏洞
位置: data/like.php
漏洞代码:
$fang=$_GET['play'];
$jmfang=base64_decode($fang);
$like=file_get_contents($jmfang);
漏洞分析:
- 直接通过
play参数接收用户输入 - 对输入进行base64解码后直接传递给
file_get_contents() - 无任何过滤或限制,导致任意文件读取
利用方法:
- 将目标文件路径进行base64编码
- 通过play参数传递编码后的路径
- 示例:
like.php?play=base64_encode('/etc/passwd')
限制:
- 虽然可以读取文件内容,但由于后续的正则匹配处理,可能不会直接显示文件内容
- 需要结合其他技术手段提取数据
1.2 play.php 文件读取漏洞
位置: play.php
漏洞代码:
$player = base64_decode($_GET['play']);
$tvinfo = file_get_contents($player);
漏洞分析:
- 与like.php类似,直接解码并读取文件
- 同样缺乏过滤和限制
2. SQL注入漏洞
2.1 agent/index.php SQL注入
位置: agent/index.php
漏洞代码:
if($_GET['type']=='Sell' and $_GET['id']!=''){
$cm->query("UPDATE d_kami SET km_sell=1 WHERE km_id ='".$_GET['id']."'");
echo tiao("已复制好,可贴粘。", "index.php");
exit();
}
漏洞分析:
id参数直接拼接进SQL语句,无任何过滤- 攻击者可构造恶意SQL语句进行注入
- 需要先注册代理账号才能利用
利用方法:
- 注册代理账号并登录
- 构造恶意请求:
agent/index.php?type=Sell&id=123' AND (SELECT 1 FROM (SELECT SLEEP(5))a)--
2.2 时间盲注漏洞
位置: agent/index.php
漏洞代码:
if($_GET['type']=='close' and $_GET['id']!=''){
$cm->query("UPDATE d_kami SET km_sell=0 WHERE km_id ='".$_GET['id']."'");
echo backs("卡密取消复制成功!");
exit();
}
漏洞分析:
- 与上述注入类似,可用于时间盲注
- 通过响应时间判断注入结果
3. XSS跨站脚本漏洞
3.1 payreturn.php 反射型XSS
位置: payreturn.php
漏洞代码:
$orderid = $_GET["orderid"];
echo $orderid;
漏洞分析:
- 直接输出未过滤的用户输入
- 可构造恶意JavaScript代码执行
利用方法:
payreturn.php?orderid=<script>alert(/xss/)</script>
3.2 admin/edituser.php 存储型XSS
位置: admin/edituser.php
漏洞代码:
echo tiao("修改成功!", "edituser.php?id=" . $_POST["id"]);
漏洞分析:
- 直接将POST的id参数输出到JavaScript中
- 需要闭合前面的JavaScript代码才能执行
利用方法:
POST数据: admin_aglevel=1&id=123</script>');<script>alert(/xss/)</script>('
绕过技巧:
- 闭合前面的JavaScript代码
- 插入自己的恶意代码
- 确保整体语法正确
4. 文件上传漏洞
位置: 未明确指定文件名(可能是index.php)
漏洞代码:
if(is_array($_FILES["upfile"])){
$i=0;
if($_POST['pwd'] != $passwd){
echo '<script>alert("ûȨȨ")</script>';
exit;
}
//...省略部分代码...
$file = $_FILES["upfile"];
if(!in_array($file["type"][$i], $uptypes))
//...省略部分代码...
$pinfo=pathinfo($file["name"][$i]);
$ftype=$pinfo[extension];
$destination = $destination_folder.$i.time().".".$ftype;
漏洞分析:
- 存在上传密码保护,但密码硬编码在
inc/aik.config.php中(tu_pass=123456) - 仅检查Content-Type,可通过修改绕过
- 最终文件名使用原始扩展名,可直接上传PHP文件
利用方法:
- 获取上传密码(123456)
- 构造上传表单,修改Content-Type为允许的类型(如image/jpeg)
- 上传PHP文件(如phpinfo.php或webshell)
完整利用步骤:
- 准备上传表单:
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="upfile[]">
<input type="password" name="pwd" value="123456">
<input type="submit">
</form>
- 使用Burp Suite等工具修改Content-Type
- 上传PHP文件获取webshell
5. 安全建议
5.1 文件读取防护
- 避免直接使用用户输入作为文件路径
- 如果需要,应严格限制可访问的目录和文件类型
- 使用白名单机制验证文件路径
5.2 SQL注入防护
- 使用预处理语句(PDO或mysqli)
- 对所有用户输入进行严格的过滤和转义
- 使用框架提供的安全查询方法
5.3 XSS防护
- 对所有输出到页面的内容进行HTML实体编码
- 设置Content Security Policy(CSP)头
- 使用HTTPOnly和Secure标志的Cookie
5.4 文件上传防护
- 不要依赖客户端验证(如Content-Type)
- 检查文件内容而不仅是扩展名
- 重命名上传文件并使用安全的扩展名
- 将上传文件存储在非web可访问目录
- 设置上传目录无执行权限
5.5 其他建议
- 避免在代码中硬编码敏感信息(如密码)
- 实施最小权限原则
- 定期进行安全审计和代码审查
- 保持系统和组件更新
6. 总结
本次审计发现了某电影CMS中存在的多个严重安全漏洞,包括文件读取、SQL注入、XSS和文件上传漏洞。这些漏洞可导致敏感信息泄露、数据库篡改、跨站脚本攻击甚至服务器完全沦陷。建议开发者立即修复这些漏洞,并全面审查代码中的安全问题。