>백엔드 개발 >PHP 튜토리얼 >PHP 함수의 취약점 모음 공유

PHP 함수의 취약점 모음 공유

小云云
小云云원래의
2018-03-13 13:53:564319검색


이 기사는 주로 PHP 함수의 몇 가지 허점 모음을 공유합니다. 이것이 모든 사람에게 도움이 되기를 바랍니다.

1. 약한 유형 비교

PHP 함수의 취약점 모음 공유

2. MD5 비교 취약점

PHP에서 해시 값을 수행하는 데 "!=" 또는 "=="를 사용하는 경우 "0x"로 시작하는 각 해시 값을 과학적 표기법(0)에서 0의 거듭제곱으로 해석하므로 두 개의 서로 다른 비밀번호가 해시되면 해당 해시 값은 둘 다 "0e"로 시작하면 PHP는 다음과 같이 간주합니다. 동일합니다.
일반적인 페이로드에는

0x01 md5(str)
    QNKCDZO
    240610708
    s878926199a
    s155964671a
    s214587387a
    s214587387a
0x02 sha1(str)
    sha1('aaroZmOk')  
    sha1('aaK1STfY')
    sha1('aaO8zKZF')
    sha1('aa3OFF9m')

가 포함됩니다. 동시에 MD5는 배열을 처리할 수 없습니다. 다음과 같은 판단이 내려지면 배열을 사용하여

if(@md5($_GET['a']) == @md5($_GET['b']))
{
    echo "yes";
}
//http://127.0.0.1/1.php?a[]=1&b[]=2

3.ereg 기능 취약점: 00 잘림

ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE

문자열 비교 분석을 우회할 수 있습니다. 여기서 $_GET[ 'password']가 배열이면 반환 값은 NULL입니다.
123 || asd || 12as || 123%00&&&**이면 반환 값은 true입니다.
나머지는 false입니다. 4. $key란 무엇인가요?

프로그램은 변수 자체의 키를 변수로 추출하여 함수에 제공하여 처리할 수 있다는 점을 잊지 마세요.
<?php
    print_r(@$_GET); 
    foreach ($_GET AS $key => $value)
    {        print $key."\n";
    }?>

5. 변수 적용 범위

예제를 살펴보겠습니다.
<?php  
    $auth = &#39;0&#39;;  
    // 这里可以覆盖$auth的变量值
    print_r($_GET);    echo "</br>";
    extract($_GET); 
    if($auth == 1){  
        echo "private!";  
    } else{  
        echo "public!";  
    }  
?>
extract는 배열을 받은 다음 변수를 다시 할당할 수 있습니다.


동시에! PHP의 $ 기능은 변수 이름을 할당하는 데 사용할 수 있으며 변수 덮어쓰기를 유발할 수도 있습니다!
<?php  
    $a=&#39;hi&#39;;    foreach($_GET as $key => $value) {        echo $key."</br>".$value;        $$key = $value;
    }    print "</br>".$a;?>
PHP 함수의 취약점 모음 공유목표를 달성하려면 http://127.0.0.1:8080/test.php?a=12를 구성하세요.

6.strcmp

http://127.0.0.1:8080/test.php?a=12 即可达到目的。

6.strcmp

如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。 
先将两个参数先转换成string类型。 
当比较数组和字符串的时候,返回是0。 
如果参数不是string类型,直接return
<?php
    $password=$_GET[&#39;password&#39;];    if (strcmp(&#39;xd&#39;,$password)) {     echo &#39;NO!&#39;;
    } else{        echo &#39;YES!&#39;;
    }?>

构造http://127.0.0.1:8080/test.php?password[]=

