代码审计--最常见的漏洞审计篇
字数 1476 2025-08-05 00:15:37

代码审计:常见漏洞审计方法与实战

1. XSS漏洞审计

1.1 漏洞发现过程

  1. 在代码中发现输出点:$lang->install 实例化类中的变量直接输出
  2. 审计工具分析显示该变量未经过滤直接输出到页面
  3. 变量写入数据库,属于存储型XSS

1.2 漏洞验证

  1. 构造XSS payload:<script>alert(1)</script>
  2. 提交后成功弹窗,确认漏洞存在

1.3 关键代码分析

// 直接输出未过滤的变量
echo $variable;

// 正确的做法应该进行HTML实体编码
echo htmlspecialchars($variable, ENT_QUOTES);

2. 文件上传漏洞审计

2.1 第一种上传漏洞

漏洞特征:

  1. 使用黑名单过滤:'asa','asp','aspx','cdx','ascx','vbs','jsp','ashx','js','reg','cgi','html','htm','shtml','cfm','cfc','pl','bat','exe','com','dll','htaccess','cer','php5','php4','php3','php2','php','pht','phtm'
  2. 未进行大小写转换,可通过大写绕过:.PHP

绕过方法:

  1. 上传.PHP后缀文件
  2. 或使用双后缀名:test.php.

2.2 第二种上传漏洞

漏洞特征:

  1. 逻辑缺陷:当后缀名为空时绕过所有检查
  2. 服务器配置.htaccess强制解析无后缀文件为PHP

关键代码分析:

// 缺陷逻辑:空后缀名绕过所有检查
if(empty($ext) || ...) {
    // 绕过后续检查
}

// 正确的做法应先验证后缀名不为空
if(!empty($ext) && in_array($ext, $allowed_extensions)) {
    // 处理上传
}

3. SQL注入漏洞审计

3.1 漏洞发现过程

  1. 发现SQL语句执行功能点
  2. 通过报错信息定位到关键代码文件
  3. 分析frparam函数过滤机制

3.2 过滤机制分析

  1. 使用SafeFilter函数过滤XSS
  2. PHP版本>=7.4或开启魔术引号时使用addslashes转义
  3. 黑名单过滤updatedeleteinsertdroptruncate等关键字

3.3 绕过方法

  1. 避免使用黑名单中的关键字
  2. 使用select语句进行注入
  3. 使用注释/**/或编码绕过过滤

3.4 关键代码分析

// 不安全的直接执行SQL
$db->query($sql);

// 正确的做法应使用预处理语句
$stmt = $db->prepare("SELECT * FROM table WHERE id = ?");
$stmt->execute([$input]);

4. 代码审计工具与方法

4.1 常用审计方法

  1. 输入输出追踪:跟踪用户输入到最终输出的流程
  2. 函数调用分析:重点审计evalsystemexec等危险函数
  3. 正则表达式分析:检查过滤规则是否严谨
  4. 黑名单分析:检查过滤列表是否完整

4.2 审计工具使用

  1. 使用代码搜索工具快速定位关键函数
  2. 结合Burp Suite等工具进行动态测试
  3. 使用正则表达式搜索潜在漏洞模式

5. 防御建议

5.1 XSS防御

  1. 所有输出到页面的数据必须进行HTML实体编码
  2. 使用CSP(Content Security Policy)限制脚本执行

5.2 文件上传防御

  1. 使用白名单而非黑名单
  2. 重命名上传文件
  3. 限制上传目录的执行权限
  4. 检查文件内容而不仅依赖后缀名

5.3 SQL注入防御

  1. 使用预处理语句(PDO/prepared statements)
  2. 最小权限原则配置数据库账户
  3. 对输入进行严格类型验证

5.4 通用安全原则

  1. 最小权限原则
  2. 深度防御(Defense in Depth)
  3. 不信任任何用户输入
  4. 定期进行安全审计和代码审查

