Php5 GPC绕过缺陷

转载 2007年09月13日 20:07:00
Php5 GPC绕过缺陷
--------------------------------------------------------------------------------
作者:T_Torchidy  来源:  类别:漏洞分析资料  日期:2006-08-13  今日/总浏览: 1/1027 


在讨论具体的缺陷之前我们先来了解一点php安全方面的小东西。magic_quotes_gpc选项是php中的一个重要的安全设置,当该选项为ON也就是打开的时候,所有从GET,POST,COOKie传递过来的数据中的',", /,以及NULL等元字符都会被自动的加上/实现转义,这个选项使得Sql注入或者插入代码以及XSS中引入字符串或者改变程序流程变得困难,但是在php5中一些特殊变量的存在使得在某些情况下,还是会被恶意用户引入元字符到数据库以及程序中。
    Php中的变量除了来源于$_GET,$_POST,$_Cookie的提交之外,还来源于$_SERVER,$_ENV, $_SESSION等等,其中$_ENV和$_SESSION我们又不能很方便的控制和自由提交,所以剩下一个$_SERVER变量。而$_SERVER变量包括的东西里除了来自服务器本身还有有很大一部分来源于用户提交的HTTP请求,如:

QUERY_STRING             //用户GET方法提交时的查询字符串
HTTP_REFERER             //用户请求的来源变量,在一些程序取得用户访问记录时用得比较多
HTTP_USER_AGENT          //用户的浏览器类型,也用于用户的访问记录的取得
HTTP_HOST                //提交的主机头等内容
HTTP_X_FORWARDED_FOR     //用户的代理主机的信息

如上的变量在php5.0以下是受magic_quotes_gpc选项影响的,当magic_quotes_gpc选项为ON时,该数组中的元字符等内容就会做转义处理,为OFF时,用户的提交就会不做任何处理,直接送到数组中。现在的大部分安全点的程序都已经注意到$GET,$POST,以及$Cookie的危险性,如下的内容摘自Discuz的变量初试化的代码:

$magic_quotes_gpc = get_magic_quotes_gpc();
@extract(daddslashes($_POST));
@extract(daddslashes($_GET));
if(!$magic_quotes_gpc) {
    $_FILES = daddslashes($_FILES);
}

很好,已经注意到来自$_GET,$_POST,$_FILES以及$_Cookie的变量的安全性,但是$_SERVER变量呢?尽管在magic_quotes_gpc为on的情况下这些变量可能受到保护,但是很明显,忽视$_SERVER的结果就是安全隐患的增加,你就可以去寻找程序取得$_SERVER的地方,很可能就是脆弱点了!同样,在Bo-blog里有如下代码:

$ip_tmp1 = $_SERVER['HTTP_X_FORWARDED_FOR'];
if ($ip_tmp1!= "" && $ip_tmp1!= "unknown") $userdetail['ip']=$ip_tmp1;
else $userdetail['ip']=$ip_tmp;

然后在tb.php中58行左右用如下语句写replies表:

$blog->query("INSERT INTO  `{$db_prefix}replies` VALUES ('{$currentmaxid}', '4', '{$v_id}', '{$reptime}', '-1', '{$blog_name}', '{$title}', '{$url}', '{$userdetail['ip']}', '{$excerpt}', '0', '0', '0', '0', '', '0', '', '0', '', '0', '', '', '', '', '', '', '', '')");

很明显可以看到,如果我们能避过'然后用/*注释掉后面的东西的话,我们就可以伪造IP后面的一些内容了,由于很多程序本身就疏于对$_SERVER变量,所以我们只要饶过php本身对'的转义就可以了。在php4中,如果magic_quotes_gpc为Off的话就不用管了,但是如果magic_quotes_gpc为On的话,我们可能作为就不是那么大了!
    但是这种情况在php5中获得了彻底的改观,在测试中发现php5中无论magic_quotes_gpc是On还是Off,Php对$_SERVER变量是不会做转义处理的,意味着我们可以很轻松地带进程序',",以及NULL字符,这对于那些变量过滤不严格的程序来说是致命的!不知道php5是为了什么原因而这样做的,用如下的脚本可以证明这一点:

<?
echo "a=".$_GET[a]."/r/n";
echo "HTTP_X_FORWARDED_FOR=".$_SERVER['HTTP_X_FORWARDED_FOR']."/r/n";
echo "HTTP_REFERER=".$_SERVER['HTTP_REFERER']."/r/n";
echo "QUERY_STRING=".$_SERVER['QUERY_STRING']."/r/n";
?>

我们在magic_quotes_gpc为ON 和 Php5的情况下用NC向服务器提交:

