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

 更新时间:2016年11月25日 16:08  点击:1642

现在的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%3Cscript%3Ealert(’xss’)%3C/script%3E%3Cfoo

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

通过这种嵌入js代码的方式,攻击者能 Web 2.0 引入了 Rich Internet Application。但 Rich Internet Application 的含义是什么?通常,它意味着向应用程序中添加具有高度响应能力的交易操作。具体来说,它意味着可以即时更改页面中的小部件、Web 表单和报告,而无需从服务器中检索新页面。

一种用于构建 Rich Internet Application(RIA)的方法就是使用动态 HTML(Dynamic HTML,DHTML),它是 Ajax、Javascrīpt、层叠样式表(Cascading Style Sheet,CSS)和 HTML 的组合(请参阅 参考资料)。但是 DHTML 并不是向 Web 应用程序中添加互动操作的惟一方法。另一种重要方法是使用 Adobe Flash Player,使用它为 Web 站点添加交互操作已经有十年的历史。

第一版的 Flash 曾是用于创建动画图片的工具,而最新版本的 Flash 已经可以托管一个完整的界面,可用于控制 Web 服务访问并使用 ECMAscrīpt(Javascrīpt 的正式版本)来提供完整的脚本支持。

了解 Flash

Flash Player 是集成到运行 Microsoft® Windows®、Mac OS X 和 linux® 的计算机的 Web 浏览器中的一个插件。截至本文完稿时,最新版本的 Flash Player 是 V8。它是可以免费获得的,大多数浏览器都附带安装了此插件。它十分流行并且具有优秀的客户机渗透力 —— 而这种渗透力随着 YouTube 和 Google Video 这类服务的出现得到了提高,这些服务都使用 Flash 显示视频流。

Flash Player 只是天平的一端。要发挥作用,Flash Player 还需要使用一个 Flash 动画。此类动画通常是使用一种 Flash 的开发工具编译的文件,其文件扩展名为 .swf。但正如您将在本文中看到的那样,还可以使用 Ming 库用几乎与动态创建图片相同的方法来动态构建 .swf 文件,并在 Web 服务器上绘制图形。Ming 库利用由 php 代码构建的对象和方法在新的 .swf 文件中构建操作代码。

您可以通过两种方法中的任意一种方法来查看 Web 站点中的 .swf 文件。第一种方法只需导航到 .swf 文件的 URL。这样做将把 Web 服务器的整个内容区域替换为 Flash 动画。此方法便于进行调试,但主要的用法还是将动画嵌入到 HTML Web 页面的 <object> 标记中。该 <object> 标记然后再通过 URL 引用 SWF 动画。<object> 方法的优点在于您可以把动画放在页面的任意位置,并可通过 Javascrīpt 代码进行动态控制,就像处理页面中的任何其他元素一样。

清单 1 显示的是一个引用 SWF 动画的 <object> 标记的示例。


清单 1. 嵌入式 Flash 动画

   
<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#
        version=6,0,40,0"
WIDTH="550" HEIGHT="400">
<PARAM NAME="movie" VALUE="lines.swf">
<EMBED src="lines.swf" WIDTH="550" HEIGHT="400"
TYPE="application/x-shockwave-flash"
PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer">
</EMBED>
</OBJECT>


这组标记将引用一个名为 lines.swf 的动画。

<?php
/**
     * 去除魔术变换 
      
*/ 
class killMagicQuote
{
    
public function Strip_Magic_Slashes($varImp)
    {
        
$varImp =  is_array($varImp)?
        
array_map(array($this,''Strip_Magic_Slashes''), $varImp: #将数组中所有值进行 函数操作.
        stripslashes($varImp);
        
return $varImp;
    }
    
/**
     * 去除 $_GET $_POST $_REQUEST  内魔术符号.
     
*/
    
public function Magic_Quotes_Off()
    {
        
if (get_magic_quotes_gpc())
        {
            
$_GET     = $this->Strip_Magic_Slashes($_GET);
            
$_POST    = $this->Strip_Magic_Slashes($_POST);
            
$_REQUEST = $this->Strip_Magic_Slashes($_REQUEST);
        }
    }
}
?>

