你的位置:聚盟网 >> 网络学院 >> 入门 >> 详细内容 在线投稿

magic_quotes_gpc=off绕过两种函数

www.juoooo.com  2011年10月22日21:44  来源: 互联网   查看:   我要评论(0)  收藏  字号: TTT

在PHP6公布的一些资料上来看(现在主流PHP5和 PHP4),register_globals、magic_quotes_gpc、safe_mode这三个选项将会不复存在,官方这样的做法考虑到 PHP可移植性问题。去掉了GPC选项,很多程序都要改写。到底会改写什么呢?起码会增加一个模拟magic_quotes_gpc的函数来处理数据。那么现在研究在magic_quotes_gpc=off下绕过函数将会很有前景。

addslashes函数
很多程序都会考虑到GPC影响功能会关闭掉GPC选项,而选择用PHP的一个内置函数addslashes来进行预定转义,并模拟一段代码:

define(‘MAGIC_QUOTES_GPC’, get_magic_quotes_gpc());

foreach(array(‘_COOKIE’, ‘_POST’, ‘_GET’) as $_request) {
foreach($$_request as $_key => $_value) {
$_key{0} != ‘_’ && $$_key = daddslashes($_value);
}
}

function daddslashes($string, $force = 0) { //这里daddslashes函数跟addslashes是不用的,注意名称。
!defined(‘MAGIC_QUOTES_GPC’) && define(‘MAGIC_QUOTES_GPC’, get_magic_quotes_gpc());
if(!MAGIC_QUOTES_GPC || $force) {
if(is_array($string)) {
foreach($string as $key => $val) {
$string[$key] = daddslashes($val, $force);
}
} else {
$string = addslashes($string);
}
}
return $string;
}

  define、defined是PHP内置函数,前者用于定义常量,后者则是查看常量是否存在。这里有两个foreach读者会比较难理解:首先把’_COOKIE’、’_POST’、’_GET’这三个值以array函数传递给$_request,此时$_request就会变成数组,$_request[0]的值是_COOKIE,$_request[1]的值是_POST,$_request[2]的值是_GET,并且用第一个 foreach将它们循环输出;然后再到第二个foreach:$$_request这句其实可以代换成“$$_request[0]”、 “$$_request[1]”、“$$_request[2]”;由于在PHP中,在双引号中的变量仍然起作用并可代表在变量里的值,所以上面三个数组变量再代换成大家很熟悉的“$_COOKIE”、“$_POST”、“$_GET”,并循环输出。

  $_key{0} != ‘_’即是我们提交的第一个数据的名称不能是“_”,这个显然可以满足;然后到了daddslashes($val, $force),注意这里传入的参数是$val和$force。
最后就是daddslashes函数的定义:&&代表AND运算符,||代表OR运算符;不存在MAGIC_QUOTES_GPC常量和并且用define函数定义常量做一个AND运算。继续,如果MAGIC_QUOTES_GPC不存在值,而$force不存在值、或者两者都存在值,则判断$string是否为数组,是的话就用foreach循环输出每一个值,并用daddslashes函数循环预定反义每一个值。注意这里的参数还是$val和$force。

  这段代码需要用到运算符高低级,函数的默认值、递归调用等等的小知识。这段代码我们不难看出,addslashes函数的参数($string)就是daddslashes函数的参数$val。
大家可能认为这段代码找不到什么问题,但如果你注意到它的参数的调用,就不难发现:函数只过滤了$val,而$_key并没有过滤。相反,在 magic_quotes_gpc=on时不仅仅处理变量值,还处理变量名。其实daddslashes函数只是模拟了GPC的一部分功能而已。


实例
ECShop是最大的免费开源网店系统(用户量不在话下)。ECShop小于v2.6.2版本的includes/init.php(这个文件经常被包含)当GPC为OFF时使用addslashes_deep函数过滤

$_REQUEST、$_COOKIE:
if (!get_magic_quotes_gpc())
{
if (!empty($_GET))
{
$_GET = addslashes_deep($_GET);
}
if (!empty($_POST))
{
$_POST = addslashes_deep($_POST);
}

$_COOKIE = addslashes_deep($_COOKIE);
$_REQUEST = addslashes_deep($_REQUEST);
}

如果get_magic_quotes_gpc为off而且存在GET提交过来的数据,则用addslashes_deep函数来过滤$_GET这个PHP内置变量(数组),下面类同。addslashes_deep函数在includes/lib_base.php里最后通过addslashes 函数处理:

function addslashes_deep($value)
{
if (empty($value))
{
return $value;
}
else
{
return is_array($value) ? array_map(‘addslashes_deep’, $value) : addslashes($value);
}
}

如果$value为空,则返回为空;否则用“A?B:C”运算符来判断,这个其实可以代换成:

if (is_array($value))
{
array_map(‘addslashes_deep’, $value)
}
else
{
addslashes($value)
}
如果$value是数组,就用PHP内置函数array_map来调用addslashes_deep函数重复过滤value数组的每一个值;否则用addslashes来预定反义。其中array_map函数的作用,用一个例子来解说:
function cube($n) {
return $n*$n*$n; //这个函数用参数$n,并以$n的三次方的值返回
}

$a = array(1, 2, 3, 4, 5); //$a是数组
$b = array_map(“cube”, $a); //用cube函数在array_map下重复执行在$a数组中每一个值的三次方运算
print_r($b); //$b是数组,做输出作用。
?>

我们在看完函数后再来看ECShop的漏洞文件pick_out.php:

if (!empty($_GET['attr']))
{
foreach($_GET['attr'] as $key => $value)
{
$key = intval($key);
$_GET['attr'][$key] = htmlspecialchars($value);

}
}
省略部分代码……
$attr_table = ”;
$attr_where = ”;
$attr_url = ”;
$i = 0;
$goods_result = ”;
foreach ($_GET['attr'] AS $key => $value)
{
$attr_url .= ‘&attr[' . $key . ']=’ . $value;

$attr_picks[] = $key;
if ($i > 0)
{
if (empty($goods_result))
{
break;
}
$goods_result = $db->getCol(“SELECT goods_id FROM ” . $ecs->table(“goods_attr”) . ” WHERE goods_id IN (” . implode(‘,’ , $goods_result) . “) AND attr_id=’$key’ AND attr_value=’$value’”);
}
else
{
$goods_result = $db->getCol(“SELECT goods_id FROM ” . $ecs->table(“goods_attr”) . ” WHERE attr_id=’$key’ AND attr_value=’$value’”);
}
$i++;
}

第1篇章:magic_quotes_gpc=off绕过两种函数

第2篇章:magic_quotes_gpc=off绕过两种函数(2)

编辑: 伊小露
分享到:
顶:79 踩:89
【已经有533人表态】
108票
超赞
55票
震惊
59票
不解
61票
愤怒
65票
支持
67票
高兴
56票
无聊
62票
杯具
发表评论

网友评论仅供网友表达个人看法,并不表明本网同意其观点或证实其描述。

查看全部回复【已有0位网友发表了看法】
糗事吧 牛吧 私房话 经典吧
祝福墙许愿墙
随手记-天天记帐本
邀请达人
2013祝福短信,节日祝福语