记录一次某OA代码审计
字数 1035 2025-08-23 18:31:09
OA系统安全审计与漏洞分析教学文档
1. 漏洞概述
本次审计发现某OA系统存在多个严重安全漏洞,包括:
- 未授权访问漏洞
- 前台SQL注入漏洞
- 文件上传漏洞导致的存储型XSS
- 逻辑缺陷导致的登录绕过漏洞
2. 未授权访问漏洞分析
2.1 漏洞原理
多个文件未包含鉴权文件checklogin.php,导致可以直接访问这些文件而无需登录验证。
2.2 漏洞示例
系统中存在多个文件未进行权限检查,如:
juese.phpupload.phpupfile.php
这些文件直接处理用户请求而没有验证用户身份。
3. SQL注入漏洞分析
3.1 漏洞原理
在SQL语句拼接时未对用户输入进行过滤,导致SQL注入漏洞。
3.2 漏洞代码示例
if($suserxm!=''){
$sql=$sql." and userxm like '%$suserxm%'";
}
if($sjiabie!=''){
$sql=$sql." and jiabie like '%$sjiabie%'";
}
if($smudidi!=''){
$sql=$sql." and mudidi like '%$smudidi%'";
}
if($sniandu!=''){
$sql=$sql." and niandu like '%$sniandu%'";
}
$sql=$sql." ORDER BY id asc LIMIT ".($pindex - 1) * $psize.','.$psize;
$list =$db->fetchall($sql);
3.3 另一个注入点
$sql="SELECT * FROM ".$db->tablename('juese') ." WHERE id>0";
if($key!=''){
$sql=$sql." and juese like '%$key%'";
}
$sql=$sql." ORDER BY id asc LIMIT ".($pindex - 1) * $psize.','.$psize;
$list =$db->fetchall($sql);
switch ($_GET['action']) {
case 'zidian':
$zidian=$_GET['fenlei'];//获取id
$sql="SELECT * FROM ".$db->tablename('vxiangmu') ." WHERE zidian='$zidian'";
$list =$db->fetchall($sql);
4. 文件上传漏洞与XSS
4.1 文件上传漏洞
upload.php文件存在文件上传漏洞,可以上传HTML文件:
POST /upload.php?dir=file HTTP/1.1
Host: 192.168.19.25:8888
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarywlAMbJmcCIjUNS80
------WebKitFormBoundarywlAMbJmcCIjUNS80
Content-Disposition: form-data; name="file";filename="1.html"
<script>alert(1)</script>
------WebKitFormBoundarywlAMbJmcCIjUNS80--
关键点:必须传参dir=file,否则会默认当作image类型处理。
4.2 另一个文件上传漏洞
upfile.php存在基于base64的文件上传漏洞:
<?php
$img = $_POST['imgbase64'];
if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $img, $result)) {
$type = "." . $result[2];
$path = "upload/" . date("Y-m-d") . "-" . uniqid() . $type;
}
$img = base64_decode(str_replace($result[1], '', $img));
@file_put_contents($path, $img);
exit('{"src":"' . $path . '"}');
利用方法:
- 构造
data:image/php;base64,开头的base64编码 - 后面跟上恶意PHP代码的base64编码
- 系统会写入PHP文件
5. 登录绕过漏洞
5.1 漏洞原理
checklogin.php中的鉴权逻辑存在缺陷:
function islogin(){
if(isset($_COOKIE['id'])&&isset($_COOKIE['loginname'])&&isset($_COOKIE['jueseid'])&&isset($_COOKIE['danweiid'])&&isset($_COOKIE['quanxian'])){
if($_COOKIE['id']&&$_COOKIE['loginname']&&$_COOKIE['jueseid']&&$_COOKIE['danweiid']&&$_COOKIE['quanxian']){
return true;
}
}
}
5.2 绕过方法
只需设置以下Cookie且值不为空即可绕过登录验证:
id=1; loginname=1; jueseid=1; danweiid=1; quanxian=1
6. 修复建议
-
统一鉴权机制:
- 所有需要权限的页面必须包含
checklogin.php - 改进鉴权逻辑,验证Cookie值的有效性而不仅仅是存在性
- 所有需要权限的页面必须包含
-
SQL注入防护:
- 使用预处理语句(PDO或mysqli prepared statements)
- 对所有用户输入进行严格的过滤和转义
-
文件上传安全:
- 严格限制上传文件类型
- 对上传文件进行内容检查
- 上传文件存储在非web可访问目录
- 为上传文件设置新的随机名称
-
XSS防护:
- 对用户提交的所有内容进行HTML实体编码
- 设置Content-Security-Policy头
-
会话管理:
- 使用安全的会话机制
- Cookie设置HttpOnly和Secure标志
- 实现CSRF防护机制
7. 总结
本次审计揭示了OA系统中存在的多个严重安全问题,这些问题组合利用可能导致系统完全被攻陷。开发人员应重视安全编码实践,对所有用户输入保持怀疑态度,并实施多层防御措施。