情感天地

(上篇)如何对PHP程序中的常见漏洞进行攻击-PHP安全-PHP教程-幽默笑话

  • 作者:本站
  • 时间:2019-07-11
  • 75人已阅读
您现在的位置:首页 > 情感婚姻 > 文章
简介 很显然,这会显示一个文本框和提交按钮。 当用户点击提交按钮时,“”会处理用户的输入,当“”运行时,“$hello”会包含用户在文本框输入的数据。 从这里我们应该看出,攻击者可以按照

(上篇)如何对PHP程序中的常见漏洞进行攻击-PHP安全-PHP教程-幽默笑话

很显然,这会显示一个文本框和提交按钮。 当用户点击提交按钮时,“”会处理用户的输入,当“”运行时,“$hello”会包含用户在文本框输入的数据。 从这里我们应该看出,攻击者可以按照自己的意愿创建任意的全局变量。 如果攻击者不是通过表单输入来调用“”,而是直接在浏览器地址栏输入http://server/=hi&setup=no,那么,不止是“$hello”被创建,“$setup”也被创建了。 译者注:这两种方法也就是我们通常说的“POST”和“GET”方法。

下面的用户认证代码暴露了PHP的全局变量所导致的安全问题:上面的代码首先检查用户的密码是否为“hello”,如果匹配的话,设置“$auth”为“1”,即通过认证。 之后如果“$suth”为“1”的话,就会显示一些重要信息。 表面看起来是正确的,而且我们中有相当一部分人是这样做的,但是这段代码犯了想当然的错误,它假定“$auth”在没有设置值的时候是空的,却没有想到攻击者可以创建任何全局变量并赋值,通过类似“http://server/=1”的方法,我们完全可以欺骗这段代码,使它相信我们是已经认证过的。

因此,为了提高PHP程序的安全性,我们不能相信任何没有明确定义的变量。 如果程序中的变量很多的话,这可是一项非常艰巨的任务。 一种常用的保护方式就是检查数组HTTP_GET[]或POST_VARS[]中的变量,这依赖于我们的提交方式(GET或POST)。

当PHP配置为打开“track_vars”选项的话(这是缺省值),用户提交的变量就可以在全局变量和上面提到的数组中获得。 但是值得说明的是,PHP有四个不同的数组变量用来处理用户的输入。 HTTP_GET_VARS数组用来处理GET方式提交的变量,HTTP_POST_VARS数组用于处理POST方式提交的变量,HTTP_COOKIE_VARS数组用于处理作为cookie头提交的变量,而对于HTTP_POST_FILES数组(比较新的PHP才提供),则完全是用户用来提交变量的一种可选方式。 用户的一个请求可以很容易的把变量存在这四个数组中,因此一个安全的PHP程序应该检查这四个数组。 [远程文件]PHP是一种具有丰富特性的语言,提供了大量的函数,使编程者实现某个功能很容易。

但是从安全的角度来看,功能越多,要保证它的安全性就越难,远程文件就是说明这个问题的一个很好的例子:");>上面的脚本试图打开文件“$filename”,如果失败就显示错误信息。 很明显,如果我们能够指定“$filename”的话,就能利用这个脚本浏览系统中的任何文件。

但是,这个脚本还存在一个不太明显的特性,那就是它可以从任何其它WEB或FTP站点读取文件。

实际上,PHP的大多数文件处理函数对远程文件的处理是透明的。

例如:如果指定“$filename”为“http://target/scripts/..%c1%1c../winnt/system32//c+dir”则上面的代码实际上是利用主机target上的unicode漏洞,执行了dir命令。 这使得支持远程文件的include(),require(),include_once()和require_once()在上下文环境中变得更有趣。 这些函数主要功能是包含指定文件的内容,并且把它们按照PHP代码解释,主要是用在库文件上。

例如:上例中“$libdir”一般是一个在执行代码前已经设置好的路径,如果攻击者能够使得“$libdir”没有被设置的话,那么他就可以改变这个路径。

但是攻击者并不能做任何事情,因为他们只能在他们指定的路径中访问文件(perl中的“Poisonnullbyte”攻击对PHP没有作用)。

但是由于有了对远程文件的支持,攻击者就可以做任何事情。 例如,攻击者可以在某台服务器上放一个文件,包含如下内容:然后把“$libdir”设置为“http:///”,这样我们就可以在目标主机上执行上面的攻击代码,“/etc”目录的内容作为结果返回到客户的浏览器中。

需要注意的是,攻击服务器(也就是evilhost)应该不能执行PHP代码,否则攻击代码会在攻击服务器,而不是目标服务器执行,如果你想了解具体的技术细节,请参考:http:///[文件上载]PHP自动支持基于RFC1867的文件上载,我们看下面的例子:。

Top