Gängige PHP-Umgehungen im CTF von PHP-Funktionen

Inhaltsverzeichnis

1. Gemeinsame Umgehungen von md5() und sha1()

1. Verwenden Sie die Array-Umgehung

2. Verwenden Sie zum Umgehen spezielle Zeichenfolgen

2. Strcmp-Bypass

3. Bypass schalten

4. Intervall-Bypass


1. Gemeinsame Umgehungen von md5() und sha1()

Wissenseinführung:

1. Für den starken PHP-Vergleich und den schwachen Vergleich: Die Funktionen md5() und sha1() können keine Arrays verarbeiten. Wenn ein Array übergeben wird, wird NULL zurückgegeben. Die beiden Arrays sind nach der Verschlüsselung NULL, was gleich ist.

2. Bei einigen speziellen Zeichenfolgen beginnt der nach der Verschlüsselung erhaltene Chiffretext mit 0e. PHP behandelt ihn als wissenschaftliche Notation, dh 0 hoch n-ter Potenz, und die erhaltenen Werte sind beim Vergleich gleich.

Das Folgende ist eine übliche verschlüsselte Chiffretextzeichenfolge, die mit 0e beginnt:

md5:

240610708:0e462097431906509019562988736854
QLTHNDT:0e405967825401955372549139051580
QNKCDZO:0e830400451993494058024219903391
PJNPDWY:0e291529052894702774557631701704
NWWKITQ:0e763082070976038347657360817689
NOOPCJF:0e818888003657176127862245791911
MMHUWUV:0e701732711630150438129209816536
MAUXXQC:0e478478466848439040434801845361


sha1:

10932435112: 0e07766915004133176347055865026311692244
aaroZmOk: 0e66507019969427134894567494305185566735
aaK1STfY: 0e76658526655756207688271159624026011393
aaO8zKZF: 0e89257456677279068558073954252716165668
aa3OFF9m: 0e36977786278517984959260394024281014729
0e1290633704: 0e19985187802402577070739524195726831799

Häufig gestellte Fragen:

Es ist erforderlich, dass die beiden übergebenen Parameter nicht gleich sind, aber nach der MD5-Verschlüsselung gleich sein müssen.

 Es gibt zwei Möglichkeiten, dieses Problem zu umgehen:

1. Verwenden Sie die Array-Umgehung

Es werden zwei verschiedene Arrays übergeben. Nach der MD5-Verschlüsselung sind die Ergebnisse beide null. Beim Vergleich sind sie gleich.

2. Verwenden Sie zum Umgehen spezielle Zeichenfolgen

Wählen Sie einfach zwei verschlüsselte Zeichenfolgen aus, die mit 0e beginnen, und übergeben Sie sie

Manchmal unterliegen die Fragen weiteren Einschränkungen, z. B. der Einschränkung, dass Arrays nicht übergeben werden können. Daher können wir spezielle Zeichenfolgen verwenden, um diese Einschränkung zu umgehen:

Wenn beide Arrays passieren:  

 Ändern Sie eine der Gruppen in eine spezielle Zeichenfolge:

2. Strcmp-Bypass

Wissenseinführung:

strcmp vergleicht zwei Zeichenfolgen und gibt <0 zurück, wenn str1<str2, >0, wenn str1 größer als str2 ist, und 0, wenn sie gleich sind.

strcmp vergleicht Zeichenfolgentypen. Wenn andere Parametertypen zwangsweise übergeben werden, tritt ein Fehler auf. Nach Auftreten eines Fehlers wird der Wert 0 zurückgegeben. Dies wird verwendet, um ihn zu umgehen.

Hier übergeben wir einen Nicht-String-Typ, beispielsweise ein Array:

3. Bypass schalten

Werfen Sie einen kurzen Blick darauf, ob der eingehende Parameter größer als 10 ist.

Natürlich nicht, hier müssen wir param1=0 übergeben

Ich denke, Sie sind auch neugierig, warum es 0 ist?
Schauen Sie sich zwei Beispiele an:

<?php
$a = 0;
switch ($a) {
    case $a <= 10:
            echo '小于10';
        break;

    case $a <= 20:
            echo '小于20';
        break;

    case $a <= 30:
            echo '小于30';
        break;

    default:
        	echo '大于30';
        break;
}

Ich dachte ursprünglich, das Ausgabeergebnis sei kleiner als 10,
aber die tatsächliche Ausgabe sei größer als 30

Schauen wir uns ein anderes Beispiel an:

<?php
$a = 0;
switch ($a) {
    case $a <= 10:
            echo '小于10';
        break;

    case $a > 20:
            echo '大于20';
        break;

    default:
        	echo '大于30';
        break;
}

Ausgabeergebnis: größer als 20

Das erste Beispiel ist a=0, a<=10 ist erfüllt, also ist der Wert des Ausdrucks wahr, und dann wird 0==wahr bestimmt? Nein, es wird mit dem nächsten Fall fortgefahren, bis der letzte Fall nicht gleich ist, daher wird der Standardwert verwendet.

Das zweite Beispiel ist a = 0, a <= 10 ist erfüllt. Wird der Code also 0 == wahr beurteilen? Nein, fahren Sie mit dem nächsten Fall fort: $a>20 ist nicht erfüllt, daher ist es falsch, und dann wird 0==falsch festgelegt, sodass die Ausgabe „größer als 20“ ist.

An diesem Punkt können Sie leicht verstehen, warum die Übergabe von 0 in dieser Frage das Flag ausgibt.

4. Intervall-Bypass

Die Funktion intval() wird verwendet, um den ganzzahligen Wert einer Variablen abzurufen

echo intval(53);                      // 53
echo intval(5.3);                     // 5

Beim Filtern von 5 können wir 5,3 eingeben, um ihn zu umgehen

Beispiel: int intval(var,base)

var ist der quantitative Wert, der in eine Ganzzahl umgewandelt werden soll, und base bezieht sich auf die für die Konvertierung verwendete Basis. 
Wenn base 0 ist, wird die verwendete Basis durch Erkennen des Formats von var bestimmt;
wenn die Zeichenfolge „0x“ (oder „0X“) enthält ) Präfix, verwenden Sie Hexadezimalzahl (hex);
wenn die Zeichenfolge mit „0“ beginnt, verwenden Sie Oktalzahl (Oktal);
andernfalls verwenden Sie Dezimalzahl (Dezimalzahl). 
Wir können seine Basiskonvertierung verwenden, um eine Umgehung zu erreichen.

Gibt bei Erfolg den ganzzahligen Wert von var zurück, bei Fehler 0; bei einem leeren Array 0 und bei einem nicht leeren Array 1.

Wenn es sich um einen schwachen Vergleich a==b handelt, übergeben wir a[]=1 und b[]=2,

An diesem Punkt sind die beiden unterschiedlich, aber beide geben 1 zurück und können auch zum Umgehen verwendet werden.

Es gibt eine Sicherheitslücke in der Funktion intval:

echo intval(1e10);                    // 1410065408
echo intval('1e10');                  // 1

Wenn einfache Anführungszeichen Werte übergeben, erkennen sie nur den ersten Teil des Buchstabens. Wenn wir Parameter über get übergeben, werden standardmäßig einfache Anführungszeichen hinzugefügt. In PHP wird das +-Zeichen so gewertet, dass es die Konvertierung in die wissenschaftliche Notation erzwingt. Berechnen +1 anstelle einer Zeichenfolge.

おすすめ

転載: blog.csdn.net/Myon5/article/details/131773778