审计方法总结 第1篇
//xxxURL为外部可控,返回数据直接展示String url = (_picurl_);StringBuffer response = new StringBuffer();URL pic = new URL(url);xxxpURLConnection con = (xxxpURLConnection) ();(_GET_);(_User-Agent_, _Mozilla/_);//发起xxx,触发漏洞BufferedReader in = new BufferedReader(new InputStreamReader(()));String inputLine;while ((inputLine = in.readLine()) != null) {(inputLine); }in.close();(_resp_,());return __;
再举一例:
//xxxpClients函数的SSRF漏洞代码,审计时为确认:String url = (_url_);CloseablexxxpClient client = ();xxxpGet httpGet = new xxxpGet(url);xxxpResponse httpResponse = (httpGet); //发起xxx
审计方法总结 第2篇
(1)桌面检查 这是一种传统的检查方法。程序员检查自己的程序。程序编译完成后,程序员会对源代码进行分析和检查,并补充相关文档,以发现程序中的错误。由于程序员熟悉自己的程序和编程风格,程序员自己进行桌面检查可以节省大量检查时间,但应避免主观的片面性。
(2) 代码审查
由几个程序员和测试人员组成的评审小组通过阅读、讨论和争论对程序进行静态分析的过程。代码评审分为两步:第一步是组长提前向团队成员分发设计规范、控制流程图、程序文本、相关要求和规范,作为评审的依据。在充分阅读这些材料后,团队成员进入审查的第二步,并召开程序审查会议。在会上,程序员首先逐句介绍了程序的逻辑。在这个过程中,程序员或其他团队成员可以提出问题、讨论和审查是否存在错误。实践表明,程序员可以发现许多他们在解释过程中没有发现的错误,而讨论和争议会促进问题的暴露。 应为审查小组的每个成员编制一份常见错误清单,列出过去所有可能的常见错误,供与会者进行比较和检查,以提高审查的有效性。这个常见错误列表也称为检查表。它对程序中可能出现的各种错误进行分类,列出每种类型错误的尽可能多的典型错误,然后将它们放入一个表格中进行重新检查。
(3)走查
它与代码审查基本相同,代码审查分为两个步骤。第一步是将材料分发给走查小组的每个成员,并要求他们在召开会议之前仔细研究程序。会议程序与准则审查不同。参与者不是简单地阅读程序并对照错误清单进行检查,而是“充当”一台计算机,也就是说,首先,测试团队的成员为测试程序准备一批具有代表性的测试用例,并将它们提交给走查团队。在小组会议中穿行,集体扮演计算机的角色,让测试用例沿着程序的逻辑运行,并随时记录程序的轨迹以供分析和讨论。 借助测试用例的媒体功能,人们对程序的逻辑和功能提出了各种各样的问题,并结合问题进行了热烈的讨论和争论,从而发现更多的问题。 代码检查应在编译和动态测试前进行。检查前,应编制需求描述文件、程序设计文件、xxx代码、代码编写标准和代码缺陷检查表。在实际使用中,代码检查可以快速发现缺陷,发现30%到70%的逻辑设计和编码缺陷,代码检查中发现的问题不是症状。然而,代码检查非常耗时,代码检查需要积累知识和经验。 代码检查可以使用测试软件进行自动测试,以提高测试效率和降低劳动强度,也可以使用手动测试来充分发挥人类的逻辑思维能力。
文档和源程序代码
一份最新的设计文档
程序结构图
所有的模块源程序代码
代码体系结构描述
目录文件
代码组织
目录文件组织
所有的文件名简单明了,见名知意
文件和模块分组清晰
每个文件只包含一个完整模块的代码
数据库检查
数据库命名使用小写英语字母, 数字和下划线,无其他字符
数据库命名采用项目名或产品名称命名 ,长度小于20位
数据库中的所有表字符集统一
检查函数
函数头清晰地描述了函数的功能
函数的名字清晰地定义了它所要做的事情
参数遵循一个规律的顺序
所有的参数都是要有用的
函数参数接口关系清晰明了
函数所使用的算法要有说明
数据类型及变量
每个数据类型都有其解释
每个数据类型都有正确的取值
每一个变量的命名,都明确的表示代表什么
检查条件判断语句
If/else 使用正确
无嵌套的if链
数字,字符,指针和0/NULL/FLSE 判断明确
不要有臃肿的判断逻辑
检查循环体
循环体不为空
循环之前做好初始化代码
有明确的多次循环操作,使用For循环
所有的循环边界是否正确
检查代码注释
有一个简单的说明,用于描述代码的结构
每个文件和模块均以给予解释
程序(模块)检查
程序中所有的异常是否处理了
程序中是否存在重复的代码
函数调用关系图
模块控制流图
编码规范是指在编程过程中必须遵循的规则。通常,将详细制定代码的语法规则和语法格式。
如:当响应“content-type”为“html”类型时,外部输入拼接到响应包中,需根据输出位置进行编码处理。编码规则:
编码规则
输出点在HTML标签之间
需要对以下6个特殊字符进行HTML实体编码(&, <, >, _, ',/)。 示例: & --> & < --> < >--> > _ --> _ ' --> ' / --> /
输出点在HTML标签普通属性内(如href、src、style等,on事件除外)
要对数据进行HTML属性编码。 编码规则:除了阿拉伯数字和字母,对其他所有的字符进行编码,只要该字符的ASCII码小于256。编码后输出的格式为HH;(以开头,HH则是指该字符对应的十六进制数字,分号作为结束符)
输出点在xxx的数据中
需要进行js编码 编码规则: 除了阿拉伯数字和字母,对其他所有的字符进行编码,只要该字符的ASCII码小于256。编码后输出的格式为 \xHH (以 \x 开头,HH则是指该字符对应的十六进制数字) Tips:这种场景仅限于外部数据拼接在xxx被引号括起来的变量值中。除此之外禁止直接将代码拼接在js代码中。
输出点在CSS中(Style属性)
需要进行CSS编码 编码规则: 除了阿拉伯数字和字母,对其他所有的字符进行编码,只要该字符的ASCII码小于256。编码后输出的格式为 \HH (以 \ 开头,HH则是指该字符对应的十六进制数字)
输出点在URL属性中
对这些数据进行URL编码 Tips:除此之外,所有链接类属性应该校验其协议。禁止JavaScript、data和Vb伪协议。
在代码检查中,有必要根据被测试软件的特点选择合适的标准和规则。当使用测试软件进行自动代码检查时,测试工具通常有许多内置的编码规则。在自动测试的基础上,使用桌面检查、代码遍历和代码审查等手动检查方法仔细检查程序结构和逻辑中的缺陷。
如:Java
文件组织规则:由于超过2000行的程序难以阅读,应该尽量避免出现超过2000行的程序。一个Java源文件都包含一个单一的公共类或接口。若私有类和接口与一个公共类相关联,可以将它们和公共类放入同一个源文件。公共类必须是这个文件中的第一个类或接口。
文件组织顺序:
1.文件注释:所有的源文件都应该在开头有一个注释,其中列出文件的版权声明、文件名、功能描述以及创建、修改记录:
2.包和引入语句:在多数Java源文件中,第一个非注释行是包语句。在它之后可以跟导包语句
3.类或接口注释:采用JavaDoc文档注释,在类、接口定义之前应当对其进行注释,包括类、接口的描述、最新修改者、版本号、参考链接等;
4. JavaDoc文档注释:描述Java的类、接口、构造方法、方法、以及字段。每个文档注释都会被置于注释定界符/**...*/之中,一个注释对应一个类、接口或成员。该注释应位于声明之前。文档注释的第一行(/**)不需缩进,随后的文档注释每行都缩进1格(使星号纵向对齐)。
4.类或接口的声明
5.类或接口的实现注释:如果有关类或接口的信息不适合作为“类或接口文档注释”,可以在类或接口的实现注释中给出;
6.类的(静态)变量:首先是类的公共变量,随后是保护变量,再后是包一级别的变量(没有访问修饰符),最后是私有变量;
7.实例变量:首先是公共级别的,随后是保护级别的,再后是包一级别的(没有访问修饰符),最后是私有级别的;
8.构造方法;
9.普通方法:方法应该按功能分组,而不应该按作用域或访问权限进行分组。
在手动代码检查中,代码缺陷检查表是我们使用的测试用例。代码缺陷清单通常包括容易出错的地方和以前工作中遇到的典型错误。
重要性
检测项
命名规则是否与所采用的规范保持一致?
是否遵循了最小长度最多信息原则?
has/can/is前缀的函数是否返回布尔型?
注释是否较清晰且必要?
复杂的分支流程是否已经被注释?
距离较远的是否已经被注释?
非通用变量是否全部被注释?
函数是否已经有文档注释?(功能、输入、返回及其他可选)
特殊用法是否被注释?
声明、空白、缩进
每行是否只声明了一个变量?(特别是那些可能出错的类型)
变量是否已经在定义的同时初始化?
类属性是否都执行了初始化?
是否合理地使用了空格使程序更清晰?
代码行长度是否在要求之内?
语句/功能分布/规模
包含复合语句的{}是否成对出现并符合规范?
单行是否只有单个功能?(不要使用;进行多行合并)
操作符++和— —操作符的应用是否复合规范?
缺陷检查表
对前五步进行审计的结果再次进行复查,写出复查报告,确定所有漏洞的正确性,将非代码错误进行打回重新检测,保证代码升级结果的正确性、完整性。
代码审计结束,代表一次代码审计完全结束,需要将完整的代码审计报告进行上交,内容包括:代码漏洞原因、出处、修复方法等,帮助管理人员进行更好的项目决策,同时证明增加安全预算的必要性,并将安全问题传达到高级管理层,进行更好的安全认知,有助于进一步健全安全建设体系,遵循了相关安全策略、符合安全合规的要求。
审计方法总结 第3篇
RIPS
RIPS是一个用 PHP 编写的源代码分析工具,它使用了静态分析技术,能够自动化地挖掘 PHP 源代码潜在的安全漏洞。渗透测试人员可以直接容易的审阅分析结果,而不用审阅整个程序代码。由于静态源代码分析的限制,漏洞是否真正存在,仍然需要代码审阅者确认。RIPS 能够检测 XSS, SQL 注入, 文件泄露, Header Injection 漏洞等。
Seay源代码审计系统
这是一款基于C#语言开发的一款针对PHP代码安全性审计的系统,主要运行于Windows系统上。这款软件能够发现SQL注入、代码执行、命令执行、文件包含、文件上传、绕过转义防护、拒绝服务、XSS跨站、信息泄露、xxxRL跳转等漏洞。
Fortify
Fortify ,是一个静态的、白盒的软件源代码安全测试工具。它通过内置的五大主要分析引擎:数据流、语义、结构、控制流、配置流等对应用软件的源代码进行静态的分析,分析的过程中与它特有的软件安全漏洞规则集进行全面地匹配、查找,从而将源代码中存在的安全漏洞扫描出来,并给予整理报告。扫描的结果包含详细的安全漏洞信息、安全知识说明、修复意见。
洞态IAST
IAST 相当于 DAST 和 SAST 的组合,是一种相互关联的运行时安全检测技术。 它通过使用部署在 Web 应用程序上的 Agent 来监控运行时发送的流量并分析流量流以实时识别安全漏洞,IAST 提供更高的测试准确性,并详细的标注漏洞在应用程序代码中的确切位置,从而帮助开发人员达到实时修复。
下载完成后直接解压到www目录,通过访问RIPS进行启动
首先介绍工具,最上面的输入行从从左到右,从上到下依次为扫描路径、扫描等级、扫描类型、输出类型、正则表达式搜索
审计方法总结 第4篇
查看配置的版本是否属于安全版本区间。 如果是,则确认:
版本是存在漏洞的版本。安全版本是以上