Heim >Backend-Entwicklung >PHP-Tutorial >Zusammenfassung anfälliger Funktionen in PHP

Zusammenfassung anfälliger Funktionen in PHP

韦小宝
韦小宝Original
2018-03-08 17:41:442675Durchsuche

Dieser Artikel beschreibt die Existenz einiger PHP-Funktionen mit kleinen Schwachstellen in PHP. Wer die anfälligen Funktionen in PHP nicht verstanden hat, kann einen Blick darauf werfen, worauf man bei der Verwendung dieser Funktionen in der tatsächlichen PHP-Entwicklung achten sollte Unsinn und lesen Sie diesen Artikel gemeinsam!

1. Schwacher Typvergleich


Zusammenfassung anfälliger Funktionen in PHP


2.MD5-Vergleichsschwachstelle

Wenn PHP Hash-Strings verarbeitet, wenn Sie „!=" oder „==" zum Vergleichen von Hash verwenden Werte, es interpretiert jeden Hash-Wert, der mit „0x“ beginnt, als Potenz von 0 in wissenschaftlicher Notation (0). Wenn also zwei verschiedene Passwörter gehasht werden, lautet ihr Hash-Wert. Die griechischen Werte beginnen dann alle mit „0e“. PHP wird denken, 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 Kürzung

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

String-Vergleichsanalyse
Wenn $_GET['password'] hier ein Array ist, ist der Rückgabewert NULL
Wenn es 123 ||. 123%00&&&** ist, ist der Rückgabewert 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.


Zusammenfassung anfälliger Funktionen in PHP


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;如果两者相等,返回 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:

<?php
echo is_numeric(233333);       # 1
echo is_numeric(&#39;233333&#39;);    # 1
echo is_numeric(0x233333);    # 1
echo is_numeric(&#39;0x233333&#39;);   # 1
echo is_numeric(&#39;233333abc&#39;);  # 0
?>

8.preg_match

Wenn bei der Übereinstimmung mit regulärem Ausdruck keine Begrenzung des Starts und erfolgt Ende der Zeichenfolge (^ 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

und parse_str( ) Ähnliche Funktionen umfassen 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 im

Anforderungsparameter 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. Auch 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 eine Zeichenfolge an einer beliebigen Stelle ein, die PHP als int betrachtet. Es wird

sein erzwungen

15.serialize und unserialize Schwachstellen

这里我们先简单介绍一下php中的魔术方法(这里如果对于类、对象、方法不熟的先去学学吧),即Magic方法,php类可能会包含一些特殊的函数叫magic函数,magic函数命名是以符号开头的,比如 construct, destruct,toString,sleep,wakeup等等。这些函数都会在某些特殊时候被自动调用。 
例如construct()方法会在一个对象被创建时自动调用,对应的destruct则会在一个对象被销毁时调用等等。 
这里有两个比较特别的Magic方法,sleep 方法会在一个对象被序列化的时候调用。 wakeup方法会在一个对象被反序列化的时候调用。
<?php
class 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 Sie können C:UsersYZDesktopplan.txt lesen unten Datei

<?php
class 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.session-Deserialisierungsschwachstelle

Der Hauptgrund ist

ini_set('session.serialize_handler', 'php_serialize'); >ini_set('session.serialize_handler', 'php');
Die beiden Methoden zum Umgang mit Sitzungen sind unterschiedlich
Diese Sache ist nicht ganz klar, daher werde ich später eine Lösung schreiben!
Hier ist eine Frage! Dies ist ein
Thema

Verwandte Empfehlungen:

Grundstruktur der PHP-Funktion

Das obige ist der detaillierte Inhalt vonZusammenfassung anfälliger Funktionen in PHP. 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