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

$_SERVER[‘PHP_SELF‘]简介

$_SERVER[‘PHP_SELF‘] 表示当前 PHP文件相对于网站根目录的位置地址,与 document root 相关。

假设我们有如下网址,$_SERVER[‘PHP_SELF‘]得到的结果分别为:

http://www.php-note.com/php/    :   /php/test.php
http://www.php-note.com/php/test.php    :    /php/test.php
http://www.php-note.com/php/test.php?test=foo    :    /php/test.php
http://www.php-note.com/php/test.php/test/foo    :    /php/test.php/test/foo

因此,可以使用 $_SERVER[‘PHP_SELF‘] 很方便的获取当前页面的地址:

$url = "http://". $_SERVER[‘HTTP_HOST‘] . $_SERVER[‘PHP_SELF‘];

上面是简单获取 http 协议的当前页面 URL ,只是要注意该地址是不包含 URL 中请求的参数(?及后面的字串)的。如果希望得到包含请求参数的完整 URL 地址,请使用 $_SERVER[‘REQUEST_URI‘] 。

PHP $_SERVER[‘PHP_SELF‘] 安全性

由于利用 $_SERVER[‘PHP_SELF‘] 可以很方便的获取当前页面地址,因此一些程序员在提交表单数据到当前页面进行处理时,往往喜欢使用如下这种方式:

<form method="post" action="<?php echo $_SERVER[‘PHP_SELF‘]; ?>">

假设该页面地址为:

http://www.php-note.com/php/test.php

访问该页面,得到的表单 html 代码如下:

<form method="post" action="/php/test.php">

这段代码是正确的,但是当访问地址变成:

http://www.php-note.com/php/test.php/test/foo /a=1

页面正常执行了,表单 html 代码变成:

<form method="post" action="/php/test.php/test/foo/a=1">

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

http://…/test.php/%22%3E%3Cscript%3Ealert(’xss’)%3C/script%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代码中执行,简单一点说,就是“<”会变成“&lt;”,变成无害的了。

2、REQUEST_URI

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

$_SERVER[”REQUEST_URI”]    :   /fwolf/temp/test.php/%22%3E%3Cscript%3Ealert(’xss’)%3C/script%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变量也许也会有类似的漏洞,比如SCRIPT_URI、 SCRIPT_URL、 QUERY_STRING、PATH_INFO、PATH_TRANSLATED等等,在使用他们之前一定要先作htmlentities之类的。

延伸阅读:

$_SERVER["SCRIPT_NAME"]、$_SERVER["PHP_SELF"]、$_SERVER["QUERY_STRING"]、$_SERVER["REQUEST_URI"]

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

时间: 2024-10-21 21:08:59

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

PHP通用的XSS攻击过滤函数,Discuz系统中 防止XSS漏洞攻击,过滤HTML危险标签属性的PHP函数

XSS攻击在最近很是流行,往往在某段代码里一不小心就会被人放上XSS攻击的代码,看到国外有人写上了函数,咱也偷偷懒,悄悄的贴上来... 原文如下: The goal of this function is to be a generic function that can be used to parse almost any input and render it XSS safe. For more information on actual XSS attacks, check out h

从零学习安全测试,从XSS漏洞攻击和防御开始

WeTest 导读 本篇包含了XSS漏洞攻击及防御详细介绍,包括漏洞基础.XSS基础.编码基础.XSS Payload.XSS攻击防御. 第一部分:漏洞攻防基础知识   XSS属于漏洞攻防,我们要研究它就要了解这个领域的一些行话,这样才好沟通交流.同时我建立了一个简易的攻击模型用于XSS漏洞学习. 1. 漏洞术语 了解一些简单术语就好. VUL Vulnerability漏洞,指能对系统造成损坏或能借之攻击系统的Bug. POC Proof of Concept,漏洞证明:可以是可以证明漏洞存在

解决反射型XSS漏洞攻击

对于程序员来说安全防御,无非从两个方面考虑,要么前端要么后台. 一.首先从前端考虑过滤一些非法字符. 前端的主控js中,在<textarea> 输入框标签中,找到点击发送按钮后,追加到聊天panel前 进行过滤Input输入内容 1 // 过滤XSS反射型漏洞 2 filterInputTxt: function (html) { 3 html = html.replace(/(.*<[^>]+>.*)/g,""); // HTML标记 4 html =