GET /eqdkp/includes/3.php?a=Test' HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Host: luckboy.sufee.net
Connection: Keep-Alive
X-Forwarded-For: 'Test"'
Referer: 'Test"'
Cookie: herefirst=yes; eqdkp_data=a%3A2%3A%7Bs%3A13%3A%22auto_login_id%22%3Bs%3A0%3A%22%22%3Bs%3A7%3A%22user_id%22%3Bi%3A-1%3B%7D; eqdkp_sid=3c458d65b8c8e504b4427ba8de2eddb3

将会看到:

Warning: inverse host lookup failed for 221.230.129.116: h_errno 11004: NO_DATA

heman.sufee.net [221.230.129.116] 80 (http) open
HTTP/1.1 200 OK
Connection: close
Date: Mon, 07 Aug 2006 09:02:24 GMT
Content-Type: text/html
Server: Microsoft-IIS/6.0
X-Powered-By: PHP/5.0.4
X-Powered-By: ASP.NET

a=Test/'
HTTP_X_FORWARDED_FOR='Test"'
HTTP_REFERER='Test"'
QUERY_STRING=a=Test'

很显然,在php5的环境中我们的$_SERVER变量将不再受magic_quotes_gpc的保护,至于程序该如何加强自己的安全性,还是那句话,加强程序自身的过滤机制吧,不要依赖于语言本身了!记得所有的输入都是有害的 

php5全版本绕过open_basedir读文件脚本 -- phith0n

漏洞很久之前(大概5年前)被提出来了,但并不是php代码上的问题,所以问题一直存在,直到现在。我一直没留意,后来yaseng告诉我的,他测试了好像5.5都可以。 他在评论里发过了:http://zo...
  • god_7z1
  • god_7z1
  • 2014年12月11日 19:08
  • 691

PHP magic_quotes_gpc的详细使用方法

我们今天要向大家介绍的是PHP magic_quotes_gpc的具体使用方法。大家都知道在PHP中一个特殊的函数魔术函数,它在引用的过程中只有在传递$_GET,$_POST,$_COOKIE时才会发...
  • PHPService
  • PHPService
  • 2014年07月28日 13:51
  • 1181

使用GPC分解多边形样例(Generic Polygon Clipper)

GPC: Generic Polygon Clipper GPC支持分解多边形、多边形求差集、交集,异或、并集 GPC_DIFF, /* Diffe...
  • chunyexiyu
  • chunyexiyu
  • 2015年04月23日 21:45
  • 1717

从PHP5到PHP7的注意事项

原文地址:https://www.phpxy.com/article/25.html PHP7是大势所趋了。PHP7有更多的新特性,更好的性能,更高的速度。并且,从今年8月7日开始发行PHP...
  • cjsyr_cjsyr
  • cjsyr_cjsyr
  • 2016年12月09日 16:32
  • 4344

php5.5+apache2.4安装 环境搭建

在进行php开发之前需要搭建php和apache结合的开发环境。 具体步骤如下:一、下载安装包1.1、php5.5.6下载链接 http://windows.php.net/download/#ph...
  • hua245942641
  • hua245942641
  • 2016年02月24日 18:15
  • 3985

php5文件上传

1、  全局变量$_FILES[‘xxx’];     PHP5新创了一个$_$_FILES全局变量来接收文件的上传。这和以往版本有些差别。在旧版本里,你可以打开register_globals=o...
  • yimao110
  • yimao110
  • 2013年01月16日 15:01
  • 181

SQL注入绕过技巧

1.绕过空格(注释符/* */,%a0):   两个空格代替一个空格,用Tab代替空格,%a0=空格: %20 %09 %0a %0b %0c %0d %a0 /**/   最基...
  • vspiders
  • vspiders
  • 2017年11月06日 11:13
  • 208

缺陷注入-发现矩阵

转自http://book.51cto.com/ 缺陷有"注入阶段"和"发现阶段"两个重要指标,注入阶段和发现阶段可以是软件生命周期的各个阶段。根据这两个阶段可以绘制出一个"缺陷注入-发现矩阵",从中...
  • elain0606
  • elain0606
  • 2014年04月02日 14:45
  • 1445

Web常用编码以及攻击绕过笔记

一、URL编码 形式:“%”加上ASCII码(先将字符转换为两位ASCII码,再转为16进制),其中加号“+”在URL编码中和“%20”表示一样,均为空格。 当遇到非ASCII码表示的字符时,如中...
  • gc_msc
  • gc_msc
  • 2017年07月25日 10:08
  • 294

i春秋:警惕您站上的文件扩展名绕过漏洞

实验环境 实验环境 操作机:Windows XP 目标机:Windows 2003 目标网址:www.test.com实验工具:中国菜刀 实验目的 本课程带领大家...
  • hope_smile
  • hope_smile
  • 2015年06月01日 04:02
  • 1316
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Php5 GPC绕过缺陷
举报原因:
原因补充:

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