Wenn Sie von URL-Codierung sprechen, denken Sie vielleicht an die Sicherheitslücke bei der URL-Codierung vor N Jahren. Schade, dass ich zur falschen Zeit geboren wurde, als ich mit dem Internet in Berührung kam, war die Lücke längst verschwunden.
Was ist URL-Codierung? Schauen Sie sich die Definition an, die ich aus dem Internet kopiert habe:
Zitat: URL-Kodierung ist ein Format, das von Browsern zum Packen von Formulareingaben verwendet wird. Der Browser ruft alle Namen und Werte aus dem Formular ab und sendet sie als Teil der URL oder separat an den Server, wobei er die Namens-/Wertparameterkodierung verwendet (Entfernung nicht übertragbarer Zeichen, Sortieren der Daten usw.). In beiden Fällen sieht das Formulareingabeformat auf der Serverseite wie folgt aus:
theName=Ichabod+Crane&gender=male&status=missing&headless=yes
Die URL-Kodierung folgt den folgenden Regeln: Jedes Name/Wert-Paar wird durch ein kaufmännisches Und-Zeichen getrennt kommt aus der durch =-Zeichen getrennten Form. Wenn der Benutzer keinen Wert für den Namen eingibt, wird der Name weiterhin angezeigt, jedoch ohne Wert. Alle Sonderzeichen (d. h. solche, die kein einfaches 7-Bit-ASCII sind, wie z. B. chinesische Schriftzeichen) werden hexadezimal mit dem Prozentzeichen % kodiert, darunter natürlich auch Sonderzeichen wie =, & und %.
Haha, Sie verstehen, dass die URL-Codierung tatsächlich der hexadezimale ASCII-Code eines Zeichens ist. Es gibt jedoch eine kleine Änderung. Sie müssen „%“ voranstellen. Beispielsweise ist der ASCII-Code von „“ 92 und der Hexadezimalwert von 92 ist 5c, sodass die URL-Codierung von „“ ist. Wie sieht es also mit der URL-Kodierung chinesischer Schriftzeichen aus? Es ist ganz einfach, schauen Sie sich das Beispiel an: Der ASCII-Code von „Hu“ ist -17670, der Hexadezimalcode ist BAFA und die URL-Codierung ist „%BA%FA“. Haha, du weißt, wie man es umwandelt.
Normalerweise verwenden wir keine URL-Kodierung, da der IE die nicht numerischen Buchstaben, die Sie in die Adressleiste eingeben, automatisch in die URL-Kodierung umwandelt. Für den Browser entspricht http://blog.csdn.net/l%61ke2 also http://blog.csdn.net/lake2 (beachten Sie, dass ich in der ersten URL a durch %61 ersetzt habe). Haha, vielleicht haben Sie sich daran erinnert, dass jemand vorgeschlagen hat, „#“ in den Datenbanknamen einzufügen, um den Download zu verhindern, da der IE die folgenden Buchstaben ignoriert, wenn er auf # trifft. Die Cracking-Methode ist sehr einfach: Ersetzen Sie # durch URL-Kodierung #. Ich habe ursprünglich versucht, die URL-Kodierung zu verwenden, um Injektionsprüfungen zu vermeiden, aber das scheiterte, weil der Server die URL-Kodierung in Zeichen umwandelte.
Moment, ich scheine vom Thema abzuweichen, haha, tut mir leid :)
SQL-Injection ist mittlerweile sehr beliebt, daher haben einige Leute einige Anti-Injection-Skripte geschrieben. Natürlich sind die Ideen unterschiedlich und die Ergebnisse sehr unterschiedlich. Liebe Leser, bitte schauen Sie sich unten einen Teil des Codes der ××SQL Universal Anti-Injection ASP-Version an.
Fy_Url=Request.ServerVariables("QUERY_STRING")
Fy_a=split(Fy_Url,"&")
redim Fy_Cs(ubound(Fy_a))
Bei Fehler Weiter fortsetzen
für Fy_x=0 bis ubound(Fy_a)
Fy_Cs(Fy_x) = left(Fy_a(Fy_x),instr(Fy_a(Fy_x),"=")-1)
Nächste
Für Fy_x=0 bis ubound(Fy_Cs)
Wenn Fy_Cs(Fy_x)<>"" Dann
Wenn Instr(LCase(Request(Fy_Cs(Fy_x))),"and")<>0 dann
Response.Write „Es ist ein Fehler aufgetreten!“
Antwort.Ende
Ende wenn
Ende wenn
Nächste
Die Idee besteht darin, zuerst die übermittelten Daten abzurufen, „&“ als Abgrenzung zu verwenden, um die Namens-/Wertegruppe abzurufen und zu verarbeiten, und dann zu bestimmen, ob der Wert die definierten Schlüsselwörter enthält (der Einfachheit halber lasse ich hier nur „und“). Wenn ja, handelt es sich um eine Injektion.
Auf den ersten Blick wird der Wert überprüft und es scheint kein Problem vorzuliegen. Haha, ja, es gibt kein Problem mit dem Wert, aber was ist mit dem Namen?
Sein Name/Wert-Gruppenwert kommt von Request.ServerVariables("QUERY_STRING"), haha, tut mir leid, hier ist etwas schief gelaufen. Request.ServerVariables("QUERY_STRING") soll die vom Client übermittelte Zeichenfolge abrufen. Die URL-Kodierung wird hier nicht automatisch konvertiert. Wenn wir den Namen per URL kodieren und dann senden, kann die Prüfung umgangen werden. Wenn der Parameter beispielsweise ph4nt0m=lake2 und lis0 ist, kann das Programm ihn zu diesem Zeitpunkt erkennen. Wenn Sie %50h4nt0m=lake2 und lis0 (URL-Kodierung p) übermitteln, beurteilt das Programm den Wert von %50h4nt0m und %50h4nt0m wird in ph4nt0m konvertiert, sodass der Wert von %50h4nt0m leer ist und somit die Erkennung umgangen wird.
Warten Sie, warum kann die Prüfung umgangen werden, wenn der Name nicht dekodiert wird, der Wert jedoch nicht umgangen werden kann? Da der Wert von value aus Request(Fy_Cs(Fy_x)) übernommen wird, wird er vom Server dekodiert.
Wie kann das Programm verbessert werden? Solange Sie die vom Client übermittelten dekodierten Daten erhalten können, ändern Sie einfach die Anweisung, um den Namen in „For Each SubmitName In Request.QueryString“ zu erhalten.
Haha, vielen Dank für deine Geduld beim Lesen meines Artikels ^_^
Lake2