新浪微博的XSS漏洞攻击过程详解

今天晚上(2011年6月28日),新浪微博出现了一次比较大的XSS攻击事件.大量用户自动发送诸如:“郭美美事件的一些未注意到的细节”,“建 党大业中穿帮的地方”,“让女人心动的100句诗歌”,“3D肉团团高清普通话版种子”,“这是传说中的神仙眷侣啊”,“惊爆!范冰冰艳照真流出了”等等 微博和私信,并自动关注一位名为hellosamy的用户. 事件的经过线索如下: 20:14,开始有大量带V的认证用户中招转发蠕虫 20:30,2kt.cn中的病毒页面无法访问 20:32,新浪微博中hellosam

XSS漏洞攻击原理与解决办法

转自:http://www.frostsky.com/2011/10/xss-hack/ 对于的用户输入中出现XSS漏洞的问题,主要是由于开发人员对XSS了解不足,安全的意识不够造成的.现在让我们来普及一下XSS的一些常识,以后在开发的时候,每当有用户输入的内容时,都要加倍小心.请记住两条原则:过滤输入和转义输出. 一.什么是XSS XSS又叫CSS (Cross Site Script) ,跨站脚本攻击.它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里

$_SERVER[&quot;SCRIPT_NAME&quot;]、$_SERVER[&quot;PHP_SELF&quot;]、$_SERVER[&quot;QUERY_STRING&quot;]、$_SERVER[&quot;REQUEST_URI&quot;]

1.$_SERVER["SCRIPT_NAME"] 说明:包含当前脚本的路径 2.$_SERVER["PHP_SELF"] 说明:当前正在执行脚本的文件名 3.$_SERVER["QUERY_STRING"] 说明:查询(query)的字符串 4.$_SERVER["REQUEST_URI"] 说明:访问此页面所需的URI 实例: 1.http://blog.snsgou.com/ (直接打开主页) 结果: $_SERVER[

Java Web开发 - 持久型/存储型XSS漏洞

1.什么是XSS漏洞攻击? XSS是跨站脚本攻击(Cross Site Scripting)的简称,之所以叫XSS而不是CSS相比大家都能明白了吧,那就是为了跟层叠样式表(Cascading Style Sheets,CSS)区别. 2.XSS漏洞攻击的原理 恶意攻击者往web页面中插入恶意HTML代码,当用户浏览该web页面时,嵌入到该web页面的恶意HTML代码就会被执行,从而达到恶意攻击用户的特殊目的. XSS漏洞又分为两类,一类是持久型/存储型XSS,另一类是反射型XSS: 1)持久型/

快速、直接的XSS漏洞检测爬虫 – XSScrapy

XSScrapy是一个快速.直接的XSS漏洞检测爬虫,你只需要一个URL,它便可以帮助你发现XSS跨站脚本漏洞. XSScrapy的XSS漏洞攻击测试向量将会覆盖 Http头中的Referer字段 User-Agent字段 Cookie 表单(包括隐藏表单) URL参数 RUL末尾,如 www.example.com/<script>alert(1)</script> 跳转型XSS 因为Scrapy并不是一个浏览器,所以对AJAX无能为力,我将会在未来努力实现这些功能,尽管并不容易

PHP漏洞全解(四)-xss跨站脚本攻击

本文主要介绍针对PHP网站的xss跨站脚本攻击.跨站脚本攻击是通过在网页中加入恶意代码,当访问者浏览网页时恶意代码会被执行或者通过给管理员发信息 的方式诱使管理员浏览,从而获得管理员权限,控制整个网站.攻击者利用跨站请求伪造能够轻松地强迫用户的浏览器发出非故意的HTTP请求,如诈骗性的电汇 请求.修改口令和下载非法的内容等请求. XSS(Cross Site Scripting),意为跨网站脚本攻击,为了和样式表css(Cascading Style Sheet)区别,缩写为XSS 跨站脚本主要