PHP开源项目在线银行系统(online-banking-system)的代码审计

项目信息 内容
报告名称 在线银行系统审计报告
审计对象 online-banking-system
审计日期 2025年11月6日 - 2025年11月7日
审计人员 MosHSasA
报告日期 2025年11月7日

1.1 执行摘要

    1. 审计概述:本次审计挑选了该项目里三个漏洞来进行分析,所用到的审计工具为——“rips”。
    1. 漏洞统计
    风险等级 漏洞数量
    严重 3
    1. 整体风险评估:因为只挑选了部分漏洞进行分析,这里不做整体评估。
    1. 修复建议摘要:立即修复上述所有漏洞。

1.2 漏洞详情

1.2.1 VULN - 001 - 反射型XSS漏洞 - /edit_customer.php?cust_id=n

  • 漏洞名称:反射型XSS

  • 风险等级:严重

  • 漏洞文件:/edit_customer.php

  • 相关函数/代码行:

    • 第16行:$_SESSION['cust_id'] = $_GET['cust_id'];
    • 第68行:<?php echo $_SESSION['cust_id'] ?>
  • 漏洞描述:在当前文件中,代码直接从$_GET超全局数组中获取id参数,并为经过任何过滤就在第68行通过echo函数输出。攻击者可以通过修改URL传入的参数来执行任意XSS的Payload。

  • 漏洞验证步骤:

    1. 访问正常URL:http://该项目部署的IP:端口/edit_customer.php?cust_id=1

    1

    1. 构造攻击URL:http://该项目部署的IP:端口/edit_customer.php?cust_id=<script>alert("XSS")</script>

    2

    1. 观察页面返回,成功弹窗。

    3

  • 修复建议:建议对输出进行HTML实体编码。

    • 修改第68行的代码,对输出的内容使用PHP内置函数htmlspecialchars()进行转义。

    • 修改后的代码如下:

      1
      <?php echo htmlspecialchars($_SESSION['cust_id'], ENT_QUOTES, 'UTF-8'); ?>
    • 原理:这个函数的作用是会将特殊字符(例如<>"'&)转换为HTML实体(例如:&lt&gt)。这样即使攻击者输入<script>alert("XSS")</script>,它也会被原样显示为文本,而不会被执行。

1.2.2 VULN - 002 - 存储型XSS漏洞 - /post_news.php

  • 漏洞名称:存储型XSS

  • 风险等级:严重

  • 漏洞文件:/post_news_action.php

  • 相关函数/代码行:

    • 第22行:$headline = mysqli_real_escape_string($conn, $_POST["headline"]);
    • 第23行:$news_details = mysqli_real_escape_string($conn, $_POST["news_details"]);
    • 第38行:echo "Error: " . $sql0 . "<br>" . $conn->error . "<br>";
    • 第39行:echo "Error: " . $sql1 . "<br>" . $conn->error . "<br>";
  • 漏洞描述:在当前文件中,代码直接从先是从表单中获取需要插入进数据库中的数据,但是并未做任何的过滤,再看第38、39行当攻击的输入中包含了<script>时,导致插入操作失败,在浏览器回显的错误信息中会包含用户刚刚输入的内容,那么JS代码将会在浏览器执行。

  • 漏洞验证步骤:

    1. 访问正常页面:http://该项目部署的IP:端口/post_news.php

    4

    1. 在正常的新闻发布页面,我们可以直接构造恶意JS代码为标题或者内容。

    5

    1. 在提交之后,当我们访问/news.php页面(新闻浏览页面)时,就会看到弹窗。

    6

  • 修复建议:和上个漏洞一样对错误回显进行HTML实体编码。

1.2.2 VULN - 003 - SQL注入漏洞 - /send_funds.php

  • 漏洞名称:SQL注入漏洞

  • 风险等级:严重

  • 漏洞文件:/send_funds.php

  • 相关函数/代码行:

    • 第12行:$sql0 = "SELECT * FROM customer WHERE cust_id=".$id;
  • 漏洞描述:将从$_GET超全局数组中获取id参数未加任何过滤直接拼接在SQL语句之后。这导致攻击者可以直接进行SQL语句注入。

  • 漏洞验证步骤:

    1. 进入正常的页面。

    7

    1. 在请求参数中注入恶意SQL代码(已经尝试过联合注入和报错注入均未得到结果,所以这里直接演示盲注)。

    8

    9

    1. 由此攻击者可以得到更多的数据库信息。
  • 修复建议:使用预处理语句。