目录
1.1、简介:
1、在Perl平台上获取用户提交的输入的方法、与用户会话交互的方式、存在的潜在危险的API以及与平台安全相关的配置选项。众所周知,Perl语言允许开发者以各种方式执行相同的任务。且有大量Perl模块可满足不同的需求,如果Perl使用任何不常见的或所有权模块,应对这些模块进行仔细审查,确定它们是否使用了任何强大的或危险的函数,从而引入应用程序直接使用这些函数时引入的相同漏洞。
2、CGl.pm是最常用于创建Web应用程序的Perl模块,当对用Perl编写的Web应用程序进行代码审查时,很可能遇到这个模块所使用的API
1.2、确定用户提交的数据
简述:
CGI查询对象的全部成员:
param //如果调用时不使用参数,param返回请求中所有参数名称的列表
param_fetch //如果调用时使用参数名称,param返回该请求参数的值,param_fetch方法返回一个命名参数数组
Vars //返问参数名称与值之间的散列映射
cookie //使用cookie函数可设定和检索一个命名cookie的值
raw_cookie //函数返回HTTP cookie消息头的全部内容,但不进行任何解析
……
1.3、会话交互
简述:
Perl模块CGISession.pm对模块CGI.pm进行扩展,为会话追踪与数据存储提供支持
1.4、潜在危险的API
文件访问
1、Perl使用API访问文件:open、sysopen
2、open函数用于读取或写入指定文件的内容。如果以文件名参数提交用户可控制的数据,攻击者就可以访问服务器文件系统上的任意文件。
3、如果文件名参数的开头或结尾为管道符(|),那么这个参数的内容被提交给一个shell命令。如果攻击者能够注入包含管道符或分号之类的shell元字符的数据,那么他们就可以执行任意命令
数据库访问
1、selectall_arrayref函数用于向数据库发送一个查询,并以一系列数组的形式检索查询结果。do函数用于执行一个查询,并返回受影响的行的数量,在这两个函数中,SQL语句以一个简单的字符串提交
2、如果用户可控制的数据属于字符串参数的一部分,那么应用程序就可能容易受到SQL注入攻击
3、prepare与execute函数可用于创建预处理语句,允许应用程序建立一个包含参数占位符的SQL查询,并以可靠而且类型安全的方式设定这些占位符的值,如果按正常的方式使用,这种机制就不易受到SQL注入攻击
动态代码执行
eval可用于动态执行包含Perl代码的字符串,分号分隔符用于将几个语句连接在一起,如果向这个函数提交用户可控制的数据,那么应用程序可能易于受到脚本注入攻击
OS命令执行
可用于执行操作系统命令的函数:system、exec、qx、反单引另(`)
所有这些命令都可以使用I字符连接在一起,如果未经过滤就向这些函数提交用户可控制的数据,攻击者就可以在应用程序中执行任意命令
URL重定向
CGI查询对象成员之一的redirect函数接受一个包含相对或绝对URL的字符中,用户被重定向到该URL,如果这个字符串的值由用户控制,那么应用程序可能易于受到钓鱼攻击
套接字
使用socket创建一个套接字后,再通过调用connect在它与远程主机之间建立连接,connect函数接受由目标主机的IP与端口信息组成的sockaddr_in结构,如果用户能够以某种方式控制这些主机信息,攻击者就可以利用应用程序与任意主机建立网络连接, 无论这些主机位于因特网上、私有DMZ中还是在应用程序上运行的内部网络内。
配置Perl环境
1、Perl提供一个污染模式,防止用户提交的输入被传送给潜在危险的函数,通过以下方式向Perl解释器提交-T标记,可在污染模式下执行Perl程序
#!/usr/bin/perl -T
2、当某个程序在污染模式下运行时,解释器会追踪该程序以外提交的每一个输入,并把它当做被污染的输入处理。如果另一个变量根据一个受污染的数据分配它的值,那么Perl也认为它受到污染
3、不能将污染的变量提交给一系列功能强大的命令,包括eval 、system、exec与open。要在敏感操作中使用污染的数据,就必须执行一项模式匹配操作并提取匹配的子字符串,清洁这些数据
4、虽然污染模式机制旨在防止许多类型的漏洞,但只有当开发者使用适当的正则表达式从被污染的输入中提取清洁的数据时它才会有效,如果一个表达式的范围过于宽泛,并提取了使用时可能引起问题的数据,那么污染模式提供的保护就会失效,应用程序仍然易于受到攻击。实际上,污染模式被当做一种提醒机制,它告诉程序员在危险操作中使用输入的数据前,必须对所有输入进行适当确认,它不能保证所实施的输入确认已经足够全面
2.1、简介:
1、由于客户端JavaScrip不需要任何应用程序访问权限即可访问, 因此任何时候都可以执行以安全为中心的代码审查,这类审查的关键在于确定客户端组件中的所有漏洞,如基于DOM的XSS,它们使用户易于受到攻击。审查JavaScript的另一个原因是,这样做有助于了解客户端实施了哪些输入确认,以及动态生成的用户界面的结构
2、当审查JavaScript代码时,必须确保检查.js文件和在HTML内容中嵌入的脚本,需要重点审查的是那些读取基于DOM的数据以及写入或以其他方式修改当前文档的API
document.location
document.URL
document.URLUnencoded
document.referer
windows.location
……
3.1、简介:
1、Web应用程序已不仅仅使用数据库实现数据存储,现在的数据库包含丰富的编程接口,可在数据库层执行大员的业务逻辑,开发者频繁使用数据库代码组件(如存储过程、触发器和用户定义的函数)完成各种关键任务。因此当审查一个Web应用程序的源代码时,必须将数据库中执行的所有逻辑包括在审查范围之内。
2、数据库代码组件中的编程错误可能会导致各种安全漏洞,但现实操作中应当留意两种主要的漏洞。首先数据库组件自身可能包含SQL注入漏洞,其次用户输入可能会以危险的方式提交给潜在危险的函数
3.2、SQL注入
简述:
1、即使在整个Web应用程序代码中正确使用预处理语句,如果数据库代码组件以危险的方式使用用户提交的输入构造查询,SQL注入漏润也依然存在
2、不同的数据库平台使用不同的方法动态执行包含SQL语句的字符串
MS-SQL:EXEC
Oracle:EXECUTE IMMEDIATE
Sybase:EXEC
DB2:EXEC SQL
3、应对出现在数据库代码组件中的这些表达式进行仔细审查,如果将用户提交的输入用于构建SQL字符串,应用程序可能易于受到SQL注入攻击
3.3、调用危险的函数
简述:
1、存储过程之类的定制代码组件常用于执行不常见的或功能强大的操作,如果以不安全的方式向一个潜在危险的函数传送用户提交的数据,那么根据该函数的功能,这样做可能会导致各种类型的漏洞
2、如果以不安全的方式调用, 下面的函数可能造成危险
A、MS-SQL与Sybase中功能强大的存储过程,使用它们可执行命令或访问注册表等
B、用于访问文件系统的函数
C、连接到数据库以外的库的用户定义的函数
D、可访问网络的函数
4.1、简介:
在许多语言中,可以使用某种开发工作室,如Visual Studio、NetBeans或Eclipse,还有各种一般性的代码浏览工具,它们支持各种语言,并且可进行优化,以方便阅读代码,Source Insight是首选的工具,它支持源代码树浏览,拥有强大的搜索功能,使用一个预览框显示与任何选中的表达式有关的上下文信息,并且能够在代码之间快速导航