6. 实战技巧总结

  1. 黑名单绕过技巧

    • 大小写变异
    • 双后缀名
    • 空后缀名
    • 特殊字符(空格、点、分号等)
  2. SQL注入技巧

    • 使用注释绕过过滤:/*!SELECT*/
    • 使用十六进制编码
    • 使用字符串拼接函数
  3. 审计流程

    • 定位输入点
    • 跟踪数据处理流程
    • 检查最终输出/执行点
    • 验证过滤机制有效性

通过系统化的审计方法和深入理解各种漏洞原理,可以有效发现和修复Web应用中的安全漏洞。

代码审计:常见漏洞审计方法与实战 1. XSS漏洞审计 1.1 漏洞发现过程 在代码中发现输出点: $lang->install 实例化类中的变量直接输出 审计工具分析显示该变量未经过滤直接输出到页面 变量写入数据库,属于存储型XSS 1.2 漏洞验证 构造XSS payload: <script>alert(1)</script> 提交后成功弹窗,确认漏洞存在 1.3 关键代码分析 2. 文件上传漏洞审计 2.1 第一种上传漏洞 漏洞特征: 使用黑名单过滤: 'asa','asp','aspx','cdx','ascx','vbs','jsp','ashx','js','reg','cgi','html','htm','shtml','cfm','cfc','pl','bat','exe','com','dll','htaccess','cer','php5','php4','php3','php2','php','pht','phtm' 未进行大小写转换,可通过大写绕过: .PHP 绕过方法: 上传 .PHP 后缀文件 或使用双后缀名: test.php. 2.2 第二种上传漏洞 漏洞特征: 逻辑缺陷:当后缀名为空时绕过所有检查 服务器配置 .htaccess 强制解析无后缀文件为PHP 关键代码分析: 3. SQL注入漏洞审计 3.1 漏洞发现过程 发现SQL语句执行功能点 通过报错信息定位到关键代码文件 分析 frparam 函数过滤机制 3.2 过滤机制分析 使用 SafeFilter 函数过滤XSS PHP版本>=7.4或开启魔术引号时使用 addslashes 转义 黑名单过滤 update 、 delete 、 insert 、 drop 、 truncate 等关键字 3.3 绕过方法 避免使用黑名单中的关键字 使用 select 语句进行注入 使用注释 /**/ 或编码绕过过滤 3.4 关键代码分析 4. 代码审计工具与方法 4.1 常用审计方法 输入输出追踪 :跟踪用户输入到最终输出的流程 函数调用分析 :重点审计 eval 、 system 、 exec 等危险函数 正则表达式分析 :检查过滤规则是否严谨 黑名单分析 :检查过滤列表是否完整 4.2 审计工具使用 使用代码搜索工具快速定位关键函数 结合Burp Suite等工具进行动态测试 使用正则表达式搜索潜在漏洞模式 5. 防御建议 5.1 XSS防御 所有输出到页面的数据必须进行HTML实体编码 使用CSP(Content Security Policy)限制脚本执行 5.2 文件上传防御 使用白名单而非黑名单 重命名上传文件 限制上传目录的执行权限 检查文件内容而不仅依赖后缀名 5.3 SQL注入防御 使用预处理语句(PDO/prepared statements) 最小权限原则配置数据库账户 对输入进行严格类型验证 5.4 通用安全原则 最小权限原则 深度防御(Defense in Depth) 不信任任何用户输入 定期进行安全审计和代码审查 6. 实战技巧总结 黑名单绕过技巧 : 大小写变异 双后缀名 空后缀名 特殊字符(空格、点、分号等) SQL注入技巧 : 使用注释绕过过滤: /*!SELECT*/ 使用十六进制编码 使用字符串拼接函数 审计流程 : 定位输入点 跟踪数据处理流程 检查最终输出/执行点 验证过滤机制有效性 通过系统化的审计方法和深入理解各种漏洞原理,可以有效发现和修复Web应用中的安全漏洞。