PHP程序污点型漏洞静态检测方法
- 格式:pdf
- 大小:2.46 MB
- 文档页数:6
漏洞挖掘方法漏洞挖掘是指通过对软件、系统或网络进行检测和测试,发现其中存在的安全漏洞的过程。
在信息安全领域中,漏洞挖掘是非常重要的一项工作,它可以帮助企业和组织发现并修复潜在的安全风险,保障系统和数据的安全性。
在本文中,将介绍几种常见的漏洞挖掘方法。
1. 静态代码分析静态代码分析是一种通过分析源代码或编译后的代码来发现潜在漏洞的方法。
它可以检测出一些常见的编程错误,如缓冲区溢出、空指针引用等。
静态代码分析可以在代码编写阶段就发现问题,避免将漏洞引入到系统中。
2. 动态代码分析动态代码分析是一种通过执行软件来发现漏洞的方法。
它可以模拟真实的运行环境,对软件进行各种测试和检测。
动态代码分析可以发现一些在静态分析中难以发现的漏洞,如内存泄漏、线程竞争等。
通过动态代码分析,可以更加全面地评估软件的安全性。
3. 模糊测试模糊测试是一种通过向输入接口输入异常或随机数据来测试系统的安全性的方法。
它可以模拟攻击者可能使用的各种输入情况,检测系统在异常情况下的表现。
模糊测试可以发现一些未经处理的异常输入导致的安全漏洞,如缓冲区溢出、拒绝服务等。
4. 符号执行符号执行是一种通过符号化变量的值来执行程序的方法。
它可以遍历程序的所有可能路径,发现潜在的漏洞。
符号执行可以发现一些复杂的漏洞,如逻辑漏洞、数据依赖漏洞等。
通过符号执行,可以对程序进行深入的分析,发现更加隐蔽的安全问题。
5. 漏洞利用漏洞利用是一种通过利用已知的安全漏洞来攻击系统的方法。
它可以通过构造特定的输入数据,触发系统中的漏洞,获取系统的控制权。
漏洞利用可以帮助企业和组织了解自身系统的安全性,及时修复潜在的漏洞。
漏洞挖掘是保障系统安全的重要手段之一。
通过静态代码分析、动态代码分析、模糊测试、符号执行和漏洞利用等方法,可以全面评估系统的安全性,发现并修复潜在的漏洞。
在信息安全领域中,漏洞挖掘的重要性不可忽视,希望本文对读者能有所启发。
漏洞挖掘方法范文漏洞挖掘方法是指寻找软件或系统中存在的漏洞,以及通过发现和利用这些漏洞来攻击系统的行为。
漏洞挖掘可以帮助开发者发现并修补可能导致系统遭受攻击的弱点,以增强系统的安全性。
下面将介绍几种常见的漏洞挖掘方法。
1.静态分析静态分析是通过对软件或系统的源代码和二进制代码的静态扫描,来寻找其中的漏洞。
静态分析可以帮助开发者在代码编写过程中发现潜在的漏洞,并及时进行修复。
静态分析工具通常使用各种分析技术,如数据流分析、控制流分析和符号执行等,来检测代码中的漏洞。
通过对代码的结构和逻辑进行分析,可以发现例如缓冲区溢出、输入验证错误和逻辑错误等常见的安全漏洞。
2.动态分析动态分析是通过运行软件或系统,并监视其执行过程,来寻找其中的漏洞。
动态分析可以帮助开发者在运行时发现代码中的漏洞,并获取关于漏洞的更多详细信息。
动态分析通常使用各种技术,如模糊测试、符号执行和动态符号执行等,来寻找漏洞。
通过对软件或系统的输入进行有效的输入、错误和边界测试,可以引发潜在的漏洞,以便于进一步分析和修复。
3.模糊测试模糊测试是一种常见的动态分析方法,它通过向软件或系统的输入参数中注入错误、无效或随机的数据,来寻找潜在的漏洞。
模糊测试可以帮助开发者发现例如缓冲区溢出、格式化字符串错误和整数溢出等常见的安全漏洞。
模糊测试通常使用自动化工具来生成和运行大量的输入,以便于尽可能多地覆盖不同的代码路径,从而增加发现漏洞的可能性。
4.符号执行符号执行是一种基于静态分析的动态分析方法,它通过对代码中的符号进行符号替换,并推导执行路径,来寻找潜在的漏洞。
符号执行可以帮助开发者发现例如空指针解引用、整数溢出和未初始化变量等常见的安全漏洞。
符号执行通常使用自动化工具来对代码进行符号推导,并构造能够导致漏洞条件的测试用例,以便于进一步分析和修复。
总结起来,漏洞挖掘方法主要包括静态分析、动态分析、模糊测试和符号执行等。
这些方法可以帮助开发者发现并修复可能导致系统遭受攻击的漏洞,以增强系统的安全性。
标题:【原创】漏洞挖掘方法之静态扫描+经典栈溢出实例作者:tishion时间: 2014-02-11,01:52:50链接: /showthread.php?t=184409漏洞挖掘方法之静态扫描+经典栈溢出实例这是笔者公开发表的关于漏洞挖掘的第二篇文章,与发第一篇的时间差不多间隔了整整一年,在这一年里虽然工作细碎,但我还是抽出了大量的时间关注安全,因为当初的既定目标就是走安全的路。
这一年了也做了不少关于安全方面的事情,比如参加各大*SRC的漏洞提交什么的,曾今有一段时间也是走火入魔了一样,但是后来我停下来了,因为我觉得那种事情偏离我最初对“漏洞“挖掘的定义,看了那些提交的所谓“漏洞”,基本都是功能缺陷的漏洞(这里只说PC终端产品,Web漏洞不在本文讨论范围内),比如说过xxx主防加载驱动,写启动项,干掉xxx杀软等等,这些也属于一个产品的漏洞,但是这种功能缺陷型漏洞大都带有一种高层次对抗的意味,这种漏洞的挖掘和利用过程完全脱离了对底层二进制级别的指令执行过程的分析,这样的漏洞挖掘中的唯一用处就是你可能对一个操作系统上的各个小子系统更加熟悉,当然前提是你是一个喜欢总结追根摸底的人,你会“系统性“学习,否则的你只能成为一个什么武功都会个一招半式的人,只能知其然,却不能知其所以然。
漏洞挖掘还是要回归本质,就我所知,目前国内真正做漏洞挖掘比较务实并且有很多成果的公司瀚海源和360。
瀚海源和安全宝从发展过程来看比较类似,但是前者偏向Host安全,后者偏向Web安全。
看过瀚海源的一些博客以及给微软提交的漏洞,觉得他们做的才是真正的漏洞挖掘。
言归正传,回到本文的话题,前一篇文章是关于漏洞挖掘的Fuzz方法并且介绍了Windows XP里面的AFD.sys里面的Local DOS漏洞,这篇文章是关于漏洞挖掘的另一种方法—静态扫描潜在危险函数。
为了使文章内容充实有干活,笔者在自己使用静态扫描发现的漏洞中选择一个经典栈溢出来讲解,包括对该溢出的挖掘过程,利用方法,shell code构造等。
漏洞验证方法
漏洞验证方法是指通过特定的技术手段对应用程序或系统中可能存在的漏洞进行测试和验证的过程。
下面介绍几种常用的漏洞验证方法:
1. 扫描器验证:使用扫描器(如Nessus、OpenVAS等)进行全面的漏洞扫描,以发现应用程序或系统中的潜在漏洞。
2. 命令注入验证:针对应用程序或系统中有输入字段的情况,通过输入一些特殊字符或命令对程序进行测试,以验证是否存在命令注入漏洞。
3. SQL注入验证:通过在应用程序或系统的输入字段中输入一些恶意的SQL语句,以判断是否存在SQL注入漏洞。
4. XSS漏洞验证:在应用程序或系统的输入字段中输入一些特定的脚本代码,以验证是否存在XSS漏洞。
5. 文件包含漏洞验证:通过构造特定的路径和参数,以验证应用程序或系统是否存在文件包含漏洞。
需要注意的是,漏洞验证必须遵守相关法律法规,未经授权擅自进行漏洞验证可能会导致法律后果。
软件测试中基于静态分析的错误检测方法在软件开发过程中,错误的检测和修复是至关重要的。
有时,错误可能会导致系统崩溃、数据泄露或安全漏洞。
因此,软件测试起着至关重要的作用,帮助开发人员及时发现和修复潜在的错误。
软件测试有很多方法,其中基于静态分析的错误检测方法是一种常用且有效的方法。
静态分析是通过分析程序源代码或二进制代码的结构和语义来发现错误的方法。
与动态测试相比,静态分析的优势在于不需要运行程序,可以提前发现潜在的错误,并且能够覆盖到程序的所有执行路径。
下面将介绍几种常见的基于静态分析的错误检测方法。
第一种基于静态分析的错误检测方法是语法检查。
语法检查是指检查程序的语法结构是否符合语言规范的方法。
它可以帮助开发人员在编译前发现潜在的语法错误,并提供相关的错误提示。
常见的语法检查工具有编译器和集成开发环境(IDE)中的语法检查功能。
通过在开发过程中使用语法检查工具,开发人员可以在源代码级别避免一些常见的语法错误,从而减少后续测试中的错误数量。
第二种基于静态分析的错误检测方法是代码规范检查。
代码规范检查是指检查代码是否符合编码规范和最佳实践的方法。
不符合编码规范和最佳实践的代码可能导致代码难以理解、维护困难以及潜在的错误。
常见的代码规范检查工具有Checkstyle、FindBugs和PMD等。
这些工具可以帮助开发人员在编码阶段发现和修复潜在的问题,提高代码的质量和可靠性。
第三种基于静态分析的错误检测方法是数据流分析。
数据流分析是指分析程序中的数据流,以确定变量的值和使用是否符合预期的方法。
数据流分析可以帮助开发人员发现潜在的数据竞争、内存泄漏和空指针异常等错误。
常见的数据流分析工具有FindBugs、PMD和Coverity等。
这些工具通过静态分析程序的代码路径和变量的使用情况,可以发现一些难以在动态测试中发现的错误。
第四种基于静态分析的错误检测方法是模型检验。
模型检验是一种形式化方法,通过建立系统的模型并对模型进行验证来发现错误。
计算机软件安全漏洞的检测与修复方法一、引言随着信息技术的快速发展,计算机软件的使用越来越普遍。
然而,由于软件开发过程中的疏忽或设计缺陷,计算机软件的安全问题日益突出。
软件安全漏洞的存在给用户和系统带来了巨大的风险。
因此,对计算机软件安全漏洞进行及时的检测与修复成为了至关重要的任务。
二、计算机软件安全漏洞检测方法1. 静态代码分析:静态代码分析是一种通过分析代码本身进行漏洞检测的方法。
这种方法不需要运行代码,可以直接检测出潜在的漏洞。
通过对代码的语法和结构进行深入分析,静态代码分析可以识别出可能引发安全漏洞的代码片段。
在代码编写阶段,开发人员可以利用静态代码分析工具来检测潜在的漏洞,并进行修复。
2. 动态代码分析:与静态代码分析不同,动态代码分析是通过运行代码来检测漏洞。
这种方法可以模拟真实的运行环境,通过检测程序的执行路径和输入数据,寻找潜在的安全漏洞。
动态代码分析可以帮助开发人员了解程序在运行时的行为,从而定位和修复漏洞。
3. 模糊测试:模糊测试是一种通过随机生成、修改测试输入数据的方法来发现漏洞。
这种方法可以在不了解程序内部结构的情况下,对软件的安全性进行评估。
通过向程序输入各种异常、边界值和非法输入,模糊测试可以揭示程序中的漏洞,并帮助开发人员修复这些漏洞。
三、计算机软件安全漏洞修复方法1. 代码修复:在检测到安全漏洞之后,开发人员需要对代码进行修复。
修复代码的目的是消除潜在的安全漏洞,增强软件的安全性。
在进行代码修复时,开发人员应该尽量遵循安全编码的最佳实践,如避免使用已知的不安全函数、使用加密算法来保护敏感数据等。
2. 漏洞补丁:漏洞补丁是指通过安装更新的方式修复软件中的漏洞。
出于安全的考虑,软件供应方会及时发布漏洞补丁,用户可以通过更新软件来获取漏洞的修复版本。
因此,用户应该定期检查软件是否有漏洞补丁,并及时进行更新。
3. 安全策略:除了对软件本身的修复,通过制定安全策略也可以提高软件的安全性。
计算机软件的安全漏洞检测方法1.静态代码分析:静态代码分析是一种通过检查源代码或编译后的二进制代码的方法,发现安全漏洞。
它可以识别可能导致漏洞的代码模式或常见的安全缺陷,如缓冲区溢出、SQL注入和跨站脚本攻击等。
静态代码分析工具通常使用规则或模式来检查代码,包括正则表达式和代码规范等。
2.动态代码分析:动态代码分析是通过对运行时代码进行监视和分析,检测潜在的安全漏洞。
它通过模拟真实环境中可能的攻击情况,发现漏洞并评估其风险和可能性。
动态代码分析工具可以使用模糊测试、数据流分析和符号执行等方法来发现漏洞。
3.模糊测试:模糊测试是一种通过输入无效、异常或非预期输入来测试软件的安全性。
它可以帮助发现输入校验或处理方面的漏洞,比如缓冲区溢出等。
模糊测试工具会发送大量的随机数据和边界数据给软件,观察其行为是否异常或导致崩溃。
如果发现了漏洞,可以进一步分析和修复。
4.安全代码审查:安全代码审查是通过检查软件源代码中的潜在安全缺陷来发现漏洞。
它可以识别可能的漏洞源,并提供修复建议。
安全代码审查需要专业的安全专家参与,通过对代码的细致检查和分析,发现潜在的安全漏洞。
它可以结合静态代码分析和动态代码分析等方法进行综合评估。
5.安全漏洞数据库查询:安全漏洞数据库是一些团队、组织或个人维护的漏洞信息存储库,包含了已知的安全漏洞的描述、分析和修复建议。
在进行安全漏洞检测时,可以通过查询这些数据库,查找是否存在已知的漏洞。
漏洞数据库可以及时提供漏洞信息的更新,并帮助软件开发者快速修复漏洞。
总结起来,计算机软件的安全漏洞检测方法包括静态代码分析、动态代码分析、模糊测试、安全代码审查和安全漏洞数据库查询等。
这些方法可以结合使用,提供全面的漏洞检测和修复方案,帮助软件开发者提高软件的安全性和稳定性。
Python恶意代码分析教程静态与动态分析方法Python恶意代码分析教程:静态与动态分析方法恶意代码是指有恶意意图的计算机程序,它们通过操纵、破坏计算机系统和用户数据来达到自身目的。
为了有效地对抗恶意代码的威胁,对其进行分析是至关重要的。
本教程将介绍Python恶意代码分析的静态与动态分析方法,帮助读者深入了解恶意代码的行为和特征,提高对恶意代码的识别与处理能力。
一、静态分析方法静态分析是指在不运行代码的情况下对其进行分析,通过审查源代码、二进制文件或已编译的代码来获取相关信息。
以下是几种常用的静态分析方法:1. 反汇编分析反汇编是将机器码转换为汇编语言的过程。
通过反汇编分析,可以了解恶意代码的底层执行逻辑、引用的外部函数等。
IDA Pro是一款强大的反汇编工具,可以帮助分析人员快速定位关键代码区域。
2. 代码静态分析代码静态分析是对源代码进行分析,以发现可能存在的漏洞、弱点或恶意行为。
工具如Pylint、Bandit等可以自动扫描代码,检测代码中的常见安全问题,并提供相应的修复建议。
3. 依赖关系分析通过分析恶意代码所依赖的外部库、模块和API,可以了解其可能的功能和行为。
使用工具如pydep可以自动分析代码的依赖关系,并生成可视化的依赖图,帮助分析人员更好地理解代码的结构和特点。
二、动态分析方法动态分析是在运行恶意代码的环境中捕获、监视其行为,并分析其运行过程。
以下是几种常用的动态分析方法:1. 恶意流量分析通过抓取并分析恶意代码的网络流量,可以了解其与远程服务器之间的通信情况、传输的数据和使用的协议。
Wireshark是一款常用的网络流量分析工具,可以帮助分析人员深入分析恶意代码的通信行为。
2. 行为监视和沙盒分析使用行为监视工具,如Cuckoo Sandbox和DRAKVUF,可以在虚拟环境中运行恶意代码,并监视其行为,如文件读写、注册表操作等。
通过分析监视结果,可以了解代码的具体行为和可能的恶意行为。
基于静态代码分析的软件安全缺陷检测技术软件安全一直是互联网时代的重要课题之一。
随着软件的广泛应用和大规模开发,软件安全问题也变得愈发突出。
为了确保软件的稳定性和安全性,静态代码分析技术被广泛应用于软件安全缺陷的检测与修复。
静态代码分析是一种通过分析源代码的结构和语义规则来检测软件安全缺陷的方法。
与动态测试不同,静态代码分析可以在软件运行之前进行,帮助开发人员及早发现和修复软件中的安全问题,以防止这些问题在实际运行过程中造成严重后果。
静态代码分析技术基于对源代码的语法和语义的分析,通过静态分析器对源代码进行扫描,检测并报告可能存在的软件安全缺陷。
常见的静态代码分析工具包括Coverity、FindBugs、PMD等。
静态代码分析技术可以帮助开发人员发现各种常见的软件安全缺陷,例如缓冲区溢出、空指针引用、逻辑错误、代码注入等。
这些缺陷可能导致程序异常、崩溃、数据泄露、远程代码执行等安全漏洞,并可能被恶意攻击者利用进一步侵入系统或获取敏感信息。
静态代码分析技术的优势在于早期发现和修复软件安全问题,减少软件开发中的安全漏洞。
与传统的人工代码审查相比,静态代码分析可以自动化进行,大大提高了效率和准确性。
静态代码分析可以应用于大型软件项目,无需手动测试所有路径,大大缩减了测试成本和时间。
然而,静态代码分析技术也存在一些局限性。
分析器可能会产生误报和漏报。
由于静态代码分析无法模拟程序的实际运行环境,因此可能会误判一些合法的代码,或者漏掉一些存在的潜在问题。
静态代码分析工具需要准确的编译环境和代码库支持,否则可能无法正确分析代码。
静态代码分析只能发现已知的安全漏洞,无法发现未知的漏洞。
为了提高静态代码分析技术的效果和可靠性,可以考虑以下几点。
开发人员需要了解和熟悉静态代码分析工具的使用方法和规则,以确保正确使用分析工具。
需要建立完善的代码审查机制和流程,将静态代码分析技术与人工审查有机结合,提高代码质量和安全性。
高效代码检查和修正的工具和技巧近年来,我们的生活已经深深地和计算机科学融为一体,软件程序无处不在,我们的工作和学习已经离不开计算机。
与此同时,代码的规模和复杂度也在不断地增长,程序员们为了保证代码的质量,需要进行代码检查和修正。
然而,代码检查和修正一般需要耗费大量的时间和人力,进而影响工程周期和预算。
如何使用工具和技巧来高效地进行代码检查和修正,成为了程序员们共同的难题。
一、代码检查工具1. 静态分析工具静态分析工具(Static Analysis Tool)是一种检查代码规范、发现潜在漏洞和错误的自动化工具。
使用静态分析工具,可以在代码编写的过程中及时发现潜在的问题,极大的提高代码的质量和稳定性。
静态分析工具包括了众多的开源和商业工具,其中比较有代表性的开源工具有Pylint、Flake8等,商业工具有Clang、Coverity等。
2. 动态测试工具动态测试工具是通过运行代码来检查代码性能和安全漏洞的工具。
动态测试工具可以在运行时对代码进行分析,通过模拟实际用户使用的情况,来模拟代码的运行环境。
比较有代表性的开源工具有JUnit、TestNG,商业工具有JMeter、LoadRunner等。
二、修正工具和技巧1. 自动化修正工具自动化修正工具是针对代码中常见问题进行批量修正的工具,例如拼写错误、格式化问题等。
自动化修正工具可以大量减少程序员的工作量,同时保证修正的一致性和即时性。
比较有代表性的自动化修正工具有CodeSpell、EditorConfig等。
2. 代码重构技巧代码重构技巧是针对代码重构的一些技巧和方法。
代码重构可以改进代码的设计,使得代码更加易维护、易扩展和易重用,同时还可以去除代码中的重复和冗余信息。
代码重构不仅可以提高代码的质量,还可以提高程序员的效率和工作的愉悦度。
比较有代表性的代码重构技巧有提取函数、提取类、设计模式等。
三、总结高效的代码检查和修正是保证代码质量的重要手段之一。
1引言根据w3techs[1]的统计结果可知,82.1%的网站服务端使用的编程语言是PHP,但是由于PHP语言固有的脆弱性,使程序员在编程过程中极易产生各种漏洞,如SQL注入、XSS、任意文件上传下载、命令执行、代码注入等。
而这些漏洞绝大多数可以被归纳为“污点型”漏洞,即由于没有对用户输入进行有效的过滤,使其进入了敏感函数,导致漏洞产生。
2013年OWASP Top10中排名前三的漏洞类型中,两种都是污点型漏洞[2]。
国内外的研究者对如何检测网站应用的污点型漏洞做了大量研究,其技术分类可以归纳为:动态测试、静态分析和动静态结合的方式[3]。
Halfond对SQL注入攻击技术做了大量的研究,并提出一系列检测SQL注入攻击的方法,这些方法也可以用来被动地检测SQL注入漏洞。
文献[4]提出了动态检测SQL注入漏洞的方法。
文献[5]提出了一种对PHP语言静态代码分析的方法,通过对PHP程序输入点到敏感点之间的数据流建模分析,检测污点型漏洞。
文献[6]和[7]提出了更加精确的字符串分析方法,对大量PHP内置函数进行建模,提高漏洞检测的精度,减少误报。
文献[8]提出了一种基于注入活动分析技术的动静态结合的漏洞检测方法。
对比以上技术可以发现,研究者对通过动态测试的方法进行漏洞检测的技术研究较多,这是基于攻击者通常不能获得网站源代码的情况下,通过模拟攻击者攻击PHP程序污点型漏洞静态检测方法麻荣宽,魏强,武泽慧MA Rongkuan,WEI Qiang,WU Zehui解放军信息工程大学,郑州450001PLA Information Engineering University,Zhengzhou450001,ChinaMA Rongkuan,WEI Qiang,WU Zehui.Static detection method for tainted-style vulnerabilities of PHP application. Computer Engineering and Applications,2018,54(1):64-69.Abstract:This paper proposes a method based on static code analysis to detect vulnerabilities for PHP tainted-style vul-nerability caused by Web Apps.Firstly,the paper provides the control flow graph generating algorithm.By employing the PHP built-in function,it analyzes the PHP program to construct the abstract parse tree,and then it generates the control flow graph.Secondly,it models the built-in features,the entry point and the sensitive point,and presents the data flow analysis approach.Then,it proposes the effective paths analysis approach based on taint analysis to improve the accuracy of the analysis and gives the variable backtracking algorithm.Finally,the paper implements the prototype of the approach, and tests on two widely used PHP applications and finds6undisclosed vulnerabilities and11disclosed vulnerabilities. Key words:abstract parse tree;Control Flow Graph(CFG);tainted-style vulnerability;path traversal;taint analysis摘要:针对基于PHP语言开发的Web应用程序产生的污点型漏洞,提出一种静态代码分析检测的方法。
提出的生成控制流图的算法,基于PHP内置函数解析PHP程序,生成抽象解析树,进而生成控制流图;对内置特征、入口点和敏感点进行建模,精确分析数据流;提出基于有效路径的污点分析方法,提高了分析的准确性,实现了基于变量回溯的路径遍历算法。
实现了该方法的原型系统,并对两个广泛使用的PHP应用程序进行测试,发现了6个未公开漏洞和11个已公开漏洞,证明了该系统具有较强的漏洞检测能力。
关键词:抽象解析树;控制流图;污点型漏洞;路径遍历;污点分析文献标志码:A中图分类号:TP393.1doi:10.3778/j.issn.1002-8331.1608-0258基金项目:国家高技术研究发展计划(863)(No.2012AA012902)。
作者简介:麻荣宽(1992—),男,硕士生,主要研究方向为网络信息安全,E-mail:big_ma@;魏强(1979—),男,副教授,硕士生导师,主要研究方向为软件脆弱性分析。
收稿日期:2016-08-11修回日期:2016-10-21文章编号:1002-8331(2018)01-0064-06CNKI网络优先出版:2017-02-10,/kcms/detail/11.2127.TP.20170210.0852.044.html的方式进行测试的方法,结果有较大的真实性。
但是由于测试用例的不完善,导致代码覆盖率较低,产生大量误报。
PHP 程序的静态分析技术2004年开始出现[9-10],由于PHP 语言具有动态性和弱类型两种特点,对其建模难度较大。
将对C 语言的静态分析技术直接用于PHP分析的精确度是不够的。
针对上述问题,本文提出了一种针对PHP 程序污点型漏洞静态检测方法。
对每个PHP 文件和函数构造控制流图(CFG ),通过变量回溯提取有效路径以减少不必要的路径分析,并通过函数摘要的方式优化分析效率。
通过对PHP 内置特征的建模进行更加精确的字符串分析和漏洞模型构建,实现了原型系统TVFinder ,并对广泛使用的PHP 应用程序进行测试,发现大量未公开漏洞。
2PHP 污点型漏洞2.1污点型漏洞威胁模型PHP 语言主要用于Web 服务端开发,服务器(Apache 、Nginx 等)接收用户请求,调用PHP 模块处理这些请求数据。
PHP 有丰富的拓展模块,提供了大量的内置函数,如mysql_query 进行数据库查询,readfile 用于读取文件并输出内容,这些函数的参数如果被用户操作,则可能产生漏洞。
在污点型漏洞威胁模型中,比较直观地体现了漏洞的成因和漏洞的触发过程,如图1所示。
攻击者通过发送HTTP (或HTTPS )请求到Web 服务器,服务器收到请求后将明文的HTTP 协议数据传递给PHP 解析器,PHP 内置了不同的超全局变量接收这些数据,比如$_GET 接收请求URL 中的参数,$_COOKIE 则接收HTTP 协议头部Cookie 字段的数据,而$_FILE 则接收上传的文件相关参数。
分析污点型漏洞,是从PHP 代码层进行分析,即认为这些超全局变量是输入源(sources )。
从PHP 程序的逻辑进行分析,PHP 程序对这些数据进行操作的过程中,如果有数据未经有效验证和过滤就进入了敏感函数,那么用户就可以精心构造恶意数据,进行危险操作,进而产生漏洞。
2.2漏洞示例本节以SQL 注入漏洞为例介绍污点型漏洞的成因,SQL 注入漏洞是本文原型系统的检测对象之一。
如图2是一段处理用户登录的PHP 程序片段,存在两处SQL 注入漏洞。
可以看到其首先判断POST 传输的参数是通过uid 登录还是用户名登录,选择不同的处理方式,其中第6行和第10行处产生SQL 注入漏洞,而漏洞成因各不相同。
第6行中$username 变量由没有经过任何验证带入了mysql_query 函数进行查询,导致漏洞的产生。
如果攻击者构造语句如图3中第1行所示,最终查询的SQl注入语句即是第2行。
用户可以通过输入password=1(1的md5值是c4ca4238a0b923820dcc509a6f75849b )实现admin 用户的登录,而不用考虑真实的admin 用户密码。
用户精心构造的SQL 语句可以执行任意SQL 语句。
第10行的$uid 变量是被PHP 内置函数mysql_real_escape_string 处理过的,而且该函数是PHP 推荐的防止SQL 注入的函数,但是依然存在SQL 注入漏洞。
原因是第10行处的$uid 没有被单引号包含,导致攻击者可以不用任何mysql_real_escape_string 函数转义的字符就能构造SQL 注入攻击语句。
在uid 参数位置即可注入攻击语句,执行任意SQL 语句。
3TVFinder 系统架构本文实现的TVFinder 原型系统主要分为两个阶段,即预处理阶段和污点分析阶段。
如图4是该系统整图1污点型漏洞威胁模型图2处理登录的PHP程序片段图3用户输入语句和程序执行的SQL 查询语句体流程架构图,其中预处理阶段主要是基于PHP内置函数token_get_all和token_name对PHP程序分词,生成AST(抽象语法树),进而在AST基础上进行PHP的语法和词法分析[11],精确的字符串分析提取函数摘要,并创建CFG。
其中函数摘要的准确性和CFG的完整性,保证了污点分析的准确性和效率。
污点分析阶段在前一阶段的基础上通过变量回溯的方法提取有效路径,将无关的路径“剪枝”,判断用户输入到达敏感点的路径上是否经过了有效的过滤,进而判定是否存在漏洞。
本文主要以SQL注入漏洞和任意文件读取漏洞为检测对象。
3.1预处理阶段预处理阶段的目标是生成污点分析阶段用到的完整CFG图。
该阶段首先对每个PHP文件源码进行扫描,每个文件可以视为主函数和用户的自定义函数UDF (User-Defined-Function),本文只对面向过程编程的PHP程序进行了分析。
其中,主函数生成一个对应的语法解析树,将每个UDF也分别生成语法解析树。
然后从主函数开始将语法解析树生成控制流图CFG,在创建主函数CFG的过程中如果第一次遇到某个UDF,则将它的名称、参数、全局变量等信息提取,保存在全局环境中。