记录一次某OA代码审计
字数 1035 2025-08-23 18:31:09

OA系统安全审计与漏洞分析教学文档

1. 漏洞概述

本次审计发现某OA系统存在多个严重安全漏洞,包括:

  • 未授权访问漏洞
  • 前台SQL注入漏洞
  • 文件上传漏洞导致的存储型XSS
  • 逻辑缺陷导致的登录绕过漏洞

2. 未授权访问漏洞分析

2.1 漏洞原理

多个文件未包含鉴权文件checklogin.php,导致可以直接访问这些文件而无需登录验证。

2.2 漏洞示例

系统中存在多个文件未进行权限检查,如:

  • juese.php
  • upload.php
  • upfile.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 . '"}');

利用方法

  1. 构造data:image/php;base64,开头的base64编码
  2. 后面跟上恶意PHP代码的base64编码
  3. 系统会写入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. 修复建议

  1. 统一鉴权机制

    • 所有需要权限的页面必须包含checklogin.php
    • 改进鉴权逻辑,验证Cookie值的有效性而不仅仅是存在性
  2. SQL注入防护

    • 使用预处理语句(PDO或mysqli prepared statements)
    • 对所有用户输入进行严格的过滤和转义
  3. 文件上传安全

    • 严格限制上传文件类型
    • 对上传文件进行内容检查
    • 上传文件存储在非web可访问目录
    • 为上传文件设置新的随机名称
  4. XSS防护

    • 对用户提交的所有内容进行HTML实体编码
    • 设置Content-Security-Policy头
  5. 会话管理

    • 使用安全的会话机制
    • Cookie设置HttpOnly和Secure标志
    • 实现CSRF防护机制

7. 总结

本次审计揭示了OA系统中存在的多个严重安全问题,这些问题组合利用可能导致系统完全被攻陷。开发人员应重视安全编码实践,对所有用户输入保持怀疑态度,并实施多层防御措施。

OA系统安全审计与漏洞分析教学文档 1. 漏洞概述 本次审计发现某OA系统存在多个严重安全漏洞,包括: 未授权访问漏洞 前台SQL注入漏洞 文件上传漏洞导致的存储型XSS 逻辑缺陷导致的登录绕过漏洞 2. 未授权访问漏洞分析 2.1 漏洞原理 多个文件未包含鉴权文件 checklogin.php ,导致可以直接访问这些文件而无需登录验证。 2.2 漏洞示例 系统中存在多个文件未进行权限检查,如: juese.php upload.php upfile.php 这些文件直接处理用户请求而没有验证用户身份。 3. SQL注入漏洞分析 3.1 漏洞原理 在SQL语句拼接时未对用户输入进行过滤,导致SQL注入漏洞。 3.2 漏洞代码示例 3.3 另一个注入点 4. 文件上传漏洞与XSS 4.1 文件上传漏洞 upload.php 文件存在文件上传漏洞,可以上传HTML文件: 关键点 :必须传参 dir=file ,否则会默认当作image类型处理。 4.2 另一个文件上传漏洞 upfile.php 存在基于base64的文件上传漏洞: 利用方法 : 构造 data:image/php;base64, 开头的base64编码 后面跟上恶意PHP代码的base64编码 系统会写入PHP文件 5. 登录绕过漏洞 5.1 漏洞原理 checklogin.php 中的鉴权逻辑存在缺陷: 5.2 绕过方法 只需设置以下Cookie且值不为空即可绕过登录验证: 6. 修复建议 统一鉴权机制 : 所有需要权限的页面必须包含 checklogin.php 改进鉴权逻辑,验证Cookie值的有效性而不仅仅是存在性 SQL注入防护 : 使用预处理语句(PDO或mysqli prepared statements) 对所有用户输入进行严格的过滤和转义 文件上传安全 : 严格限制上传文件类型 对上传文件进行内容检查 上传文件存储在非web可访问目录 为上传文件设置新的随机名称 XSS防护 : 对用户提交的所有内容进行HTML实体编码 设置Content-Security-Policy头 会话管理 : 使用安全的会话机制 Cookie设置HttpOnly和Secure标志 实现CSRF防护机制 7. 总结 本次审计揭示了OA系统中存在的多个严重安全问题,这些问题组合利用可能导致系统完全被攻陷。开发人员应重视安全编码实践,对所有用户输入保持怀疑态度,并实施多层防御措施。