<?phpecho is_numeric(233333);       # 1echo is_numeric(&#39;233333&#39;);    # 1echo is_numeric(0x233333);    # 1echo is_numeric(&#39;0x233333&#39;);   # 1echo is_numeric(&#39;233333abc&#39;);  # 0?>
<?php$ip = &#39;asd 1.1.1.1 abcd&#39;; // 可以绕过if(!preg_match("/(\d+)\.(\d+)\.(\d+)\.(\d+)/",$ip)) {  die(&#39;error&#39;);
} else {   echo(&#39;key...&#39;);
}?>

Constructionhttp://127.0.0.1:8080/test.php?password[]=

7.is_numeric

말할 필요도 없이:

<?php
    $var=&#39;init&#39;;  
    print $var."</br>";
    parse_str($_SERVER[&#39;QUERY_STRING&#39;]);  
    echo $_SERVER[&#39;QUERY_STRING&#39;]."</br>";    print $var;?>
8.preg_match

정규식 매칭 수행 시 문자열의 시작과 끝(^, $)에 제한이 없으면 우회 문제가 있을 수 있습니다

<?php  
    echo 0 == &#39;a&#39; ;// a 转换为数字为 0    重点注意
    // 0x 开头会被当成16进制54975581388的16进制为 0xccccccccc
    // 十六进制与整数,被转换为同一进制比较
    &#39;0xccccccccc&#39; == &#39;54975581388&#39; ;    // 字符串在与数字比较前会自动转换为数字,如果不能转换为数字会变成0
    1 == &#39;1&#39;;    1 == &#39;01&#39;;    10 == &#39;1e1&#39;;    &#39;100&#39; == &#39;1e2&#39; ;    

    // 十六进制数与带空格十六进制数,被转换为十六进制整数
    &#39;0xABCdef&#39;  == &#39;     0xABCdef&#39;;    echo &#39;0010e2&#39; == &#39;1e3&#39;;    // 0e 开头会被当成数字,又是等于 0*10^xxx=0
    // 如果 md5 是以 0e 开头,在做比较的时候,可以用这种方法绕过
    &#39;0e509367213418206700842008763514&#39; == &#39;0e481036490867661113260034900752&#39;;    &#39;0e481036490867661113260034900752&#39; == &#39;0&#39; ;

    var_dump(md5(&#39;240610708&#39;) == md5(&#39;QNKCDZO&#39;));
    var_dump(md5(&#39;aabg7XSs&#39;) == md5(&#39;aabC9RqS&#39;));
    var_dump(sha1(&#39;aaroZmOk&#39;) == sha1(&#39;aaK1STfY&#39;));
    var_dump(sha1(&#39;aaO8zKZF&#39;) == sha1(&#39;aa3OFF9m&#39;));?>
9.parse_str


parse_str()과 유사한 함수는 mb_parse_str()입니다.parse_str은 문자열을 여러 변수로 구문 분석합니다. 매개 변수 str이 URL에 의해 전달된 쿼리 문자열인 경우 변수로 구문 분석되어 현재 범위로 설정됩니다.

변수 덮어쓰기의 일종

<?php  $_CONFIG[&#39;extraSecure&#39;] = true;foreach(array(&#39;_GET&#39;,&#39;_POST&#39;) as $method) {    foreach($$method as $key=>$value) {      // $key == _CONFIG
      // $$key == $_CONFIG
      // 这个函数会把 $_CONFIG 变量销毁
      unset($$key);
    }
}if ($_CONFIG[&#39;extraSecure&#39;] == false) {    echo &#39;flag {****}&#39;;
}?>
10. 문자열 비교

$var = 5;  
方式1:$item = (string)$var;  
方式2:$item = strval($var);
11.unset

unset(bar)은 요청 매개변수에 변수 bar가 포함되어 있는 경우 사용됩니다. 프로그램 로직을 우회하기 위해 일부 변수를 삭제합니다.

var_dump(intval(&#39;2&#39;)) //2  var_dump(intval(&#39;3abcd&#39;)) //3  var_dump(intval(&#39;abcd&#39;)) //0 可以使用字符串-0转换,来自于wechall的方法
12.intval()

int를 문자열로:

if($req[&#39;number&#39;]!=strval(intval($req[&#39;number&#39;]))){     $info = "number must be equal to it&#39;s integer!! ";  
}

문자열을 int로: intval() 함수.

<?php
    $i ="abc";  
    switch ($i) {  
    case 0:  
    case 1:  
    case 2:  
    echo "i is less than 3 but not negative";  
    break;  
    case 3:  
    echo "i is 3";  
    } 
?>

intval()을 변환할 때 숫자가 아닌 문자를 만날 때까지 문자열의 처음부터 변환한다고 설명합니다. 변환할 수 없는 문자열이 나타나도 intval()은 오류를 보고하지 않고 0을 반환합니다.

그런데 intval은 %00으로 잘릴 수 있습니다

$array=[0,1,2,&#39;3&#39;];  
var_dump(in_array(&#39;abc&#39;, $array)); //true  var_dump(in_array(&#39;1bc&#39;, $array)); //true

$req['number']=0%00이면 우회

13.switch()

switch가 숫자 유형의 경우 switch는 매개변수를 int 유형으로 변환하며 그 효과는 intval 함수와 동일합니다. 다음과 같습니다:

这里我们先简单介绍一下php中的魔术方法(这里如果对于类、对象、方法不熟的先去学学吧),即Magic方法,php类可能会包含一些特殊的函数叫magic函数,magic函数命名是以符号__开头的,比如 __construct, __destruct,__toString,__sleep,__wakeup等等。这些函数都会在某些特殊时候被自动调用。 
例如__construct()方法会在一个对象被创建时自动调用,对应的__destruct则会在一个对象被销毁时调用等等。 
这里有两个比较特别的Magic方法,__sleep 方法会在一个对象被序列化的时候调用。 __wakeup方法会在一个对象被反序列化的时候调用。
14.in_array()

<?phpclass test{
    public $username = &#39;&#39;;    public $password = &#39;&#39;;    public $file = &#39;&#39;;    public function out(){
        echo "username: ".$this->username."<br>"."password: ".$this->password ;
    }     public function __toString() {
        return file_get_contents($this->file);
    }
}$a = new test();$a->file = &#39;C:\Users\YZ\Desktop\plan.txt&#39;;echo serialize($a);?>//tostring方法会在输出实例的时候执行,如果实例路径是隐秘文件就可以读取了

PHP가 int로 간주하는 문자열을 입력하면 강제로 변환됩니다.

15.serialize 및 unserialize 취약점

<?phpclass test{
    public $username = &#39;&#39;;    public $password = &#39;&#39;;    public $file = &#39;&#39;;    public function out(){
        echo "username: ".$this->username."<br>"."password: ".$this->password ;
    }     public function __toString() {
        return file_get_contents($this->file);
    }
}$a = &#39;O:4:"test":3:{s:8:"username";s:0:"";s:8:"password";s:0:"";s:4:"file";s:28:"C:\Users\YZ\Desktop\plan.txt";}&#39;;echo unserialize($a);?>
rrreee

echo unserialize는 __tostring을 트리거합니다. function, C:UsersYZDesktopplan.txt 파일은 아래에서 읽을 수 있습니다

rrreee16.session 역직렬화 취약점


주된 이유는
ini_set('session.serialize_handler', 'php_serialize')
ini_set('session .serialize_handler)입니다. ', 'php'); 둘은 세션을 다르게 처리합니다 UsersYZDesktopplan.txt";}';echo unserialize($a);?>

16.session 역직렬화 취약점


주요 이유는
ini_set('session.serialize_handler', 'php_serialize');
ini_set('session.serialize_handler', 'php');
둘은 세션을 다르게 처리합니다

관련 권장사항:

PHP 웹사이트에서 흔히 발생하는 일부 보안 취약점 및 해당 예방 조치 조치

역직렬화 객체 주입 취약점에 대한 PHP

파일 취약점에 관한 9개 기사 추천

🎜

위 내용은 PHP 함수의 취약점 모음 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.