代码审计--最常见的漏洞审计篇
字数 1259 2025-08-05 00:15:37
代码审计:常见漏洞审计实战指南
前言
本教程旨在提供代码审计中常见漏洞的检测方法与实战技巧,仅供安全研究与学习使用,严禁用于非法目的。
XSS漏洞审计
审计流程
-
定位输出点:寻找直接输出用户可控变量的位置
- 示例:
echo $company_name;直接输出未过滤的变量
- 示例:
-
追踪变量来源
- 检查变量是否来自用户输入(如
$_GET、$_POST) - 示例中变量来自
$lang->install实例化类
- 检查变量是否来自用户输入(如
-
验证漏洞
- 注入测试payload:
<script>alert(1)</script> - 确认是否存储到数据库(存储型XSS)
- 注入测试payload:
关键点
- 重点关注未经过滤的
echo、print等输出函数 - 注意间接输出场景(如通过模板引擎)
文件上传漏洞审计
类型一:黑名单绕过
-
检测上传限制
- 上传测试文件观察拦截机制
- 搜索相关错误信息定位代码
-
分析过滤逻辑
- 示例中发现
in_array()进行后缀名检查 - 黑名单包含:
php,php5,phtml等
- 示例中发现
-
绕过方法
- 大小写绕过:使用
PHP代替php - 特殊后缀:
php.(末尾加点) - 双重后缀:
test.php.jpg
- 大小写绕过:使用
-
深入审计
- 检查
getUploadFileInfo()函数 - 验证
checkExt()函数是否转换大小写
- 检查
类型二:解析漏洞
-
前端分析
- 检查HTML源码中的上传处理函数
- 示例中发现
getupload()函数
-
后端逻辑审计
getExtension()函数存在逻辑缺陷- 空后缀名绕过黑白名单检查
-
服务器配置影响
.htaccess强制解析无后缀文件为PHP- 内容示例:
<FilesMatch "^[^.]+$"> SetHandler application/x-httpd-php </FilesMatch>
SQL注入漏洞审计
审计流程
-
定位输入点
- 寻找SQL语句拼接处
- 示例中通过
frparam()获取用户输入
-
分析过滤机制
format_param()函数进行多层过滤SafeFilter过滤XSS和SQL关键字
-
关键过滤函数
addslashes()转义特殊字符stripos()检测危险关键词:update,delete等
-
绕过技巧
- 避免使用黑名单关键词
- 使用注释分割:
UNION/**/SELECT - 编码绕过:十六进制/URL编码
深度审计技巧
-
自定义函数追踪
- 全局搜索
function frparam定义 - 分析其返回值处理逻辑
- 全局搜索
-
版本差异利用
- PHP版本<7.4且魔术引号关闭时防护较弱
- 利用
mysql_real_escape_string()的局限性
-
二次注入检测
- 检查从数据库读取后直接使用的数据
附录:审计工具推荐
-
静态分析工具
- RIPS
- SonarQube
- PHPStan
-
动态测试工具
- Burp Suite
- SQLMap
- XSS Hunter
-
辅助工具
- grep (代码搜索)
- Seay源代码审计系统
总结
代码审计需要结合静态分析与动态验证,重点关注:
- 用户输入的所有入口点
- 数据流经的所有处理环节
- 最终输出的上下文环境
通过系统化的审计流程,可以有效发现各类安全漏洞,提升应用安全性。