PHP 전역 변수 취약점에 대한 비트별 분석

WBOY
풀어 주다: 2016-07-25 08:56:45
원래의
1063명이 탐색했습니다.
  1. if (isset($_REQUEST['GLOBALS']) OR isset($_FILES['GLOBALS'])) {
  2. exit('Request tainting attempted.');
  3. }
复制代码

register_globals 是php中的一个控制选项,可以设置成off或者on ,默认为off,决定是否将 EGPCS(Environment,GET,POST,Cookie,Server)变量注册为全局变量。 如果 register_globals打开的话, 客户端提交的数据中含有GLOBALS变量名, 就会覆盖服务器上的$GLOBALS变量。 所以 这段代码, 就是判断, 如果提交的数据中有GLOBALS变量名, 就终止程序。

由此引起的安全问题成为PHP的“自动全局变量漏洞”,请一定要关掉register_globals选项。并且使用 $_GET, $_POST, $_COOKIE 而非 $_REQUEST 。

Discuz!论坛绕过全局变量防御漏洞

由于php5.3.x版本php.ini的设置中 request_order 默认值为 GP ,导致Discuz! 6.x/7.x中可以绕过全局变量防御。

在include/global.func.php中:

  1. function daddslashes($string, $force = 0) {
  2. !defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());
  3. if(!MAGIC_QUOTES_GPC || $force) {
  4. if(is_array($string)) {
  5. foreach($string as $key => $val) {
  6. $string[$key] = daddslashes($val, $force);
  7. }
  8. } else {
  9. $string = addslashes($string);
  10. }
  11. }
  12. return $string;
  13. }
复制代码

include/common.inc.php中:

  1. foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
  2. foreach($$_request as $_key => $_value) {
  3. $_key{0} != '_' && $$_key = daddslashes($_value);
  4. }
  5. }
复制代码

在register_globals=on时通过提交GLOBALS变量就可以绕过上面的代码。

Discuz!中提供的防范方法:

  1. if (isset($_REQUEST['GLOBALS']) OR isset($_FILES['GLOBALS'])) {
  2. exit('Request tainting attempted.');
  3. }
复制代码

$_REQUEST超全局变量的值受php.ini中request_order的影响,在最新的php5.3中,request_order默认值为GP,即默认配置下$_REQUEST只包含$_GET和$_POST而不包括$_COOKIE。 借助COOKIE即可提交GLOBALS变量。

临时解决方法: 更改php 5.3.x里的php.ini设置,设置 request_order 为 GPC。

有关php中全局变量的漏洞与临时解决方法,就介绍这些了,希望对大家有所帮助吧。



원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