如何对PHP程序中的常见漏洞进行攻击(下)

2016-01-29 14:57 5 1 收藏

如何对PHP程序中的常见漏洞进行攻击(下),如何对PHP程序中的常见漏洞进行攻击(下)

【 tulaoshi.com - PHP 】

  如何对PHP程序中的常见漏洞进行攻击(下)
翻译:analysist(分析家)
来源:http://www.china4lert.org

如何对PHP程序中的常见漏洞进行攻击(下)

原著:Shaun Clowes <http://www.securereality.com.au/
翻译:analysist <http://www.nsfocus.com/

[库文件]
正如我们前面讨论的那样,include()和require()主要是为了支持代码库,因为我们一般是把一些经常使用的函数放到一个独立的文件中,这个独立的文件就是代码库,当需要使用其中的函数时,我们只要把这个代码库包含到当前的文件中就可以了。

最初,人们开发和发布PHP程序的时候,为了区别代码库和主程序代码,一般是为代码库文件设置一个“.inc”的扩展名,但是他们很快发现这是一个错误,因为这样的文件无法被PHP解释器正确解析为PHP代码。如果我们直接请求服务器上的这种文件时,我们就会得到该文件的源代码,这是因为当把PHP作为Apache的模块使用时,PHP解释器是根据文件的扩展名来决定是否解析为PHP代码的。扩展名是站点管理员指定的,一般是“.php”, “.php3”和“.php4”。如果重要的配置数据被包含在没有合适的扩展名的PHP文件中,那么远程攻击者很容易得到这些信息。

最简单的解决方法就是给每个文件都指定一个PHP文件的扩展名,这样可以很好的防止泄露源代码的问题,但是又产生了新的问题,通过请求这个文件,攻击者可能使本该在上下文环境中运行的代码独立运行,这可能导致前面讨论的全部攻击。

下面是一个很明显的例子:

In main.php:
<?php
  $libDir = "/libdir";
  $langDir = "$libdir/languages";

  ...

  include("$libdir/loadlanguage.php":
?

In libdir/loadlanguage.php:
<?php
  ...

  include("$langDir/$userLang");
?

当“libdir/loadlanguage.php”被“main.php”调用时是相当安全的,但是因为“libdir/loadlanguage”具有“.php”的扩展名,因此远程攻击者可以直接请求这个文件,并且可以任意指定“$langDir”和“$userLang”的值。
[Session文件]
PHP 4或更新的版本提供了对sessions的支持,它的主要作用是在PHP程序中保存页与页之间的状态信息。例如,当一个用户登陆进入网站,他登陆了这个事实以及谁登陆进入这个网站都被保存在session中,当他在网站中到处浏览时,所有的PHP代码都可以获得这些状态信息。

事实上,当一个session启动时(实际上是在配置文件中设置为在第一次请求时自动启动),就会生成一个随机的“session id”,如果远程浏览器总是在发送请求时提交这个“session id”的话,session就会一直保持。这通过Cookie很容易实现,也可以通过在每页提交一个表单变量(包含“session id”)来实现。PHP程序可以用session注册一个特殊的变量,它的值会在每个PHP脚本结束后存在session文件中,也会在每个PHP脚本开始前加载到变量中。下面是一个简单的例子:

<?php
  session_destroy(); // Kill any data currently in the session
  $session_auth = "shaun";
  session_register("session_auth"); // Register $session_auth as a session variable
?

新版本的PHP都会自动把“$session_auth”的值设置为“shaun”,如果它们被修改的话,以后的脚本都会自动接受修改后的值,这对无状态的Web来说的确是种很不错的工具,但是我们也应该小心。

一个很明显的问题就是确保变量的确来自session,例如,给定上面的代码,如果后续的脚本是下面这样的话:

<?php
  if (!empty($session_auth))
   // Grant access to site here
?

上面的代码假定如果“$session_auth”被置位的话,就是从session,而不是从用户输入来置位的,如果攻击者通过表单输入来置位的话,他就可以获得对站点的访问权。注意攻击者必须在session注册该变量之前使用这种攻击方法,一旦变量被放进了session,就会覆盖任何表单输入。

Session数据一般是保存在文件中(位置是可配置的,一般是“/tmp”),文件名一般是类似“sess_<session id”的形式,这个文件包含变量名称,变量类型,变量值和一些其它的数据。在多主机系统中,因为文件是以运行Web服务器的用户身份(一般是nobody)保存的,因此恶意的站点拥有者就可以通过创建一个session文件来获得对其它站点的访问,甚至可以检查session文件中的敏感信息。

Session机制也为攻击者把自己的输入保存在远程系统的文件中提供了另一个方便的地方,对于上面的例子来说,攻击者需要在远程系统放置一个包含PHP代码的文件,如果不能利用文件上载做到的话,他通常会利用session为一个变量按照自己

来源:http://www.tulaoshi.com/n/20160129/1494812.html

延伸阅读
标签: PHP
  本报讯 据PHP组织说,运行PHP的服务器容易受到多种恶意程序攻击,包括允许攻击者执行恶意代码和DoS攻击。 PHP组织发布了修复这些漏洞的升级版本,可以从PHP网站下载或直接从各操作系统厂商获得。PHP组织强烈建议用户升级到新版本。 PHP是一个主要用于服务器端应用的开源编程语言,运行在Linux、Unix、Mac OS和Windows等...
标签: ASP
  我们在使用ASP来编写论坛或者BBS程序的时候,经常会遇到这样的问题,当网友在我的论坛或者BBS上面发表的文章带有HTML代码的时候,如何才能正常的显示这篇带有HTML代码的文章呢?如果在向数据库保存数据的时候或者向浏览器输出显示内容的时候不做任何处理,就会发生麻烦,比如,我发表的一篇文章带有如下的代码: &l...
阿里云邮箱如何对邮箱中的信件进行排序   阿里云邮箱默认是按照邮件的发送日期和时间排列的,最近收到的邮件会排在最上端。如当您点击收件箱时,看到的信件是按照日期排序,并且日期链接旁边会出现一个向下的箭头按钮,这表明信件是按邮件的发送日期和时间的降序排列的。 若您想要文件夹中的邮件按照发件人排序,您直接点击发件...
1.源程序的编译     在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面我们以一个实例来说明如何使用gcc编译器. 假设我们有下面一个非常简单的源程序(hello.c):  int main(int argc,char **argv)   { printf("Hello Linux/n");   } 要编译这个程序,我们只要在命令行下执行: gcc -o h...
标签: PHP
一、 XML简介 XML(可扩展的标注语言)是一种W3C标准,主要用于Web应用程序和服务器之间实现容易的交互、数据的存储与使用。 使用XML标准编码的数据具有能容易被人和计算机解释的意义和结构。XML数据是平台和应用程序独立的。不用多说,这本身就使XML成为适合于互联网的一个理想的数据交换格式(事实上,它正是因这一用途...

经验教程

595

收藏

16
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部