代码审计
-
实验二 fortify+DVWA靶场和动态IAST审计JAVA靶场
-
fortify
-
Micro Focus 旗下 AST(应用程序安全测试)产品
-
Fortiy具有源代码安全分析,可精准定位漏洞产生的路径,以及具有1分钟1万行的扫描速度。
-
-
Fortify Static Code Analyzer 提供静态代码分析器(SAST)
-
Fortify WebInspect是动态应用安全测试软件(DAST)
-
Software Security Center 是软件安全中心(SSC)
-
-
fortify应用?
-
数据流,生成报告
-
-
AST
-
抽象语法树(Abstract Syntax Tree)
-
源代码的抽象语法结构的树状表示
-
每个节点代表源代码中的一种结构,
-
-
编译过程
-
源代码首先被词法分析器处理成一系列的标记(Token)
-
语法分析器根据语言的语法规则,将标记组织成树状结构的AST
-
在AST中,节点分为多种类型,每种类型对应源代码中的不同元素
-
例如,一个声明、一个表达式或者一个语句。
-
根节点通常代表整个程序
-
叶节点通常代表程序中的基本元素
-
-
-
方便了编译器对源代码进行进一步的处理
-
编译器可以更容易地处理复杂的数据结构和高级语言特性,同时还能进行高效的错误检查和修复。
-
-
-
CWE
-
Common Weakness Enumeration-常见弱点枚举
-
越界写入 (CWE-787)
-
在预期输入缓冲区的边界之外写入数据
-
-
越界读取 (CWE-125)
-
读取预期输出缓冲区边界之外的数据
-
是一个中等严重的攻击向量
-
-
输入中和不当 (CWE-79)
-
也称为跨站点脚本 (XSS)
-
将恶意代码注入网站
-
被利用的可能性很高
-
严重性是中等的
-
-
输入验证不当 (CWE-20)
-
输入验证弱点通常是由于在 SDLC 中实施架构概念或采用开发最佳实践方面存在缺陷
-
严重性是轻微的
-
-
特殊元素中和不当 (CWE-78)
-
也称为OS 命令注入
-
允许攻击者直接在操作系统上执行命令,而无需直接访问平台
-
导致权限管理不当
-
是一个中等漏洞
-
-
-
软件和硬件中的常见漏洞目录
-
一个完整的缺陷数据库
-
-
通过对所有已识别的缺陷和暴露进行分类,帮助组织更好地解决漏洞
-
管理网络供应链风险的关键
-
来识别和解决企业网络的第三方组件中的潜在安全漏洞
-
-
最严重的类型列在CWE Top 25
-
NVD 是美国国家安全局(National Security Agency,NSA)的缩写
-
CVSS 是指 Common Vulnerability Scoring System(通用漏洞评分系统)
-
是一个开放标准,用于评估计算机漏洞的严重性和优先级
-
根据漏洞的多个属性来计算漏洞的分数
-
-
软件缺陷枚举库
-
-
CVE-漏洞
-
Common Vulnerabilities and Exposures)的全称是公共漏洞和暴露
-
为漏洞赋予唯一编号并标准化漏洞描述
-
-
公开披露的网络安全漏洞列表
-
已知网络安全漏洞和公司资源潜在风险的列表
-
安全漏洞库
-
发布主体是CVE编号机构(CVE Numbering Authority,CNA)
-
-
OWASP
-
在线 Web 应用程序安全项目
-
一项社区计划,列出了前 10 个漏洞,列出了影响 Web 应用程序的最危险的软件弱点和漏洞
-
-
洞态IAST
-
开源的交互式安全测试(IAST)产品
-
通过被动插桩模式对漏洞的实时检测
-
适合在开发流水线的测试阶段使用
-
-
-
-
实验一-rips
-
D:\phpstudy_pro\WWW
-
rips
-
点击左上角的按钮可以查看代码的详细情况
-
左下角的问号是解释,它会详细的解释这是什么类型的漏洞,并且有漏洞补丁方案
-
-
右下角的红色按钮,可以根据漏洞生成漏洞利用代码
-
-
-
fortify的使用
-
checkmarx的使用
-
考试重点
-
1.CVE和CWE的区别
-
CVE (Common Vulnerabilities and Exposures)
-
为已知漏洞提供一个标准化的名称和基本参考信息,安全漏洞库
-
公共漏洞和暴露
-
-
目的是通过提供一个共同的漏洞标识符,来促进信息安全社区之间的沟通和协作
-
CVE条目包含了关于漏洞的基本信息,如描述、影响、相关参考链接等,但不包含具体的技术细节或修复指南
-
-
CWE (Common Weakness Enumeration)
-
侧重于软件安全缺陷分类和描述的标准
-
缺陷数据库
-
-
旨在提供一种系统化的方法来识别、测量和讨论软件安全缺陷
-
通过定义各种缺陷类型,并为每种类型提供一个唯一的标识符,帮助开发者、安全分析师和研究人员理解和交流软件中的安全问题
-
提供了一个更详细的缺陷分类系统,缺陷漏洞库
-
-
-
-
2.代码审计过程以及原理
-
它涉及对源代码进行系统性的检查,以识别潜在的安全漏洞、编码标准违规、性能问题等
-
2.1代码审计过程:
-
准备阶段
-
确定审计范围:确定需要审计的代码模块或整个项目。
-
制定审计计划:包括时间表、资源分配、审计工具和技术的选择等。
-
收集资料:收集相关的开发文档、设计文档、需求说明等,以帮助理解代码
-
-
静态分析
-
动态分析
-
如内存泄漏、性能瓶颈等
-
进行压力测试和性能测试
-
-
安全测试:
-
包括渗透测试、模糊测试等
-
使用自动化的安全扫描工具来辅助识别安全问题
-
-
代码审查:
-
组织代码审查会议,让其他开发人员或安全专家参与进来,对代码进行同行评审。
-
审查代码的逻辑、结构、命名规范、注释等是否符合编码标准。
-
-
问题修复
-
对发现的问题进行分类和优先级排序
-
制定修复计划,并实施代码更改
-
-
复审和验证
-
问题修复后,进行复审以确保问题得到妥善解决
-
验证修复是否引入了新的问题
-
-
文档和报告
-
记录发现的问题、修复措施和审计结果
-
更新相关的开发和安全文档
-
-
持续改进
-
根据审计结果和经验,不断改进代码审计流程和开发实践
-
将审计过程中学到的教训应用到未来的项目中
-
-
-
2.2代码审计原理:
-
防御性编程
-
编写代码时就考虑到潜在的安全风险和错误处理,以减少漏洞的产生
-
-
最小权限原则
-
确保代码执行所需的权限尽可能少
-
-
安全编码标准
-
遵循行业认可的安全编码标准和最佳实践,如OWASP的Top 10
-
-
代码可维护性
-
编写清晰、可读性强的代码,便于审计和未来的维护
-
-
自动化工具辅助
-
提高审计效率,但不能完全依赖工具,需要人工复核
-
-
持续集成/持续部署(CI/CD)
-
确保代码在合并到主分支前经过审计
-
-
-
-
3.代码审计和软件测试区别
-
3.1代码审计(Code Auditing)
-
关注源代码本身
-
代码的质量和安全性
-
-
主要目的是提高代码质量,确保遵循编码标准和安全最佳实践
-
有助于识别和修复代码中的安全漏洞、性能瓶颈和其他潜在的技术债务
-
在软件开发的任何阶段进行
-
在代码编写阶段或代码提交之前
-
-
静态代码分析工具和人工审查
-
结果通常是关于代码改进的建议和安全问题的报告
-
-
3.2软件测试(Software Testing)
-
关注软件的功能、性能、稳定性和可用性等方面
-
软件的行为和性能
-
-
验证软件的行为是否符合需求规格说明和用户的期望
-
各种自动化测试工具和框架来执行测试用例
-
-
在发现软件中的错误和缺陷,确保软件在各种条件下都能正常运行
-
在开发过程中的后期阶段进行,如集成和系统测试阶段
-
输出是测试报告,包括发现的缺陷、测试覆盖率和软件质量的评估
-
-
-
4.bug和漏洞区别
-
4.1Bug(缺陷)
-
软件中的错误或问题,它导致软件的行为偏离了预期的功能或设计
-
可能导致软件崩溃、数据丢失、性能下降或用户体验变差
-
一般性错误
-
-
修复bug涉及修改代码以消除错误,并确保软件按预期工作
-
提高软件质量
-
-
-
4.2漏洞(Vulnerability)
-
是指软件、硬件或系统中的安全缺陷
-
通常是设计或实现中的疏忽,可以被恶意利用
-
特定的安全问题
-
-
修复漏洞需要发布安全更新或补丁
-
防止被恶意利用
-
-
-
-
5.代码审计报告包含哪些内容
-
审计概览
-
审计目的
-
审计范围:覆盖的代码范围和审计的深度。
-
审计方法:包括手动审查、自动化工具等
-
-
基本信息
-
项目名称:被审计的软件或系统名称。
-
版本信息:审计的软件版本。
-
审计时间:审计进行的时间范围。
-
审计团队:执行审计的人员或团队
-
-
审计结果
-
发现的问题列表:包括Bug、代码风格问题、潜在的安全漏洞等。
-
问题分类:按严重性、类型或影响对问题进行分类。
-
详细描述:包括问题的性质、位置、影响和复现步骤。
-
-
风险评估
-
风险等级:根据问题的严重性和潜在影响进行风险评估。
-
影响分析:分析每个问题对系统安全性、性能和稳定性的潜在影响。
-
-
建议和解决方案
-
修复状态
-
已修复问题:列出已经修复的问题及其修复情况。
-
未修复问题:说明尚未解决的问题及其原因。
-
-
审计工具和技术
-
代码质量指标
-
代码复杂度:分析代码的复杂度指标。
-
代码覆盖率:如果进行了测试,包括测试覆盖率的统计数据。
-
-
安全合规性
-
附录
-
参考文献:提供相关标准、最佳实践或参考文档的链接或引用。
-
术语解释:对报告中使用的专业术语进行解释。
-
-
结论和建议
-
审计报告版本和修订历史
-
-
6.著名漏洞库有哪些(除了CVE,CWE)
-
NVD (National Vulnerability Database)
-
美国政府运营的漏洞数据库,提供详细的安全内容自动化协议(SCAP)表示的数据
-
-
OSV (Open Source Vulnerabilities)
-
Google提供的开源项目漏洞数据库
-
-
CNVD (China National Vulnerability Database)
-
中国国家信息安全漏洞共享平台
-
-
CNNVD (China National Vulnerability Database of Information Security)
-
中国信息安全测评中心建立的国家级信息安全漏洞数据库。
-
-
AVD (AlienVault Vulnerability Database) 13
-
由AT&T的AlienVault项目提供,包含CVE漏洞库和非CVE漏洞库。
-
-
Exploit Database (EDB)
-
由Offensive Security维护,提供漏洞利用和POC验证数据库
-
-
NSFocus
-
绿盟科技维护的中文安全漏洞库。
-
-
-
7.DevSecOps
-
是将安全集成到软件开发生命周期(SDLC)中的方法论
-
结合了开发(Dev)、安全(Sec)和运维(Ops)的最佳实践
-
提高软件的质量和安全性,并加快发布速度
-
核心理念是“安全左移”(shift-left security)
-
将安全考虑因素提前到开发过程的早期阶段,而不是等到产品即将发布时才考虑安全问题
-
-
DevSecOps的好处
-
提高安全性
-
更早地发现和修复安全漏洞
-
-
加快发布速度
-
自动化和集成流程
-
-
降低成本
-
预防漏洞比修复已发现的漏洞成本更低
-
-
增强团队协作
-
开发、安全和运维团队的紧密合作可以提高整体效率
-
-
提高合规性
-
发过程符合行业标准和法规要求
-
-
-
-
8.如何设计好的密码
-
密码的原理
-
用随机字符串覆盖原来的密码
-
-
长度
-
至少为12个字符
-
-
复杂性
-
随机性
-
避免使用容易猜测的模式
-
-
唯一性
-
无规律性
-
社会工程学
-
-
避免常见密码
-
使用密码短语
-
对其他人来说难以猜测
-
-
更新密码
-
使用密码管理器
-
启用多因素认证
-
以增加额外的安全层
-
-
避免重复字符
-
避免常见替换
-
将“o”替换为“0”或将“s”替换为“$”等,这些替换很容易被识别
-
-
教育和意识
-
密码策略
-
避免个人信息
-
使用生成器
-
-
9.web top10
-
OWASP(开放式Web应用程序安全项目)的Top 10
-
一个关于网络应用安全风险的列表
-
每三年更新一次
-
-
注入(Injection)
-
SQL注入、命令注入
-
-
身份验证问题(Broken Authentication and Session Management)
-
跨站脚本攻击(Cross-Site Scripting, XSS)
-
允许攻击者在用户的浏览器中执行脚本
-
-
不安全的直接对象引用(Insecure Direct Object References)
-
允许攻击者访问未授权的数据
-
-
安全配置不当(Security Misconfiguration)
-
敏感数据泄露(Sensitive Data Exposure)
-
不充分的日志记录和监控(Insufficient Logging and Monitoring)
-
跨站请求伪造(Cross-Site Request Forgery, CSRF)
-
允许攻击者诱使用户执行未经授权的操作
-
-
使用已知漏洞的组件(Using Components with Known Vulnerabilities)
-
漏洞的组件,未能及时更新
-
-
不足的传输和存储保护(Insufficient Security Config)
-
-
10.SDL
-
软件开发生命周期(Software Development Life Cycle)
-
帮助组织系统地规划、创建、测试、部署和维护软件
-
SDLC模型
-
瀑布模型(Waterfall Model)
-
线性
-
-
迭代模型(Iterative Model)
-
周期逐步完善
-
-
螺旋模型(Spiral Model)
-
结合迭代和风险分析
-
-
敏捷开发(Agile Development)
-
DevOps
-
-
-
-
U+作业题
-
第一章
-
软件供应链安全的基础是
-
源代码安全
-
-
保证源代码安全的主要措施包括
-
开发工具和环境的安全
-
代码安全
-
渗透测试
-
代码审计
-
-
通过( )技术,实现源代码在终端、网络及服务器存储场景下全周期的安全管理,防止内部代码有意、无意泄露、扩散出去。
-
数据安全隔离
-
-
软件供应链可划分为开发、交付、运行三个大的环节,每个环节都可能会引入供应链( )从而遭受攻击,上游环节的安全问题会传递到下游环节并被放大。
-
安全风险
-
-
路径遍历、注入、NULL引用、资源管理、密码管理、API误用、配置管理、( )等十类安全缺陷是程序员在编写软件代码时经常会出现的典型安全缺陷。
-
输入验证
-
跨站脚本
-
日志伪造
-
-
从漏洞的影响度来分析,在2021年影响范围最大的开源软件漏洞为CVE-2020-5421是( )漏洞,影响了44.3%的软件项目。
-
Spring Framework安全
-
-
CVE-2020-3947是一个存在于( )产品中vmnetdhcp服务里的UAF漏洞, VMware官方评估这是一个极其严重的漏洞,CVSSv3评分为 9.3。
-
VMware Workstation系列
-
-
( )是通过静态分析程序源代码,找出代码中存在的安全性问题。
-
源代码审计
-
-
将测试代码运行起来,然后通过构造各种类型的测试数据来判断代码对数据的处理是否正常,以发现代码中存在的安全性问题。这种方式称为( )
-
模糊测试
-
-
软件的( )通常指的是计算机程序或硬件系统中存在的任何类型的错误、故障或缺陷,这些错误可能会导致意外的结果或异常的系统行为,更多的是影响软件的功能性,比如包括编程错误、硬件故障、逻辑错误等。
-
Bug
-
-
( )是一种对软件系统的源代码进行详细检查以发现潜在安全漏洞的过程,目的是发现并修复应用程序中的安全漏洞,确保应用程序在发布之前没有漏洞。
-
代码审计
-
-
代码审计岗位的主要职责包括:制定源代码安全规范;熟悉OWASP TOP10 ; 熟练掌握主流的源代码审计工具,如( ) 、Armorize CodeSecure、RIPS等;持续关注网安发展动向;出色的沟通技巧和语言表达能力、文档编写能力;团队协作精神和敬业精神。
-
Fortify SCA和Checkmarx
-
-
( )是常见软件开发和硬件设计的安全漏洞列表,是安全工具的量尺,并且是弱点识别,缓解和预防工作的基准。
-
CWE(CommonWeakness Enumeration)
-
-
漏洞是攻击面管理中的重要组成部分,下列词汇中,属于漏洞库的是
-
CNVD
-
中国国家信息安全漏洞库(China National Vulnerability Database)
-
-
CICSVD
-
中国信息安全漏洞库(China Information Security Vulnerability Database)
-
-
CV
-
计算机视觉(Computer Vision)
-
-
-
-
第二章
-
采取监测、记录网络运行状态、网络安全事件的技术措施,并按照规定留存相关的网络日志不少于六个月
-
网络产品、服务应当符合相关国家标准的强制性要求。网络产品、服务的提供者不得设置恶意程序;发现其网络产品、服务存在安全缺陷、漏洞等风险时,应当立即采取补救措施,按照规定( )报告。
-
及时告知用户并向有关主管部门
-
-
任何个人和组织不得从事非法侵入他人网络、干扰他人网络正常功能、窃取网络数据等危害网络安全的活动;不得提供专门用于从事侵入网络、干扰网络正常功能及防护措施、窃取网络数据等危害网络安全活动的程序、工具;明知他人从事危害网络安全的活动的,不得为其提供( )等帮助。
-
技术支持、广告推广、支付结算
-
-
国家对公共通信和信息服务、能源、交通、水利、金融、公共服务、电子政务等重要行业和领域,以及其他一旦遭到破坏、丧失功能或者数据泄露,可能严重危害国家安全、国计民生、公共利益的关键信息基础设施,在网络安全等级保护制度的基础上,实行( )。关键信息基础设施的具体范围和安全保护办法由国务院制定。
-
重点保护
-
-
关键信息基础设施的运营者在中华人民共和国境内运营中收集和产生的个人信息和重要数据应当在()存储。因业务需要,确需向境外提供的,应当按照国家网信部门会同国务院有关部门制定的办法进行安全评估;法律、行政法规另有规定的,依照其规定
-
境内
-
-
任何个人和组织应当对其使用( ),不得设立用于实施诈骗,传授犯罪方法,制作或者销售违禁物品、管制物品等违法犯罪活动的网站、通讯群组,不得利用网络发布涉及实施诈骗,制作或者销售违禁物品、管制物品以及其他违法犯罪活动的信息。
-
网络的行为负责
-
-
拒不改正或者导致危害网络安全等后果的,处一万元以上十万元以下罚款,对直接负责的主管人员处五千元以上( )以下罚款
-
五万元
-
-
第六十三条 违反本法第二十七条规定,从事危害网络安全的活动,或者提供专门用于从事危害网络安全活动的程序、工具,或者为他人从事危害网络安全的活动提供技术支持、广告推广、支付结算等帮助,尚不构成犯罪的,由公安机关没收违法所得,处五日以下拘留,可以并处五万元以上五十万元以下罚款;情节较重的,处五日以上( )以下拘留,可以并处十万元以上一百万元以下罚款。
-
十五日
-
-
违反本法第二十七条规定,受到治安管理处罚的人员,( )年内不得从事网络安全管理和网络运营关键岗位的工作;受到刑事处罚的人员,终身不得从事网络安全管理和网络运营关键岗位的工作。
-
五
-
-
单位有前款行为的,由公安机关处()元以上五十万元以下罚款,并对直接负责的主管人员和其他直接责任人员依照前款规定处罚。
-
十万
-
-
网络安全,是指通过采取必要措施,防范对网络的攻击、侵入、干扰、破坏和非法使用以及意外事故,使网络处于稳定可靠运行的状态,以及保障网络数据的( )的能力。
-
完整性、保密性、可用性-饥渴玩
-
-
个人信息,是指以电子或者其他方式记录的能够单独或者与其他信息结合识别自然人( )的各种信息
-
个人身份
-
-
《刑法》第二百八十五条 【非法侵入计算机信息系统罪】违反国家规定,侵入国家事务、国防建设、尖端科学技术领域的计算机信息系统的,处( )年以下有期徒刑或者拘役。
-
3
-
情节特别严重的,处三年以上(7 )年以下有期徒刑,并处罚金。
-
-
刑法》规定,计算机信息系统数据罪的犯罪对象是使用中的计算机信息系统中存储、处理、传输的数据,指存放在信息系统中的数据,可包括图片、文字、影音资料、专有的程序或者(软件 )等。如果是脱离计算机信息系统存放的计算机数据,如光盘、U盘中的计算机数据则不是本罪的保护对象。
-
,促使他人利用其制作的程序实现侵入、控制计算机系统的目的,已经严重危害了计算机系统的()。
-
安全
-
-
( 非法利用信息网络 )罪
-
据《刑法》规定,利用信息网络实施下列行为之一,情节严重的,处三年以下有期徒刑或者拘役,并处或者单处罚金:
-
(一)设立用于实施诈骗、传授犯罪方法、制作或者销售违禁物品、管制物品等违法犯罪活动的网站、通讯群组的;
-
(二)发布有关制作或者销售毒品、枪支、淫秽物品等违禁物品、管制物品或者其他违法犯罪信息的;
-
(三)为实施诈骗等违法犯罪活动发布信息的。
-
-
-
四类安全缺陷是程序员在编写软件代码时经常会出现的排名前四的典型安全缺陷
-
输入验证、路径遍历、跨站脚本、注入
-
-
)是"开发、安全和运营"的缩写。它是一种文化取向、自动化方法和平台设计方法,将安全性作为整个 IT 生命周期的共同责任。
-
DevSecOps
-
-
DevSecOps 的作用和意义建立在( )的理念之上,其目标是在不影响安全需求的情况下快速的执行安全决策,将决策传递至拥有最高级别环境信息的人员。
-
每个人都对安全负责
-
-
在DevSecOps流程中实现可跟踪性、( )和可视性,获得更深入的洞察,建立更安全的环境
-
可审计性
-
-
-
第二章
-
导致代码缺陷的原因主要包括
-
程序员的开发经验和技术水平
-
项目中引入开源代码,导致开源漏洞
-
l项目发布前通常进行功能和性能测试,没有安全测试
-
-
常见的源代码缺陷包括( )三类
-
输入验证
-
资源审计
-
代码质量
-
-
You Can't manage what you can't measure是( )的名言
-
彼得 · 德鲁克
-
-
程序接收的数据可能来源于( )。如果未对程序接收的数据进行校验,则可能会引发安全问题。
-
未经验证的用户
-
网络连接和其他不受信任的来源
-
-
对于无法确定固定格式的变量,一定要进行( )处理。
-
特殊符号过滤或转义
-
-
( )攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。
-
XSS
-
-
当一个变量指向一个NULL值,使用这个变量的时候又没有检查,这时会导致( )
-
空指针异常
-
-
)中的敏感信息,如密码,服务器的地址和加密密钥,可能会泄露给攻击者。敏感信息均必须存在在配置文件或数据库中。
-
硬编码
-
-
SQL注入攻击的本质,是( )。根本解决办法是预编译,也就是sql语句事先编译好了,随后传入参数填坑,不会重新再编译,也就不会有sql注入:select,update,delete,insert等
-
程序把用户输入的数据当作代码执行
-
-
异常处理,也称为( )
-
错误处理
-
-
异常处理的基本模型包括( )两类。
-
终止模型
-
恢复模型
-
-
-
第三章
-
-
-
-
-
-
-
-
-
-
-
-
-
在C/C++编程,使用无长度限制的的函数,它会产生( )漏洞。
-
信息泄露
-
缓冲区溢出
-
-
在C/C++编程中,不应直接使用legacy的字符串拷贝、输入和输出函数,如( )等,这些函数的特征是:可以输出一长串字符串,而不限制长度。
-
-
-
应该使用scanf
-
-
-
第四章 sql注入
-
HTTP_HOST参数属于的变量是( )
-
$_SERVER
-
-
SQL注入中的宽字节注入主要是由于程序使用( )编码引起的
-
GBK
-
-
若在程序中对参数使用urldecode()函数进行了过滤,可能存在的注入方式为( )
-
二次URL解码绕过
-
-
PHP中属于字符串替换的函数是( )
-
Strreplace()
-
-
-
-
在SQL注入中将已经过滤后的“\”吃掉的注入方式为( )
-
宽字节注入
-
-
若程序中使用将敏感字符替换为空,可以绕过的方法为( )
-
编码绕过
-
-
将SQL语句指定连接的形式设置为Binary,使用的参数是( )
-
character_set_client
-
-
可以有效地防御FILE注入漏洞的参数是( )
-
Magic_quotes_gpc
-
-
可以获取HTTP头信息的函数是( )
-
getenv()
-
-
-
-
对于无过滤参数注入通常可使用union注入获取数据。
-
宽字节注入可以在编码设置不合理的情况下绕过防御函数addslashes().
-
-
-
PDO预编译方式可以有效地防御SQL注入漏洞。
-
常见的数字型SQL注入可使用报错注入或盲注入的方式来进行绕过。
-
addslashes()函数的功能和magic_quotes_gpc()不完全相同。
-
-
-
在PHP中进行URL解码的函数是urldecode.
-
按照数据类型分类,SQL注入主要分为( )
-
数字型
-
字符型
-
-
在SQL注入中若无正常回显信息,则可以使用的方法是( )
-
-
可能存在SQL注入点的是( )
-
-
属于SQL注入的内置过滤函数的是( )
-
addslashes()
-
mysql_escape_string()
-
-
-
-
-
-
课堂PPT总结
-
1 代码审计概述.pptx
-
代码审计
-
代码指的是源代码
-
生成目标代码
-
对软件编写进行说明,即:注释
-
-
审计
-
被动的检测
-
只能确认行为,不能阻止行为
-
-
-
目的
-
挖掘安全缺陷和规范性缺陷
-
避免受到更大攻击
-
-
提前部署安全防御
-
确保代码质量
-
-
静态分析程序源代码
-
流程
-
-
-
模糊测试
-
先执行测试代码
-
通过各类型的测试数据来判断异常
-
-
软件供应链安全
-
开发
-
交付
-
运行
-
-
-
-
-
-
攻击技术
-
反射型文件下载漏洞(RFD)
-
通过从受信任的域虚拟下载文件,攻击者可以获得对受害者计算机的完全访问权限。
-
-
用黑客思维考虑
-
-
零日漏洞
-
(0-Day)是指未被公开披露的软件漏洞
-
-
相关概念
-
软件安全
-
指如何构建安全的软件,即:软件本身是安全的
-
-
应用安全
-
保护软件
-
-
代码质量-益虫为
-
易用性
-
可重用性
-
可维护性
-
与是否安全无关
-
-
代码安全-饥渴玩
-
机密性
-
可用性
-
完整性
-
-
bug
-
软件错误
-
软件测试
-
-
-
漏洞
-
安全缺陷
-
代码审计
-
错误的副产品
-
-
-
-
计算机病毒
-
根据其感染的途径以及采用的技术区分
-
文件型计算机病毒
-
感染可执行文件(包括EXE和COM文件)
-
-
引导型
-
影响软盘或硬盘的引导扇区
-
-
宏病毒
-
感染的对象是使用某些程序创建的文本文档、数据库、电子表格等文件(Word Excel)
-
字处理程序Word在打开一个带宏病毒的文档或模板时,激活了病毒宏
-
病毒宏将自身复制至Word的通用(Normal)模板中
-
以后在打开或关闭文件时病毒宏就会把病毒复制到该文件中
-
-
-
目录型
-
修改硬盘上存储的所有文件的地址。
-
-
-
病毒文件
-
病毒的类型
-
Worm表示蠕虫病毒
-
蠕虫程序驻于一台或多台机器中
-
扫描其他机器是否有感染同种计算机蠕虫
-
通过其内建的传播手段进行感染,以达到使计算机瘫痪的目的
-
欢乐时光 熊猫烧香,红色代码,爱虫病毒,Nimda病毒,爱丽滋病毒,震网(Stuxnet)病毒
-
-
Trojan表示特洛伊木马
-
冰河
-
-
Backdoor表示后门病毒
-
Macro表示宏病毒
-
脚本语言病毒
-
系统病毒
-
CIH
-
-
-
-
-
-
-
-
2 DevSecOps概述 pdf
-
开发、安全和运营
-
将安全性作为整个IT 生命周期的共同责任。贯穿至整个生命周期的每一个环节
-
确保DevOps技术的安全性
-
确保DevOps方法的安全性
-
适应DevOps共享所有权的哲学
-
在软件开发生命周期的每个阶段自动集成安全性 ——从最初的设计到集成、测试、部署直至软件交付。
-
-
目标
-
在不影响安全需求的情况下快速的执行安全决策,将决策传递至拥有最高级别环境信息的人员
-
-
将应用和基础架构安全无缝集成到敏捷和 DevOps流程和工具中。
-
优势
-
速度
-
成本更低
-
快速管理新发现的安全漏洞
-
-
安全性
-
-
DevSecOps 的最佳实践
-
左移
-
将安全性从DevOps(交付)流程的右侧(末尾)移至左侧(开头)
-
确保技术栈中的每个组件和每个配置项都已修补、安全地配置并妥善记录
-
及早发现安全风险,并确保立即解决这些安全威胁
-
-
安全教育
-
可跟踪性、可审计性和可视性
-
可跟踪性旨在跟踪开发周期中的配置项,确定在代码中实现需求的位置
-
技术、程序和管理安全控制必须可审计,形成正式文件,并由所有团队成员遵守
-
监控系统,用于衡量运营状况,发送警报,提高对变更和网络攻击的认识,并在整个项目生命周期内建立问责机制
-
-
-
DevSecOps 安全建议
-
-
DevOps安全工具
-
静态分析安全测试(SAST)工具
-
自动化来评估代码的漏洞
-
高度的可扩展性
-
源组成分析,它能够自动扫描代码
-
-
动态应用安全测试 (DAST)工具
-
测试加密算法
-
验证权限
-
-
容器扫描
-
确保它们按应有的方式运行
-
将容器组件与它们正在扩展的新漏洞数据库进行比较
-
-
-
-
3.代码安全规范
-
安全编码规范
-
源代码缺陷
-
软件开发生命周期的编码阶段,产生的有意或无意的缺陷
-
原因
-
技术水平
-
引入开源代码,导致开源漏洞
-
没有进行安全测试
-
-
分类
-
输入验证类
-
避免跨站点脚本(XSS )
-
利用网页开发时留下的漏洞,注入恶意指令代码到网页
-
通常是JavaScript
-
Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML
-
-
禁止传入<script>标签
-
避免类初始化的相互依赖
-
-
表达式
-
不可忽略方法的返回值
-
-
不要引用空指针
-
在使用变量前一定要做是否为NULL值的校验
-
当一个变量指向一个NULL值,使用这个变量的时候又没有检查,这时会导致。NullPointerException(空指针异常)
-
-
数组之间的比较应当用Arrays.equals()
-
-
-
-
资源管理类
-
代码质量类
-
-
-
研发效能度
-
-
数字类型和操作
-
防止整数溢出
-
数值分成可存储整数类型和可操作整数类型
-
使用java.lang.Number.Biglnteger类进行整数运算,防止整数溢出。
-
-
避免除法和取模运算分母为零
-
-
类和方法操作
-
数据成员声明为私有,提供可访问的包装方法
-
-
比较类的正确做法
-
-
不要硬编码敏感信息
-
如密码,服务器护地址和加密密钥
-
-
验证方法参数
-
确保操作方法的参数产生有效的结果
-
-
数组引用问题
-
不要产生内存泄露
-
过度的内存泄漏可能会导致内存耗尽,拒绝服务(DoS)
-
内存泄漏缺陷具有隐蔽性、积累性
-
通常不会直接产生可观察的错误症状,而是逐渐积累,降低系统整体性能
-
-
属于遗漏型缺陷
-
-
-
异常处理(exceptional handling)
-
使用 try、catch 和 finally 关键字
-
防止未知错误产生
-
不用再绞尽脑汁去考虑各种错误
-
编程效率大大提高
-
-
异常可以由公共语言运行库(CLR)、第三方库或使用 throw 关键字的应用程序代码生成
-
基本模型
-
"终止模型"-常用
-
Java与C++所支持
-
将以致于程序无法返回到异常发生的地方继续执行
-
一旦异常被抛出,就表明错误已无法挽回
-
-
"恢复模型"
-
修正错误,然后重新尝试调动出问题的方法,并认为第二次能成功.
-
抛出异常更像是对方法的调用-
-
调用方法修正错误
-
把try块放在while循环里,这样就可以不断的进入try块,直到得到满意的结果
-
-
-
-
-
-
Docker
-
开源的应用容器引擎
-
目标是实现轻量级的操作系统虚拟化解决方案
-
-
Go语言
-
操作系统层次的虚拟技术
-
-
更高效的利用系统资源
-
更快的启动时间
-
直接运行于宿主内核
-
不需要启动完整的操作系统
-
毫秒级
-
大大的节约了开发,测试,部署的时间
-
-
确保了应用运行环境一致性。
-
也便于迁移
-
-
持续交付和部署
-
定制应用镜像
-
通过Dockerfile来进行镜像构建
-
-
-
所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
-
-
实验三 CheckMarx代码审计
-
以色列研发的一款代码审计工具
-
使用.NET开发
-
C#
-
-
CheckMarx CsSAST
-
该工具可以扫描未经编译的代码
-
可以直接上传源码zip包
-
可以随时扫描代码片段
-
Fortify SCA做不到
-
-
-
-
第六章 寻找零日漏洞
-
观察代码与系统和程序间相互作用的方式
-
是否强制某个应用程序执行
-
是否越过了安全边界
-
是否绕过了系统权限
-
-
震网的结构是非线性的
-
命令跳转来跳转去
-
震网的代码简直堪称一套专门用来侵入系统并实现传播的“瑞士军刀”
-
震网还拥有自动寻找新版本、更新旧版本的点对点传输功能
-
通过不直接连接因特网的内网计算机,完成对自身的远程更新
-
只要将新版本病毒引进来,就能迅速实现局域网内全部病毒的更新
-
-
-
-
网络恶意代码安全手册
-
恶意代码的起源
-
80%的流行病毒通过电子邮件传播
-
-
恶意网页
-
一般不具备传染性
-
万花病毒
-
一个叫“万花谷”的网站传出
-
最终使得用户的计算机的IE 浏览器上打开无数的窗口
-
-
混客绝情炸弹
-
-
注册表被修改。
-
利用ActiveX修改注册表重要键值
-
-
恶意代码的预防
-
不要轻易去一些自己并不了解的站点
-
安装杀毒软件,实现在线监测
-
杀毒软件只能防病毒,不能防止网络信息被篡改
-
-
把注册表加锁:禁止修改注册表,
-
-
-
第4章 通用安全指南
-
4.1 C/C++使用错误
-
使用无长度限制的字符拷贝函数
-
信息泄露漏洞和缓冲区溢出漏洞
-
如strcpy、strcat、sprintf、wcscpy、mbscpy等
-
-
转义字符
-
用单引号内加反斜杠
-
转义字符串(Escape Sequence)也称字符实体(Character Entity)。
-
\x表示后面的字符是十六进制数
-
\0表示后面的字符是八进制数
-
-
严格遵守字母大小写的规则
-
-
原因
-
1.表示字符集中定义的字符
-
有些字符都没有现成的文字代号。所以只能用转义字符来表示
-
-
2.某一些特定的字符在编辑语言中被定义为特殊用途的字符
-
3.出于网站的安全
-
避免利用特殊符号进行注入攻击
-
-
-
-
显示空格
-
HTML中间只保留一个空格
-
为了在网页中增加空格,可以使用  
-
-
url
-
通过(?)方式在浏览器地址栏中传值
-
在传值前 通过java.net.URLEncoder.encode(param1) 编码处理后,可将转义字符转为16进制
-
-
“&”来区分问号后的参数个数
-
传值参数中带有“&”时,在接受页面就会出现错误
-
-
-
强烈建议用 string、vector等更高封装层次的基础组件代替原始指针和动态数组
-
关联漏洞:
-
低风险-拒绝服务
-
通过向服务器发送大量垃圾信息或干扰信息的方式,导致服务器无法向正常用户提供服务的现象
-
如:计算机网络带宽攻击和连通性攻击。
-
-
中风险-信息泄露
-
数据泄露(Data Breach)指的是未经授权或意外情况下,敏感信息被非法获取、访问、披露、修改或销售。
-
-
高风险-缓冲区溢出
-
当计算机向缓冲区填充数据时超出了缓冲区本身的容量,溢出的数据覆盖在合法数据上
-
-
-
创建进程类的函数的安全规范
-
关联漏洞:
-
高风险-代码执行,-权限提升
-
-
-
尽量减少使用 _alloca 和可变长度数组
-
使用的内存量在编译期间不可知
-
可变长度数组也属于非标准扩展,在代码规范中禁止使用
-
-
-
正确示例
-
-
-
printf 系列参数必须对应
-
-
-
关联漏洞: 中风险-信息泄露
-
ASLR(Address space layout randomization)
-
针对缓冲区溢出的安全保护
-
通过对堆、栈、共享库映射等线性区布局的随机化
-
增加攻击者预测目的地址的难度
-
防止直接定位攻击代码位置
-
-
-
所有printf系列函数,要防止格式化完的字符串泄露程序布局信息
-
-
防止泄露指针(包括%p)的值
-
%p的值只应当在程序内使用
-
-
-
-
不应把用户可修改的字符串作为printf系列函数的“format”参数
-
-
对数组delete时需要使用delete[]
-
delete []操作符用于删除数组
-
调用operator delete[]
-
-
delete操作符用于删除非数组对象
-
调用operator(设备、机器的)操作员 delete
-
-
关联漏洞: 高风险-内存破坏 中风险-逻辑漏洞 低风险-内存泄漏 低风险-拒绝服务
-
-
注意隐式符号转换
-
-
4.2 不推荐使用的编程
-
switch中应有default
-
以处理各种预期外的情况
-
后期在其他开发者修改函数后确保switch仍可以覆盖到所有情况,并确保逻辑正常运行。
-
-
不应当在Debug或错误信息中提供过多内容
-
可能会泄露一些值,例如内存数据、内存地址等内容
-
中风险-信息泄漏
-
-
不应该在客户端代码中硬编码对称加密秘钥
-
使用固定密钥的程序基本和没有加密一样。
-
优先考虑直接用 HTTPS 协议
-
考虑由服务器端生成对称秘钥
-
或者根据用户特定的会话信息
-
使用HKDF 等算法衍生出对称秘钥
-
-
中风险-信息泄漏
-
-
返回栈上变量的地址
-
建议返回string、vector等类型
-
中风险-信息泄漏
-
-
有逻辑联系的数组必须仔细检查
-
高风险-内存破坏
-
-
避免函数的声明和实现不同
-
中风险-逻辑问题
-
-
-
-
查复制粘贴的重复代码(相同代码通常代表错误)
-
如果函数比较短,可以考虑定义为inline 函数
-
中风险-逻辑问题
-
-
左右一致的重复判断/永远为真或假的判断(通常代表错误)
-
函数每个分支都应有返回值
-
否则结果未知
-
-
不得使用栈上未初始化的变量
-
中风险-逻辑问题中风险-信息泄漏
-
-
不得直接使用刚分配的未初始化的内存(如realloc)
-
刚申请的内存通常是直接从堆上分配的,包含有旧数据
-
-
应校验内存相关函数的返回值
-
中风险-逻辑问题高风险-越界操作
-
-
不要在if里面赋值
-
-
4.3 多线程
-
进程
-
系统进行资源分配和调度的一个独立单位
-
上 下文进程间的切换开销(栈、寄存器、虚拟内 存、文件句柄等)比较大,但相对比较稳定安 全
-
为了更好的利用CPU的资源
-
-
线程
-
为了降低上下文切换的消耗
-
,提高系 统的并发性
-
并发控制的基本单位是事务
-
不破坏事务的隔离性、统一性,数据库的统一性
-
-
-
线程是进程的一个实体
-
系统中,最小的运算调度单位是线程,而每个线程又依附于一个进程
-
-
只拥有一点在 运行中必不可少的资源(如程序计数器,一组寄 存器和栈),
-
通信主要通过共享内存
-
-
条件竞争
-
多线程对一个共享资源操作。操作顺序 不受控的时候,由于时序问题,造成一些逻辑错误的异常情况
-
-
条件漏洞成因
-
发生了条件竞争,但在编写程序的时候,往往认为程序一条线执行下 来
-
但是一个线程在运行中是可能被随时打断 ,并且挂起,然后去执行其他线程的逻辑。
-
-
超卖问题
-
在抢购活动中,成功下订单买到商品的数量超过商品数量的上限的情况
-
解决方案
-
悲观锁
-
当查询某条记录时,数据库为该记录加锁,锁住记录后别人无法操作
-
类似在多线程资源竞争时添加的互斥锁,容易出现死锁现象,采用不多
-
-
乐观锁
-
并不是真实存在的锁
-
需修改数据库的事务隔离级别
-
如果一个事务修改了库存并提交了事务,应该修改为读取已提交(Read committed)
-
-
任务队列
-
将并行转为串行,所有人排队下单
-
-
-
-
脏牛提权
-
脏牛(Dirty COW)
-
低权限用户利用该漏洞技术可以在全版本Linux系统上实现本地提权
-
Linux内核的内存子系统在处理写时拷贝(Copy-on-Write)时存在条件竞争漏洞
-
-
当一个变量可能被多个线程使用时,应当使用原子操作或加锁操作。
-
C11后推荐使用 atomic 标准库。
-
对于C++代码,C++11后,推荐使用std::atomic
-
-
注意signal handler导致的条件竞争
-
-
注意Time of check Time of use (TOCTOU) 条件竞争
-
软件在使用某个资源之前检查状态,但是该资源的状态可以在检查和使用之间更改,从而使检查结果无效
-
TOCTOU难以修复
-
缓解方案
-
限制对来自多个进程的文件的交叉操作
-
限制”检查“(CHECK)和”使用“(USE)资源之间的时间量
-
相距尽量不要太远
-
-
确保锁定是检查之前进行的
-
以便检查时的资源与使用时的资源相同。
-
-
-
-
-
-
4.4 加密解密
-
不得明文存储用户密码等敏感数据
-
密码应该使用 Argon2, scrypt, bcrypt, pbkdf2 等算法做密码哈希之后再存入存储系统
-
传输过程中加密
-
HTTPS
-
-
存储状态下加密
-
SQLCipher
-
对要存储的内容加密后存到数据库中
-
-
-
-
临时使用/敏感数据应该安全抹除
-
rand()类函数应正确初始化
-
C语言是利用linear congruential generator作为生成器来生成伪随机数,但是这个生成器生成伪随机数,需要一个“种子”来进行运算
-
rand类函数的随机性并不高
-
其内部实现是用线性同余法实现的,是伪随机数
-
自动设计随机数种子为1。随机种子相同,每次产生的随机数也会相同
-
-
使用前需要使用srand()来初始化
-
产生随机种子
-
使用time(NULL)和getpid(NULL)的返回值作为srand的参数,以产生不同的种子
-
-
-
-
在需要高强度安全加密时不应使用弱PRNG函数
-
PRNG
-
PRNG(pseudorandom number generator)伪随机数生成器是指通过特定算法生成一系列的数字,使得这一系列的数字看起来是随机的,但是实际是确定的,所以叫伪随机数。
-
-
必须使用密码学安全的随机数生成器(Cryptographically Secure PseudoRandom Number Generator (CSPRNG)
-
-
避免路径穿越问题
-
文件名中包含 ../等特殊字符,
-
-
避免相对路径导致的安全问题(DLL、EXE劫持等问题
-
DLL
-
通过替换系统或应用程序所需的 DLL 文件,来使得程序在运行时加载恶意版本的 DLL,
-
指明模块的完整(全)路径,禁止使用相对路径,这样就可避免从其它目录加载DLL
-
-
EXE
-
修改系统中的文件关联,使得当用户打开一个正常文件时,会被恶意 EXE 文件替换,然后执行恶意代码
-
-
-
文件权限控制
-
根据文件的敏感级别设置不同的访问权限
-
-
防止各种越界写(向前/向后)
-
防止任意地址写
-
允许攻击者在内存中任意位置写入数据
-
-
防止整数溢出
-
在进行内存操作时,需要对分配、拷贝等大小进行合法校验
-
整数溢出
-
一个整数变量的值超过了它能够表示的最大值,导致数据的准确性丢失
-
-
关联漏洞:内存破坏
-
-
防止Off-By-One
-
使用的最大值或最小值不正确,使得该值比正确值多1或少1
-
算数组索引时没有正确处理边界条件,导致访问超出数组的有效范围
-
导致包括缓冲区溢出、数据越界访问、程序崩溃
-
-
使用string \vector等组件代替原始指针和数组操作
-
-
避免大小端错误
-
大端-顺
-
高字节存放到内存的低地址
-
数据的最高有效字节(Most Significant Byte, MSB)位于最左边,而最低有效字节(Least Significant Byte, LSB)位于最右边
-
-
对于一个4字节(32位)的整数 0x12345678
-
会被存储为 12 34 56 78
-
12 是最高有效字节(Most Significant Byte, MSB),而 78 是最低有效字节(Least Significant Byte, LSB)
-
-
-
小端-逆
-
高字节存放到内存的高地址
-
最低有效字节(LSB)位于最左边,而最高有效字节(MSB)位于最右边
-
-
对于一个4字节的整数 0x12345678
-
会被存储为 78 56 34 12
-
-
-
不同的系统和网络协议可能采用不同的字节序
-
-
-
-
检查除以零异常
-
行除法运算时,需要判断被除数是否为零
-
低风险-拒绝服务
-
-
防止数字类型的错误强转
-
比较数据大小时加上最小/最大值的校验
-
根据数字类型
-
高风险-内存破坏
-
-
检查在pointer上使用sizeof
-
s i z e _ t p o i n t e r _ l e n g t h = s i z e o f ( v o i d * )
-
中风险-逻辑漏洞
-
-
不应当向指针赋予写死的地址
-
高风险-内存破坏
-
-
检查空指针
-
低风险-拒绝服务
-
-
释放完后置空指针
-
对指针进行释放后,需要将该指针设置为NULL,以防止后续free指针的误用,导致UAF等其他内存破坏问题
-
高风险-内存破坏
-
-
-
-
抓包token
-
服务端生成的一串字符串
-
以作客户端进行请求的一个令牌
-
以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码
-
-
可以叫暗号
-
不同的暗号被授权不同的数据操作
-
-
token是一个身份卡,有权限的作用
-