代码审计--最常见的漏洞审计篇
字数 1476 2025-08-05 00:15:37
代码审计:常见漏洞审计方法与实战
1. XSS漏洞审计
1.1 漏洞发现过程
- 在代码中发现输出点:
$lang->install实例化类中的变量直接输出 - 审计工具分析显示该变量未经过滤直接输出到页面
- 变量写入数据库,属于存储型XSS
1.2 漏洞验证
- 构造XSS payload:
<script>alert(1)</script> - 提交后成功弹窗,确认漏洞存在
1.3 关键代码分析
// 直接输出未过滤的变量
echo $variable;
// 正确的做法应该进行HTML实体编码
echo htmlspecialchars($variable, ENT_QUOTES);
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
关键代码分析:
// 缺陷逻辑:空后缀名绕过所有检查
if(empty($ext) || ...) {
// 绕过后续检查
}
// 正确的做法应先验证后缀名不为空
if(!empty($ext) && in_array($ext, $allowed_extensions)) {
// 处理上传
}
3. SQL注入漏洞审计
3.1 漏洞发现过程
- 发现SQL语句执行功能点
- 通过报错信息定位到关键代码文件
- 分析
frparam函数过滤机制
3.2 过滤机制分析
- 使用
SafeFilter函数过滤XSS - PHP版本>=7.4或开启魔术引号时使用
addslashes转义 - 黑名单过滤
update、delete、insert、drop、truncate等关键字
3.3 绕过方法
- 避免使用黑名单中的关键字
- 使用
select语句进行注入 - 使用注释
/**/或编码绕过过滤
3.4 关键代码分析
// 不安全的直接执行SQL
$db->query($sql);
// 正确的做法应使用预处理语句
$stmt = $db->prepare("SELECT * FROM table WHERE id = ?");
$stmt->execute([$input]);
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应用中的安全漏洞。