1、许多时候,开发者直接向服务器发送操作系统指令,但如果应用程序向操作系统发送用户输入指令,可能受到命令注入攻击。通常所有的注入命令都可在Web服务器的进程中安全运行,使得攻击者能够完全控制整个服务器。
1、下面Perl代码功能是允许管理员在服务器上指定一个目录,并查看他的磁盘使用情况。
用户输入的dir作为参数传入,但易被攻击者利用。
1、下一段C#代码功能是允许管理员查看被请求的目录的内容。
1、许多Web脚本语言支持动态执行在运行时生成的代码。允许开发者创建可根据各种数据和条件动态修改其代码的应用程序。
1、在应用程序解析过程中,调用外部程序或访问文件系统,应该能确定Web应用程序与基础操作系统交互的情形,攻击者探查所有这些功能,寻找命令注入漏洞。
2、不同命令揭示其处理shell元字符的方式不相同,有两种类型的元字符,可用于在一个现有的预先设定的命令中注入一个独立的命令。
①字符,| & 和换行符,可用于将几个命令连接在一起。
②反引号(`)用于独立的命令包含在最初的命令处理的数据中。
1、动态执行漏洞最常见PHP和Perl等语言,但任何应用平台都可能会向基于脚本的解释器传送用户提交的输入。
1、防止OS命令注入最佳方式是完全避免直接调用操作系统命令,Web应用程序执行每个任务都可用内置API完成,攻击者不能控制内置API,所以安全。若无法避免,可用一个白名单限制用户只输入一组特殊的值,或限制输入字符范围。
1、防止此漏洞最佳方法是避免将用户提交的输入或者来自用户的数据传送给任何动态执行或包含函数。
1、若应用程序使用用户可控制的数据、以危险的方式访问位于应用程序服务器或其他后端文件系统中的文件或牡蛎,就会出现路径遍历漏洞。通过提交设计的输入,攻击者就可以读改任意内容。
2、用户可以输入“..\”来回溯到上一级目录
3、查找和利用路径遍历漏洞
4、防止路径遍历漏洞
1、避免向任何文件系统API传送用户提交的数据是防止路径遍历漏洞的最有效的方法。
1、许多脚本语言使用包含文件include file 。允许开发者把可重复使用的代码插入到单个文件中。
2、远程文件包含:PHP语言易出现此漏洞,因为它的包含函数接受远程文件路径。
3、本地文件包含:有时应用程序根据用户可控制的数据加载包含文件,但这是不可能给位于外部服务器上的文件指定URL。
4、查找文件包含漏洞:任何用户提交的数据项都包含此漏洞。
1、客户端常使用XML向服务器端传送数据,服务器端有时也用XML文件返回数据给客户端。
1、SOAP是一种使用XML格式封装数据、基于消息的通信技术。
1、SOAP注入较难实现,因为随意提交XML元字符会破坏SOAP消息的格式,而且生成的错误也很简单。使用下面步骤检索出此漏洞。
1、在用户提交的数据被注入SOAP消息中的任何位置实施边界确认过滤,用以防止SOAP注入。以下是经常造成问题的HTML编码字符。
1、若应用程序接受用户可控制的输入,并将其合并到适用后端HTTP请求检索的URL中,这种行为就会导致服务器端重定向漏洞,用户输入可能包含被检索的完整URL,或者应用程序可能会对该URL进行某种处理,如添加标准的后缀。
1、若用户提交的参数被用作后端HTTP请求中的参数,就会导致HTTP参数注入。
2、HTTP参数污染:若请求中包含多个同名请求,以下是一些常见的处理方式
3、攻击URL转换:
1、用户可指定发件人地址和邮件的内容,应用程序将这个输入传送给PHPmail()命令,由他建立邮件并与其他配置的邮件服务器进行必要的SMTP会话。
1、有时应用程序可能会执行SMTP会话,或者将用户提交的输入传送给一个不同的组件完成这一任务,这时,可以直接在这个会话中注入任意SMTP命令,完全控制由应用程序生成的消息。
1、为了有效探查应用程序的邮件功能,需要测试每一个提交给与电子邮件有关的功能的参数,甚至那些最初可能生成的消息无关的参数。
1、根据一个适当的正则表达式检查电子邮件地址。
2、消息主题不得包含任何换行符,并应实施适当的长度限制。
1、某网络设备提供用于执行设备配置的Web界面。为什么这种功能通常易于受到操作系统命令注入攻击?
答:用于配置网络设备的应用程序通常包含使用正常的Web脚本API无法轻松实现的功能,如用于重新启动设备、循环访问日志文件或重新配置SNMP的功能。通常,使用一行操作系统命令可以轻松执行这些任务。因此,许多时候,应用程序开发者通过将相关用户输入直接合并到shell命令字符串中来实现这些功能。
2、在测试以下URL时:
http://wahh-app.com/home/statsmgr.aspx?country=US
将country参数的值更改为foo导致了以下错误消息:
Could not open file: D:\app\default\home\logs\foo.log (invalid file).
可以采取哪些步骤对应用程序实施攻击?
答:应用程序似乎将用户提交的输入合并到用于文件系统操作的文件路径中,并且可以通过提交专门设计的输入来访问服务器上的任意文件。因此,应尝试使用../遍历序列访问不同的目录。由于.log将被附加到输入之后,因此应尝试使用NULL字节终止文件名。请注意,出现在错误消息中的home目录可能与出现在URL中的home目录为同一目录,这为Web根目录中的项目的位置提供了线索。
3. 在对一个在POST请求中以XML格式传送数据的应用程序进行测试时,可以利用哪种漏洞从服务器的文件系统中读取任意文件?要成功实施攻击,必须满足哪些先决条件?
答:应用程序可能易于受到XML外部实体(XXE)注入。检索任意文件的内容的先决条件如下:
(a) 应用程序使用的XML解释器必须支持外部实体;
(b) 应用程序必须在其响应中回显请求中的XML元素的内容。
4、向ASP.NET平台上运行的应用程序提出以下请求:
POST /home.aspx?p=urlparam1&p=urlparam2 HTTP/1.1
Host: wahh-app.com
Cookie: p=cookieparam
Content-Type: application/x-www-form-urlencoded
Content-Length: 15
p=bodyparam
应用程序执行以下代码:
String param = Request.Params[“p”];
请问param变量的值是什么?
答:param变量的值为urlparam1,urlparam2,bodyparam,cookieparam。
5、HPP是HPI的前提,还是HPI是HPP的前提?
答:严格来说,这两种攻击都不是对方的前提。
虽然HPI攻击通常包含HPP,但这不是必须的。例如,HPI攻击可能会将某个全新的参数注入到后端请求中,以干扰应用程序的处理过程。但这种类型的攻击并不依赖于应用程序在处理多个同名参数时表现的任何特殊行为。
通常,HPP攻击可以不包括HPI,特别是在对用户输入执行多层处理的情况下。例如,一些针对Internet Explorer XSS过滤器的攻击使用HPP技巧,但并不在后端请求中注入任何参数。
6、某应用程序包含一项功能,该功能向外部域提出请求,并返回这些请求的响应。为防止服务器端重定向攻击检索应用程序自己的Web服务器上的受保护资源,应用程序阻止了以localhost或127.0.0.1为目标的请求。如何突破这种防御,以访问服务器上的资源?
答:服务器的回环IP地址有许多备选表示形式,可将其用于避开应用程序的过滤。例如:
(a) 127.1
(b) 127.000.0.1
(c) 127.0.0.0 A类子网中的任何其他地址
(d) 这些表示形式的二进制或八进制变体,如017700000001
7、某应用程序使用一项用于用户提交反馈的功能。该功能允许用户提交他们的电子邮件地址、邮件主题及详细的反馈。然后,应用程序以用户提交的主题和反馈为邮件正文,从用户的电子邮件地址向[email protected]发送一封电子邮件。以下哪一种方法能够有效防御邮件注入攻击?
(a) 在邮件服务器上禁用邮件中继。
(b) 使用[email protected]硬编码RCPT TO字段。
(c) 确保用户提交的输入不包含任何换行符或其他SMTP元字符。
答:针对此应用程序功能的邮件注入攻击不需要邮件服务器支持邮件中继。如果其他邮件标头包含用户可控制的输入,硬编码RCPT TO字段也无法防范邮件注入,因为攻击者可以使用另一个RCPT TO行注入另一个收件人。在这种情况下,最有效的防御是严格确认所有用户提交的输入,以确保其中不包含任何转行符或其他SMTP元字符。