 相信很多人都碰到过与magic_quotes有关的问题.
上面给出的代码是我学习别人的(不是抄:)
OpenPNE里的东西(小日本的开源SNS).

http://topic.111cn.net/u/20071121/16/38131933-f2de-4ed4-9f9d-ef7047f3d2ae.html



<

<?php 
/**
 * session处理器 
 * memcache 实现
 * @author MoXie SysTem128@GMail.Com 
 
*/ 
class SessionHandler extends Memcache
{
    
public $_sessionId;             # session 编号
    public $_sessionExpire;         # session 过期时间
    public $_sessionIsQuery;
    
public function __construct()
    {
        
$this->_sessionExpire = 600;
        
$this->connect(''localhost'',11211);
    }
    
/**
     * 获取所有定位字段 
     * 
     
*/ 

    
/**
   * 读取 Session 
   * 
   * @return unknown 
   
*/ 
    
public function getSession($snKey)
    {
        
$returnInfo = $this->get($snKey);
        
$this->_sessionIsQuery = (bool)$returnInfo;
        
return $returnInfo;
    }
    
/**
   *  插入新的Session 
   
*/ 
    
public function insertSession($snKey,$value)
    {
        
return $this->set($snKey,$value,0,$this->_sessionExpire);
    }
    
/**
   * 更新session信息 
   * 
   * @return unknown 
   
*/ 
    
public function updateSession($snKey,$value)
    {
        
# 修改语句
        return  $this->set($snKey,$value,0,$this->_sessionExpire);
    }
    
/**
   * 删除Session 
   * 
   * @return unknown 
   
*/ 
    
public function delSession($snKey)
    {
        
return $this->delete($snKey,0);
    }
    
/**
   * 删除过期 Session 
   * 
   * @return unknown 
   
*/ 
    
public function expireSession()
    {
        
return true;
    }
    
/**
   * session 启动器 
   * 
   
*/ 

    
public function on_session_start()
    {
        
$this->_sessionSite = 1;
        
$this->_sessionId = session_id();
        
return true;
    }
    
/**
   * session 终止 
   
*/ 
    
public function on_session_end()
    {
        
return $this->expireSession();
    }
    
/**
   * 读取方法 
   * 
   * @param unknown_type $key 
   
*/ 
    
public function on_session_read($key)
    {
        
return $this->getSession($key);
    }
    
/**
   * 写入方法 
   * 
   * @param unknown_type $key 
   * @param unknown_type $value 
   
*/ 
    
public function on_session_write($key,$value)
    {
        
$this->getSession($key);
        
if ($this->_sessionIsQuery)
        {
            
$this->updateSession($key,$value);
        }
else{
            
$this->insertSession($key,$value);
        }
        
return true;
    }
    
/**
   * 销毁方法 
   * 
   * @param unknown_type $key 
   
*/ 
    
public function on_session_destroy($key)
    {
        
return $this->delSession();
    }
    
/**
   * 过期方法 
   * 
   * @param integer $maxLifeTime 
   
*/ 
    
public function on_session_gc($maxLifeTime)
    {
        
return $this->expireSession();
    }
}

$sessionHandler = new SessionHandler();
session_set_save_handler(
array(&$sessionHandler,''on_session_start''),
array(&$sessionHandler,''on_session_end''),
array(&$sessionHandler,''on_session_read''),
array(&$sessionHandler,''on_session_write''),
array(&$sessionHandler,''on_session_destroy''),
array(&$sessionHandler,''on_session_gc'')
);
unregister_tick_function(''session_write_close'');

session_start();
//$_SESSION[''MoXie''] = ''Wonderfull!'';
//$_SESSION[''SysTem128''] = ''Wonderfull!'';
//session_unregister(''MoXie'');

print_r($_SESSION);
?>  

http://topic.111cn.net/u/20071202/16/e53996de-4725-4dfa-bf14-c197afeed93c.html

 

 



<?php
class engage
{
    
public function getArray()
    {
        
$arr1 = array (
        
''0'' => array (''fid'' => 1, ''tid'' => 1, ''name'' => ''Name1'' ),
        
''1'' => array (''fid'' => 1, ''tid'' => 2 , ''name'' => ''Name2'' ),
        
''2'' => array (''fid'' => 1, ''tid'' => 5 , ''name'' => ''Name3'' ),
        
''3'' => array (''fid'' => 1, ''tid'' => 7 , ''name'' => ''Name4'' ),
        
''4'' => array (''fid'' => 3, ''tid'' => 9, ''name'' => ''Name5'' )
        );
        
$arr2 = array();
        
foreach ($arr1 as $key => $value)
        {
            
$arr2[$value[''fid'']][] = array(''tid'' => $value[''tid''],''name'' => $value[''name'']);
        }
        
return $arr2;
    }
    
//print_r($arr2);
    //$eString = ''open_door'';

    public function getString($eString = null)
    {
        
$eString = explode(''_'',$eString);
        
$eString = array_map("ucfirst",$eString);
        
$eString = implode($eString,'''');
        
return  $eString;
    }
    
/**
     * 冒泡排序 
     * @return unknown
     
*/
    
public function getBubble()
    {
        
$isOver = false;
        
$bubbleArray =  array(10,2,36,14,10,25,23,85,99,45);
        
$bubbleResult = $bubbleArray;
        
do{
            
$bubbleArray = $bubbleResult;
            
$isOver = true;
            
foreach ($bubbleArray as $key => $value)
            {
                
if ($value < $bubbleResult[$key-1])
                {
                    
$bubbleResult[$key]=$bubbleResult[$key-1];
                    
$bubbleResult[$key-1]=$value;
                    
$isOver = false;
                }
            }
        }
while (!$isOver);
        
return $bubbleResult;
    }

}
$engage = new engage();
print_r($engage->getArray());
echo $engage->getString(''make_by_id'');
print_r($engage->getBubble());
?>
</pre>

 

 



<?php
/**
 * 第二题正则替换实现.
 *
 
*/
function getString($eString = null)

    
$eString = preg_replace(array("/(^[a-z]{1}|_[a-z]{1})/e",''/_/''),
                            
array("strtoupper(''1'')",''''),
                            
$eString);
    
return  $eString;
}
?>


<
[!--infotagslink--]

相关文章