$_SERVER[’PHP_SELF’]跨站脚本攻击

原创 2007年09月13日 09:34:00

  现在的web服务器和开发工具虽然不会再出现像asp的%81那样明显的漏洞了,但是由于开发人员的疏忽和各种语言特性组合造成的一些奇异的漏 洞仍然会存在。今天偶然读到的XSS Woes,就详细讲述了和$_SERVER[’PHP_SELF’]相关的一个危险漏洞。

  $_SERVER[’PHP_SELF’]在开发的时候常会用到,一般用来引用当前网页地址,并且它是系统自动生成的全局变量,也会有什么问题么?让我们先看看下面的代码吧:

     

<form action=”<?php echo $_SERVER[’PHP_SELF’]; ?>”>
<input type=”submit” name=”submit” value=”submit” />
</form>

  这段代码非常简单,我们想用$_SERVER[’PHP_SELF’]来让网页提交时提交到它自己,假设代码文件名为test.php,在执行的时候就一定会得到我们期望的地址么?首先试试地址http://…/test.php,结果当然是没有问题的啦,别着急,你再访问一下http://…/test.php/a=1,将会得到如下客户端代码:

<form action=”/fwolf/temp/test.php/a=1″>
<input type=”submit” name=”submit” value=”submit” />
</form>

      显然,这已经超出了我们的期望,web服务器居然没有产生诸如404之类的错误,页面正常执行了,并且在生成的html代码中居然有用户可以输入的部分,恐怖的地方就在这里。别小看那个“a=1”,如果把它换成一段js代码,就显得更危险了,比如这么调用:

  http://…/test.php/%22%3E%3Cscrīpt%3Ealert(’xss’)%3C/scrīpt%3E%3Cfoo

  是不是看到了js的alert函数执行的效果?检查一下生成的html源代码找找原因吧。

  通过这种嵌入js代码的方式,攻击者能夠获得512~4k的代码空间,甚至还可以连接外部网站的js代码或者通过image调用来伪装js代码 的方式,那样js代码的长度就不受限制了,然后通过js,他们可以轻松的获取用户的cookie,或者更改当前页面的任何内容,比如更改表单提交的目的 地,更改显示的内容(比如给一个链接地址增加一个onclick=…的属性,这样用户点击的时候就会执行攻击者指定的代码,甚至连接到并非此链接地址本身的网站),甚至作出一个ajax效果来也不一定,总之,不要忽视js的威力。

  那么,再来看看这个漏洞产生的原理,首先test.php/….这种调用是web服务器允许的,很多cms系统,比如我以前用过的plog,好 像也是采用这种方式,在服务器不支持rewrite的情况下实现诸如http://…/index.php/archive/999这样的固定网址的(我 以前还以为是对404错误页下的手),所以带“/”的地址无法从web服务器上禁止。然后再看看php中 对$_SERVER[’PHP_SELF’]的识别,他就是一个包含当前网址值的全局变量,天知道用户会输入什么样的网站,在上面的例子中是恶意的,可是 在wikipedia这样的网站上,却又是可以正常使用这种方式的地址的。所以,最终的结论要落在开发人员身上了,没有很好的处理与用户交互的数据。

  从安全角度来讲,在开发应用尤其是web应用的时候,所有用户提交的数据都是不安全的,这是基本原则,所以我们才不厌其烦的又是客户端验证又是 服务端验证。从上面说的这个安全漏洞来讲,不安全的内容中又要增加“网址”一条了。要解决$_SERVER[’PHP_SELF’]的安全隐患,主要有以 下2种方式:

  1、htmlentities

  用htmlentities($_SERVER[’PHP_SELF’])来替代简单的$_SERVER[’PHP_SELF’],这样即使网 址中包含恶意代码,也会被“转换”为用于显示的html代码,而不是被直接嵌入html代码中执行,简单一点说,就是“<”会变成“<”,变 成无害的了。

  2、REQUEST_URI

  用$_SERVER[’REQUEST_URI’]来替代$_SERVER[’PHP_SELF’],在phpinfo()中可以看到这两个变量的区别:

_SERVER[”REQUEST_URI”] /fwolf/temp/test.php/%22%3E%3Cscrīpt%3Ealert(’xss’)%3C/scrīpt%3E%3Cfoo
_SERVER[”PHP_SELF”] /fwolf/temp/test.php/”> 

  $_SERVER[’REQUEST_URI’]会原封不动的反映网址本身,网址中如果有%3C,那么你得到的也将会是%3C,而$ _SERVER[’PHP_SELF’]会对网址进行一次urldecode操作,网址中的%3C将会变成字符“<”,所以就产生了漏洞。需要注意 的是,在很多情况下,浏览器会对用户输入要提交给web服务器的内容进行encode,然后服务器端程序会自动进行decode,得到相应的原指,在我们 进行post或者get操作的时候都是这样。

  另外还有两点需要指出,第一是这种写法虽然没有直接用到$_SERVER[’PHP_SELF’],但实际效果却是一样的,只是发生的时间错后 到了用户提交之后的下一个页面,所以,form的action还是不要留空的好。第二点,除了PHP_SELF之外,其他的$_SERVER变量也许也会 有类似的漏洞,比如scrīpt_URI, scrīpt_URL, QUERY_STRING, PATH_INFO, PATH_TRANSLATED等等,在使用他们之前一定要先作htmlentities之类的转换。

 

PHP $_SERVER[’PHP_SELF’]

REQUEST_URI 返回的是包括后面数据串的地址,如 index.php?str=1234 PHP_SELF 是 index.php -------------------------------...
  • flyhawk007blog
  • flyhawk007blog
  • 2008年06月02日 09:53
  • 33582

$_SERVER[’PHP_SELF’]的跨站脚本攻击

现在的web服务器和开发工具虽然不会再出现像asp的%81那样明显的漏洞了,但是由于开发人员的疏忽和各种语言特性组合造成的一些奇异的漏洞仍然会存在。今天偶然读到的XSS Woes,就详细讲述了和$_...
  • phphot
  • phphot
  • 2007年12月12日 11:23
  • 691

单入口框架使用$_SERVER['PHP_SELF']遇到的问题

在单入口框架中(只用一个文件来处理所有的http请求的框架)例如wordpress系统,$_SERVER['PHP_SELF'] 获取的文件地址是最先调用代码的那个文件,比如存在这样的调用顺序 ->i...
  • old_imp
  • old_imp
  • 2012年12月11日 14:21
  • 1116

$_SERVER['PHP_SELF']漏洞知多少

$_SERVER['PHP_SELF']是PHP语言中的“服务器端系统变量”,它的值是“当前php文件相对于网站根目录的位置地址”。举例说明,如果在http://www.shuihan.com/out...
  • load_life
  • load_life
  • 2012年06月18日 21:40
  • 1705

PHP如何避免 $_SERVER["PHP_SELF"] 被黑客利用

$_SERVER["PHP_SELF"]是超级全局变量,返回当前正在执行脚本的文件名,与 document root相关。 当黑客使用跨网站脚本的HTTP链接来攻击时,$_SERVER["P...
  • txqd1989
  • txqd1989
  • 2017年06月16日 10:16
  • 310

PHP的$_SERVER['PHP_SELF']造成的XSS漏洞攻击及其解决方案

原文地址 http://www.cnblogs.com/52php/p/5670068.html $_SERVER['PHP_SELF']简介 $_SERVER['PHP_SELF'] 表...
  • qq_16877261
  • qq_16877261
  • 2016年08月18日 11:23
  • 936

__FILE__和$_SERVER["PHP_SELF"]的区别

__FILE__:a文件include b文件,在b文件中echo __FILE__,显示的是b的路径 $_SERVER["PHP_SELF"]:a文件include b文件,在b文件中echo $...
  • daijiguo
  • daijiguo
  • 2016年03月09日 10:17
  • 403

php中include,require的文件包含问题,以及$_SERVER['PHP_SELF']和__FILE__的区别

include,require的文件包含是以当前工作目录寻找,也就是把当前文件作为参照. 例如 文件的多层包含问题就会容易出错。 eg: “smarty_test/system/system....
  • kbx8916
  • kbx8916
  • 2016年11月30日 16:16
  • 231

$_SERVER['PHP_SELF']、$_SERVER['SCRIPT_NAME'] 与 $_SERVER['REQUEST_URI'] 三者的区别

$_SERVER['PHP_SELF']、$_SERVER['SCRIPT_NAME'] 与 $_SERVER['REQUEST_URI']三者的区别$_SERVER['PHP_SELF']、$_SE...
  • qq_26291823
  • qq_26291823
  • 2016年07月17日 11:12
  • 2281

跨站脚本攻击(XSS)——常见网站攻击手段原理与防御

主要是依靠一切可能的手段,将浏览器中可以执行的脚本(javascript)植入到页面代码中,从而对用户客户端实施攻击。这才是我认为在目前这个“大前端时代”xss攻击的定义。 实际上黑客攻击这种行为从本...
  • guugle2010
  • guugle2010
  • 2016年04月10日 01:09
  • 2441
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:$_SERVER[’PHP_SELF’]跨站脚本攻击
举报原因:
原因补充:

(最多只允许输入30个字)