通过代码审计找出网站中的XSS漏洞实战
字数 1175 2025-08-18 11:37:41

XSS漏洞代码审计实战教学文档

一、背景与概述

本教学文档基于对渗透测试系统的代码审计实践,详细讲解如何通过代码审计方式挖掘XSS漏洞。XSS(跨站脚本攻击)是一种常见的Web安全漏洞,攻击者能够将恶意脚本注入到其他用户浏览的网页中。

二、审计准备工作

1. 目标系统

  • 审计系统:permeate渗透测试系统
  • 系统架构:基于MVC模式

2. 关键位置定位

审计XSS漏洞需要首先定位系统中的关键位置:

2.1 控制器定位

  1. 通过URL分析入口文件:home/index.php
  2. 分析主入口文件发现控制器加载逻辑:
    <?php
    require_once "../core/common.php";
    include "./public/header.php";
    includeAction("$model","$action");
    include "./public/footer.php";
    
  3. common.php中找到控制器存放路径:home/action/

2.2 模板定位

  1. 通过控制器中的displayTpl函数定位模板路径
  2. 模板存放于:home/tpl/目录下

三、正向审计方法

1. 审计流程

  1. 从参数接收位置开始审计
  2. 追踪参数传递过程
  3. 检查最终输出位置是否过滤

2. 实例分析

案例1:反射型XSS漏洞

  1. 参数接收位置tiezi.php控制器中的index方法

    public function index() {
        $id = $_GET['bk'];
        $bk = &$id;
        // ...其他代码...
        $data['bk'] = $bk;
        displayTpl('tiezi/index', $data);
    }
    
    • 直接接收$_GET['bk']参数,未做任何过滤
  2. 模板输出位置tiezi/index.php

    <a class="btn btn-primary" href="fatie.php?bk=<?php echo $bk ?>">发帖</a>
    
    • 直接输出变量,未做HTML编码
  3. 漏洞验证

    http://permeate.songboy.net/home/index.php?m=tiezi&a=index&bk=6"><script>alert(123)</script>
    

四、反向审计方法

1. 审计流程

  1. 从模板中的变量输出点开始
  2. 反向追踪变量来源
  3. 检查输入是否经过过滤

2. 实例分析

案例2:搜索型XSS漏洞

  1. 模板输出点search.php

    echo $keyword;
    
    • 直接输出搜索关键词
  2. 变量来源追踪

    $keywords = $_REQUEST['keywords'];
    if (!empty($keywords)) {
        $where = " where title like '%$keywords%' ";
    }
    
    • 直接接收用户输入,未做过滤
  3. 漏洞验证

    http://permeate.songboy.net/home/search.php?keywords=测试<script>alert(123)</script>
    

五、审计技巧总结

1. 关键搜索技巧

  1. 控制器中搜索:$_GET$_POST$_REQUEST
  2. 模板中搜索:echoprint等输出函数
  3. 使用正则表达式匹配变量输出:echo \$([a-z]*)

2. 常见危险模式

  1. 直接输出用户输入:
    echo $_GET['param'];
    
  2. 在HTML属性中直接使用变量:
    <a href="<?php echo $url ?>">
    
  3. 在JavaScript中直接拼接用户输入:
    var userInput = '<?php echo $input ?>';
    

3. 安全建议

  1. 所有输出到HTML的内容都应进行HTML实体编码:
    htmlspecialchars($output, ENT_QUOTES, 'UTF-8');
    
  2. 输出到JavaScript的内容应使用json_encode
    var data = <?php echo json_encode($data); ?>;
    
  3. 使用内容安全策略(CSP)作为额外防护层

六、扩展审计思路

  1. 存储型XSS审计

    • 追踪用户输入->数据库存储->输出的完整流程
    • 检查数据存储前后是否进行过滤
  2. DOM型XSS审计

    • 检查前端JavaScript中动态操作DOM的部分
    • 关注innerHTMLdocument.write等危险API的使用
  3. 框架特定审计

    • 不同框架有各自的XSS防护机制
    • 检查是否正确使用框架提供的安全功能

通过本教学文档的系统学习,您应该已经掌握了通过代码审计挖掘XSS漏洞的核心方法和技巧。实际审计中需要结合多种方法,全面检查系统的输入输出处理流程。

XSS漏洞代码审计实战教学文档 一、背景与概述 本教学文档基于对渗透测试系统的代码审计实践,详细讲解如何通过代码审计方式挖掘XSS漏洞。XSS(跨站脚本攻击)是一种常见的Web安全漏洞,攻击者能够将恶意脚本注入到其他用户浏览的网页中。 二、审计准备工作 1. 目标系统 审计系统:permeate渗透测试系统 系统架构:基于MVC模式 2. 关键位置定位 审计XSS漏洞需要首先定位系统中的关键位置: 2.1 控制器定位 通过URL分析入口文件: home/index.php 分析主入口文件发现控制器加载逻辑: 在 common.php 中找到控制器存放路径: home/action/ 2.2 模板定位 通过控制器中的 displayTpl 函数定位模板路径 模板存放于: home/tpl/ 目录下 三、正向审计方法 1. 审计流程 从参数接收位置开始审计 追踪参数传递过程 检查最终输出位置是否过滤 2. 实例分析 案例1:反射型XSS漏洞 参数接收位置 : tiezi.php 控制器中的 index 方法 直接接收 $_GET['bk'] 参数,未做任何过滤 模板输出位置 : tiezi/index.php 直接输出变量,未做HTML编码 漏洞验证 : 四、反向审计方法 1. 审计流程 从模板中的变量输出点开始 反向追踪变量来源 检查输入是否经过过滤 2. 实例分析 案例2:搜索型XSS漏洞 模板输出点 : search.php 直接输出搜索关键词 变量来源追踪 : 直接接收用户输入,未做过滤 漏洞验证 : 五、审计技巧总结 1. 关键搜索技巧 控制器中搜索: $_GET 、 $_POST 、 $_REQUEST 模板中搜索: echo 、 print 等输出函数 使用正则表达式匹配变量输出: echo \$([a-z]*) 2. 常见危险模式 直接输出用户输入: 在HTML属性中直接使用变量: 在JavaScript中直接拼接用户输入: 3. 安全建议 所有输出到HTML的内容都应进行HTML实体编码: 输出到JavaScript的内容应使用 json_encode : 使用内容安全策略(CSP)作为额外防护层 六、扩展审计思路 存储型XSS审计 : 追踪用户输入->数据库存储->输出的完整流程 检查数据存储前后是否进行过滤 DOM型XSS审计 : 检查前端JavaScript中动态操作DOM的部分 关注 innerHTML 、 document.write 等危险API的使用 框架特定审计 : 不同框架有各自的XSS防护机制 检查是否正确使用框架提供的安全功能 通过本教学文档的系统学习,您应该已经掌握了通过代码审计挖掘XSS漏洞的核心方法和技巧。实际审计中需要结合多种方法,全面检查系统的输入输出处理流程。