代码审计是由具有多年实战渗透测试经验的安全人员,对系统源代码和软件体系结构的安全性、可靠性进行全面审核。它是防御性编程的一个例子,试图在软件发布前减少错误。C、C++和php源代码是最常见的审计代码,因为很多高级语言,比如Python,潜在的易受攻击的函数(比如不检查边界的函数)比较少。代码检查是审计工作中最常用的技术手段。在实际应用中,采用“自动分析+人工验证”的方法。一般检查项目包括:系统使用的开源框架、源代码设计、错误处理不当、直接对象引用、资源滥用、API滥用、后门代码发现等。
通常可以识别以下代码中的风险点:跨站脚本漏洞、跨站点请求伪装漏洞、SQL注入漏洞、命令执行漏洞、日志伪造漏洞、参数篡改、密码明文存储、配置文件缺陷、路径操作错误、资源管理、不安全Ajax调用、系统信息泄露、调试器残留、第三方控制漏洞、文件上传漏洞、远程命令执行、远程代码执行、未授权下载、授权绕过漏洞。
1.代码和架构都很复杂。
几十万,几百万行代码,一个业务分成几十个模块,几十个代码仓库都是家常便饭;开发语言多种多样,各种自行开发的框架和流行的框架不堪重负,架构非常复杂。这两个问题无疑是对审计人员和SAST工具的巨大挑战。2.工具的精确调用率。没有工具叫银弹,官方规则和插件调用率很低,需要根据开发语言和编码风格定制;工具对逻辑漏洞的弱点和业务逻辑漏洞的漏洞情况之间的矛盾,工具和系统的操作也需要专门的人力投入,从而不断提高工具的准确调用率。
心态。对于KPI的考虑,审计人员认为既然花了很长时间做代码审计,就必须说点什么才能体现工作量。如果系统没有问题,开发者会更加不信任你。对于甲方的代码审核员来说,审核任务多,代码庞大是很正常的。如果只提高速度而不考虑后果,这样就省略了细节,导致综合复习失败。
第三,审计的总体思路。准备工作。获取源代码。要审计当然要先获取相应的源代码,最好有相关文档等。信息越多,越容易理解源代码。安装网站。在本地建一个网站,同时审计和调试。通过跟踪各种动态变化了解源代码的作用。网站结构。浏览源文件夹,了解程序的一般目录。入口文件。索引和管理文件通常是整个程序的入口。详细阅读索引文件,可以了解程序的架构、运行流程、配置文件、过滤文件、安全过滤文件,了解程序的业务逻辑。配置文件。通常,像config这样的文件保存一些数据库相关信息和一些程序信息。先看数据库编码。如果是gbk,可能会有宽字节注入。如果变量的值用双引号括起来,可能会出现双引号解析代码执行的问题。
过滤功能。通过阅读公共函数文件和安全过滤文件,我们可以清楚地掌握用户输入的数据,哪些被过滤,哪些没有被过滤,在哪里被过滤,如何被过滤,是否可以绕过过滤后的数据。滤波方法是代入还是正则化?有GPC吗?addslasher()用于处理吗?