$_SERVER[’PHP_SELF’]的跨站脚本攻击
现在的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;
}
?>
相关文章
- 本文为那些对学习 Windows PowerShell 命令行和脚本编写环境感兴趣的系统管理员提供了资源。也请告诉我们本网站如何才能对您更有用处。...2020-06-30
- 这篇文章主要介绍了Shell脚本中让进程休眠的方法,本文讲解的就是sleep的用法,可以实现睡觉若干秒、若干分钟、若干小时,需要的朋友可以参考下...2020-07-11
SQL Server中row_number函数的常见用法示例详解
这篇文章主要给大家介绍了关于SQL Server中row_number函数的常见用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08- 本文详细讲解了SQLServer中执行动态SQL的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2022-05-19
- 这篇文章主要介绍了C#查询SqlServer数据库并返回单个值的方法,涉及C#操作SQLServer数据库查询的相关技巧,需要的朋友可以参考下...2020-06-25
JavaScript 实现自己的安卓手机自动化工具脚本(推荐)
这篇文章主要介绍了 JavaScript 实现自己的安卓手机自动化工具脚本,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-05-14SQL Server免费版的安装以及使用SQL Server Management Studio(SSMS)连接数据库的图文方法
这篇文章主要介绍了SQL Server免费版的安装以及使用SQL Server Management Studio(SSMS)连接数据库的图文方法,需要的朋友可以参考下...2020-07-11- 这篇文章主要介绍了自动设置安卓手机wifi代理的PowerShell脚本,帮助大家进行抓包测试,感兴趣的朋友可以了解下...2020-10-17
C#实现Excel表数据导入Sql Server数据库中的方法
这篇文章主要介绍了C#实现Excel表数据导入Sql Server数据库中的方法,结合实例形式详细分析了C#读取Excel表数据及导入Sql Server数据库的具体操作步骤与相关操作技巧,需要的朋友可以参考下...2020-06-25SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 WIN-8IVSNAQS8T7\Administrator 的信息
SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 'WIN-8IVSNAQS8T7\Administrator' 的信息,错误代码 0x534。 [SQLSTATE 42000] (ConnIsLoginSysAdmin)...2021-07-15- 这篇文章主要介绍了C#连接到sql server2008数据库的实例代码,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了C#编程实现连接SQL SERVER数据库的方法,以实例形式较为详细的分析了C#连接SQL SERVER数据库的相关步骤与具体实现技巧,需要的朋友可以参考下...2020-06-25
- 这篇文章主要给大家介绍了关于SQL SERVER迁移之更换磁盘文件夹的完整步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
- 这篇文章主要介绍了CentOS8安装SQLServer2019的步骤,本文通过命令实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
- 本文将基于三大范式原则,结合具体的实例做简要分析,对SqlServer 数据库 三大 范式相关知识感兴趣的朋友一起看看吧...2020-07-11
- 这篇文章主要给大家介绍了关于sql server日志处理不当造成的隐患的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用sql server具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-07-11
- 这篇文章主要给大家介绍了kali的局域网攻击,小编觉得这篇文章还是不错的,使用起来也是非常方便的,需要的朋友可以参考下...2021-08-20
- 这篇文章主要介绍了SQL server 自增ID--序号自动增加的字段操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-08
apache http server遇到了一个问题,需要关闭
重装系统后,重新安装了xamp,最近启动的时候经常报apache http server遇到了一个问题,需要关闭,显示如图: 解决方法:查看szModName报错的模块,然后把PHP安装目录下对应的模块...2016-01-28- 现在有很多php开发框架都提供关于防XSS攻击的过滤方法,下面和大家分享一个预防XSS攻击和ajax跨域攻击的函数,摘自某开发框架,相比于仅仅使用内置函数应该还是够强了的吧...2016-11-25