AWVS14.7ファイルアップロード脆弱性検出ロジック解析

File_Upload.script の分析

startTesting().png

startTesting() -> prepareUploadURLs() = true -> プラグインの実行を終了

startTesting() -> prepareUploadURLs() == false -> TestXXEFileUpload()でalertXXE()の脆弱性の有無を判定し、脆弱性の有無に関わらず実行を継続 -> パス( this.scheme. path )、パスにはサフィックス名があり、サフィックスはcgiまたはpl -> **TestPerlJam2() は、alertPerljam2()** 脆弱性の有無を判断するために使用され、脆弱性の有無に関係なく実行を継続します。脆弱性です -> 実行を続行します

startTesting() -> prepareUploadURLs() == false -> TestXXEFileUpload()はalertXXE()の脆弱性の有無を判定し、脆弱性の有無に関わらず実行を継続 -> パス( this.scheme.path )が取得されない、またはパスが存在しない サフィックスがある、またはサフィックスがcgiまたはplではない-> **TestZipSymlinkUpload() は、alertZipSymlink()** 脆弱性があるかどうかを判断するために使用されます。脆弱性の有無に関わらず実行を継続 -> **TestImageUploadExifXSS()** を使用して **alertEXIFXSS()** の脆弱性の有無を判定し、脆弱性の有無に関わらず実行を継続 ->これexistFileUpload() == false -> プラグイン操作を終了します

startTesting() -> prepareUploadURLs() == false -> TestXXEFileUpload()はalertXXE()の脆弱性の有無を判定し、脆弱性の有無に関わらず実行を継続 -> パス( this.scheme.path )が取得されない、またはパスが存在しない サフィックスがある、またはサフィックスがcgiまたはplではない-> **TestZipSymlinkUpload() は、alertZipSymlink()** 脆弱性があるかどうかを判断するために使用されます。脆弱性の有無に関わらず実行を継続 -> **TestImageUploadExifXSS()** を使用して **alertEXIFXSS()** の脆弱性の有無を判定し、脆弱性の有無に関わらず実行を継続 ->これexistFileUpload() == true ->初めてTestFileUpload()を呼び出す-> this.foundOneUploadURL == false -> 実行中のプラグインを終了する

startTesting() -> prepareUploadURLs() == false -> TestXXEFileUpload()はalertXXE()の脆弱性の有無を判定し、脆弱性の有無に関わらず実行を継続 -> パス( this.scheme.path )が取得されない、またはパスが存在しない サフィックスがある、またはサフィックスがcgiまたはplではない-> **TestZipSymlinkUpload() は、alertZipSymlink()** 脆弱性があるかどうかを判断するために使用されます。脆弱性の有無に関係なく実行を継続 -> **TestImageUploadExifXSS()** を使用して **alertEXIFXSS() 脆弱性の有無を判断し、脆弱性の有無に関係なく実行を継続 -> this.existFileUpload( ) == true ->初めてTestFileUpload()を呼び出します-> this.foundOneUploadURL == true ->脆弱性が検出された場合、ロング パス テスト用に異なるファイルがビルドされるたびに、 TestFileUpload() を順番に 19 回呼び出します alert()** を呼び出し、プラグイン操作を終了します。

startTesting()

ファイル入力として検出された場合は 1.0 ( this.scheme.hasFileInput )

次に、prepareUploadURLs()を呼び出します。

2.1 prepareUploadURLs() がtrueを返した場合、プラグイン操作を終了します

2.2 prepareUploadURLs() がfalseを返した場合、プラグインは実行を継続します

3.0 aws s3 インターフェイスを呼び出す場合は、TestXXEFileUpload()を呼び出します(呼び出し方法については、この関数の詳細な説明を参照してください)。

TestXXEFileUpload() がホール ( alertXXE() ) を報告するかどうかに関係なく、関数は実行を継続します。

4.0 パス ( this.scheme.path )が取得され、そのパスにサフィックス名があり、そのサフィックス名がcgi (パブリック ネットワーク インターフェイス スクリプト) またはpl (Perl スクリプトによってコンパイルおよび実行される) である場合、TestPerlJam2()を呼び出します。

5.0 TestZipSymlinkUpload()を呼び出します。呼び出しメソッドはthis.TestZipSymlinkUpload(“SanTest” + random(maxRandomNumber) + “.zip”, “application/octet-stream”)です。

6.0 TestImageUploadExifXSS()を呼び出します。呼び出しメソッドはthis.TestImageUploadExifXSS(“SanTestEXIF” + random(maxRandomNumber) + “.jpg”, “image/jpeg”)です。

7.0 **this.existFileUpload()** を呼び出して、アップロードされたファイルが表示されるかどうかを判断し、表示されないかどうかのテストを行わなくなりました。

8.0调用TestFileUpload(),调用方法为this.TestFileUpload(“SanTest” + random(maxRandomNumber) + “.jpg”, “image/jpeg”, b642plain(“/9j/4AAQSkZJRgABAQEASABIAAD//gAyPD9waHAgZWNobyhtZDUoJ3Nhbmdmb3JyLWZpbGUtdXBsb2FkLXRlc3QnKSk7ID8+/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e/8AAEQgAAQABAwEiAAIRAQMRAf/ EABUAAQEAAAAAAAAAAAAAAAAAAAAI/8QAFBABAAAAAAAAAAAAAAAAAAAAP/EABQBAQAAAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwCywAf/2Q=="), detectURLstr)

ここで、ペイロードのbase64は次の図のようにデコードされ、phpによって出力された文が表示されます。

画像.png

9.1 this.foundOneUploadURL == false 、実行中のプラグインを終了します

9.2 this.foundOneUploadURL == true

**TestFileUpload() を19 回順番に呼び出し、毎回ロングパス テスト用に異なるファイルを構築します。脆弱性が検出された場合は、 alert()** を呼び出してプラグイン操作を終了します。

if (!await this.TestFileUpload("Applet" + random(maxRandomNumber) + ".class", "image/jpeg", appletPayload, appletPayload))
                    await this.TestFileUpload("Applet" + random(maxRandomNumber) + ".jar", "image/jpeg", appletPayload, appletPayload);
                // test xss via svg
                await this.TestFileUpload("SanTest" + random(maxRandomNumber) + ".svg", "application/xml", b642plain("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCjx1c2UgeGxpbms6aHJlZj0iZGF0YTphcHBsaWNhdGlvbi94bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGh0Ykc1ek9uaHNhVzVyUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMM2hzYVc1cklqNE5DanhrWldaelBnMEtQR05wY21Oc1pTQnBaRDBpZEdWemRDSWdjajBpTlRBaUlHTjRQU0l4TURBaUlHTjVQU0l4TURBaUlITjBlV3hsUFNKbWFXeHNPaUFqUmpBd0lqNE5Danh6WlhRZ1lYUjBjbWxpZFhSbFRtRnRaVDBpWm1sc2JDSWdZWFIwY21saWRYUmxWSGx3WlQwaVExTlRJaUJ2Ym1KbFoybHVQU2RoYkdWeWRDZ3hLU2NnYjI1bGJtUTlKMkZzWlhKMEtESXBKeUIwYnowaUl6QXdSaUlnWW1WbmFXNDlJakZ6SWlCa2RYSTlJalZ6SWlBdlBnMEtQQzlqYVhKamJHVStEUW84TDJSbFpuTStEUW84ZFhObElIaHNhVzVyT21oeVpXWTlJaU4wWlhOMElpOCtEUW84TDNOMlp6NGcjdGVzdCIvPg0KPC9zdmc+ICAg"), '<use xlink:href="data:application/xml;base64,', 0, 'svg');
                // test xsscanonUrl
                if (!await this.TestFileUpload("SanTest" + random(maxRandomNumber) + ".htm", "text/html", b642plain("PHNjcmlwdD5hbGVydCgnc2FuZ2ZvciB4c3MgdGVzdCcpOzwvc2NyaXB0Pg=="), "<script>alert('sangfor xss test');</script>", 0, 'html'))
                    await this.TestFileUpload("SanTest" + random(maxRandomNumber) + ".htm", "image/jpeg", b642plain("PHNjcmlwdD5hbGVydCgnc2FuZ2ZvciB4c3MgdGVzdCcpOzwvc2NyaXB0Pg=="), "<script>alert('sangfor xss test');</script>", 0, 'html');
                // test shell upload
                ScriptProgress(ComputeProgress(2, numberTests));
                if (await this.TestFileUpload("SanTest" + random(maxRandomNumber) + ".php", "image/jpeg", b642plain("/9j/4AAQSkZJRgABAQEASABIAAD//gAyPD9waHAgZWNobyhtZDUoJ3Nhbmdmb3JyLWZpbGUtdXBsb2FkLXRlc3QnKSk7ID8+/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e/8AAEQgAAQABAwEiAAIRAQMRAf/EABUAAQEAAAAAAAAAAAAAAAAAAAAI/8QAFBABAAAAAAAAAAAAAAAAAAAAAP/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwCywAf/2Q=="), "963151c21d0fe4a98606a053e7cc9208")) return;
                ScriptProgress(ComputeProgress(3, numberTests));
                if (await this.TestFileUpload("SanTest" + random(maxRandomNumber) + ".php.php.rar	", "image/jpeg", b642plain("/9j/4AAQSkZJRgABAQEASABIAAD//gAyPD9waHAgZWNobyhtZDUoJ3Nhbmdmb3JyLWZpbGUtdXBsb2FkLXRlc3QnKSk7ID8+/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e/8AAEQgAAQABAwEiAAIRAQMRAf/EABUAAQEAAAAAAAAAAAAAAAAAAAAI/8QAFBABAAAAAAAAAAAAAAAAAAAAAP/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwCywAf/2Q=="), "963151c21d0fe4a98606a053e7cc9208")) return;
                ScriptProgress(ComputeProgress(4, numberTests));
                if (await this.TestFileUpload("SanTest" + random(maxRandomNumber) + ".php3", "image/jpeg", b642plain("/9j/4AAQSkZJRgABAQEASABIAAD//gAyPD9waHAgZWNobyhtZDUoJ3Nhbmdmb3JyLWZpbGUtdXBsb2FkLXRlc3QnKSk7ID8+/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e/8AAEQgAAQABAwEiAAIRAQMRAf/EABUAAQEAAAAAAAAAAAAAAAAAAAAI/8QAFBABAAAAAAAAAAAAAAAAAAAAAP/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwCywAf/2Q=="), "963151c21d0fe4a98606a053e7cc9208")) return;
                ScriptProgress(ComputeProgress(5, numberTests));
                if (await this.TestFileUpload("SanTest" + random(maxRandomNumber) + ".php\x00.jpg", "image/jpeg", b642plain("/9j/4AAQSkZJRgABAQEARwBHAAD//gAyPD9waHAgZWNobyhtZDUoJ3Nhbmdmb3JyLWZpbGUtdXBsb2FkLXRlc3QnKSk7ID8+/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e/8AAEQgAEAAQAwEiAAIRAQMRAf/EABYAAQEBAAAAAAAAAAAAAAAAAAQAAf/EACIQAAEEAgEEAwAAAAAAAAAAAAIBAwQFBhEHABITMSFBYf/EABUBAQEAAAAAAAAAAAAAAAAAAAQH/8QAIhEBAAECBAcAAAAAAAAAAAAAERIAEwMEFUEiJTJCYqGx/9oADAMBAAIRAxEAPwB1CxxdV8a01pk9Lb3OQ2kmajcaHZymyMQlutivaDqCKIIiKaT5169r1t9H4utONLm1xelt6bIauTCRyNMs5ThNi5LabJe03VEkUSIV2nxv16XovHzvH7IVFhkmT2tfMhx7CG/EYqZZkPklSDbcbeBshRex7e039fvVyA7x+63cWGN5Ra2EybHr4jEN+plgReKVHNxxx420FV7Gd7XX3+dI5vqvfC55BL5VPhlmLiXVeIZ9IAb+9q//2Q=="), "963151c21d0fe4a98606a053e7cc9208")) return;
                ScriptProgress(ComputeProgress(6, numberTests));
                if (await this.TestFileUpload("SanTest" + random(maxRandomNumber) + ".phtml", "image/jpeg", b642plain("/9j/4AAQSkZJRgABAQEASABIAAD//gAyPD9waHAgZWNobyhtZDUoJ3Nhbmdmb3JyLWZpbGUtdXBsb2FkLXRlc3QnKSk7ID8+/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e/8AAEQgAAQABAwEiAAIRAQMRAf/EABUAAQEAAAAAAAAAAAAAAAAAAAAI/8QAFBABAAAAAAAAAAAAAAAAAAAAAP/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwCywAf/2Q=="), "963151c21d0fe4a98606a053e7cc9208")) return;
                ScriptProgress(ComputeProgress(7, numberTests));
                if (await this.TestFileUpload("SanTest" + random(maxRandomNumber) + ".php", "text/plain", b642plain("PD9waHAgZWNobyhtZDUoJ2FjdW5ldGl4LWZpbGUtdXBsb2FkLXRlc3QnKSk7ID8+"), "963151c21d0fe4a98606a053e7cc9208")) return;
                ScriptProgress(ComputeProgress(8, numberTests));
                if (await this.TestFileUpload("SanTest" + random(maxRandomNumber) + ".php.jpg", "image/jpeg", b642plain("/9j/4AAQSkZJRgABAQEASABIAAD//gAyPD9waHAgZWNobyhtZDUoJ3Nhbmdmb3JyLWZpbGUtdXBsb2FkLXRlc3QnKSk7ID8+/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e/8AAEQgAAQABAwEiAAIRAQMRAf/EABUAAQEAAAAAAAAAAAAAAAAAAAAI/8QAFBABAAAAAAAAAAAAAAAAAAAAAP/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwCywAf/2Q=="), "963151c21d0fe4a98606a053e7cc9208")) return;
                ScriptProgress(ComputeProgress(9, numberTests));
                if (await this.TestFileUpload("SanTest" + random(maxRandomNumber) + ".php.123", "image/png", b642plain("/9j/4AAQSkZJRgABAQEASABIAAD//gAyPD9waHAgZWNobyhtZDUoJ3Nhbmdmb3JyLWZpbGUtdXBsb2FkLXRlc3QnKSk7ID8+/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e/8AAEQgAAQABAwEiAAIRAQMRAf/EABUAAQEAAAAAAAAAAAAAAAAAAAAI/8QAFBABAAAAAAAAAAAAAAAAAAAAAP/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwCywAf/2Q=="), "963151c21d0fe4a98606a053e7cc9208")) return;
                ScriptProgress(ComputeProgress(10, numberTests));
                if (await this.TestFileUpload("SanTest" + random(maxRandomNumber) + ".php::$DATA", "image/png", b642plain("/9j/4AAQSkZJRgABAQEASABIAAD//gAyPD9waHAgZWNobyhtZDUoJ3Nhbmdmb3JyLWZpbGUtdXBsb2FkLXRlc3QnKSk7ID8+/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e/8AAEQgAAQABAwEiAAIRAQMRAf/EABUAAQEAAAAAAAAAAAAAAAAAAAAI/8QAFBABAAAAAAAAAAAAAAAAAAAAAP/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwCywAf/2Q=="), "963151c21d0fe4a98606a053e7cc9208")) return;
                ScriptProgress(ComputeProgress(11, numberTests));
                if (await this.TestFileUpload("SanTest" + random(maxRandomNumber) + ".htaccess", "image/jpeg", b642plain("I1Nhbmdmb3IgLmh0YWNjZXNzIEZpbGUgVXBsb2FkIHRlc3QNCkFkZFR5cGUgYXBwbGljYXRpb24veC1odHRwZC1waHAgLmpwZyAucG5nIC5naWYgLmh0bSAuaHRtbCA="), "# .htaccess File Upload test")) return;
                ScriptProgress(ComputeProgress(12, numberTests));
                if (await this.TestFileUpload("SanTest" + random(maxRandomNumber) + ".php.ajpg", "image/jpeg", b642plain("/9j/4AAQSkZJRgABAQEARwBHAAD//gAyPD9waHAgZWNobyhtZDUoJ3Nhbmdmb3JyLWZpbGUtdXBsb2FkLXRlc3QnKSk7ID8+/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e/8AAEQgAEAAQAwEiAAIRAQMRAf/EABYAAQEBAAAAAAAAAAAAAAAAAAQAAf/EACIQAAEEAgEEAwAAAAAAAAAAAAIBAwQFBhEHABITMSFBYf/EABUBAQEAAAAAAAAAAAAAAAAAAAQH/8QAIhEBAAECBAcAAAAAAAAAAAAAERIAEwMEFUEiJTJCYqGx/9oADAMBAAIRAxEAPwB1CxxdV8a01pk9Lb3OQ2kmajcaHZymyMQlutivaDqCKIIiKaT5169r1t9H4utONLm1xelt6bIauTCRyNMs5ThNi5LabJe03VEkUSIV2nxv16XovHzvH7IVFhkmT2tfMhx7CG/EYqZZkPklSDbcbeBshRex7e039fvVyA7x+63cWGN5Ra2EybHr4jEN+plgReKVHNxxx420FV7Gd7XX3+dI5vqvfC55BL5VPhlmLiXVeIZ9IAb+9q//2Q=="), "963151c21d0fe4a98606a053e7cc9208")) return;
                ScriptProgress(ComputeProgress(13, numberTests));
                if (await this.TestFileUpload("SanTest" + random(maxRandomNumber) + ".asp", "image/jpeg", b642plain("PCUgUmVzcG9uc2UuV3JpdGUoIjRkMDIwNzBlZmZkZDdlMzE5IiArICJjYTU2MWJjNjY2MTdhOGEiKSAlPg=="), "963151c21d0fe4a98606a053e7cc9208")) return;
                ScriptProgress(ComputeProgress(14, numberTests));
                if (await this.TestFileUpload("SanTest" + random(maxRandomNumber) + ".aspx", "image/png", b642plain("PHNjcmlwdCBydW5hdD0ic2VydmVyIiBsYW5ndWFnZT0iQyMiPg0Kdm9pZCBQYWdlX0xvYWQob2JqZWN0IHNlbmRlciwgRXZlbnRBcmdzIGUpew0KICBSZXNwb25zZS5Xcml0ZSgiNGQwMjA3MGVmZmRkN2UzMTkiICsgImNhNTYxYmM2NjYxN2E4YSIpOw0KfQ0KPC9zY3JpcHQ+DQo="), "963151c21d0fe4a98606a053e7cc9208")) return;
                ScriptProgress(ComputeProgress(15, numberTests));
                if (await this.TestFileUpload("SanTest" + random(maxRandomNumber) + ".asp", "text/plain", b642plain("PCUgUmVzcG9uc2UuV3JpdGUoIjRkMDIwNzBlZmZkZDdlMzE5IiArICJjYTU2MWJjNjY2MTdhOGEiKSAlPg=="), "963151c21d0fe4a98606a053e7cc9208")) return;
                ScriptProgress(ComputeProgress(16, numberTests));
                if (await this.TestFileUpload("SanTest" + random(maxRandomNumber) + ".asp;.jpg", "image/jpeg", b642plain("PCUgUmVzcG9uc2UuV3JpdGUoIjRkMDIwNzBlZmZkZDdlMzE5IiArICJjYTU2MWJjNjY2MTdhOGEiKSAlPg=="), "963151c21d0fe4a98606a053e7cc9208")) return;
                ScriptProgress(ComputeProgress(17, numberTests));
                if (await this.TestFileUpload("SanTest" + random(maxRandomNumber) + ".jsp", "image/jpeg", b642plain("PCUgb3V0LnByaW50KCI0ZDAyMDcwZWZmZGQ3ZTMxOSIgKyAiY2E1NjFiYzY2NjE3YThhIik7ICU+"), "963151c21d0fe4a98606a053e7cc9208")) return;
                ScriptProgress(ComputeProgress(18, numberTests));
                if (await this.TestFileUpload("SanTest" + random(maxRandomNumber) + ".jpg", "image/jpeg", b642plain("/9j/4AAQSkZJRgABAQEASABIAAD//gAyPD9waHAgZWNobyhtZDUoJ3Nhbmdmb3JyLWZpbGUtdXBsb2FkLXRlc3QnKSk7ID8+/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e/8AAEQgAAQABAwEiAAIRAQMRAf/EABUAAQEAAAAAAAAAAAAAAAAAAAAI/8QAFBABAAAAAAAAAAAAAAAAAAAAAP/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwCywAf/2Q=="), "963151c21d0fe4a98606a053e7cc9208", 1)) return;

prepareUploadURLs()

すべてのファイル入力に対して配列fileInputListを作成する

入力タイプがファイルであるかどうかを判断し、ファイルである場合は、それを配列fileInputListに追加します。

fileInputListの長さが 0 の場合、ファイルアップロードの脆弱性がないことを意味し、trueを返します。

fileInputListの長さが0でない場合

次に、処理のために配列をフレームワーク関数selectvariationsForInputListに送信します。この関数の機能は、配列をフレームワークにアップロードし、配列バリエーションとして宣言することです。

ファイル アップロード脆弱性 URL の配列 (this.uploadURLs)を定義し、その数が配列のバリエーションの長さと同じになるようにし配列this.uploadURLsの値を **{TO_BE_DETECTED}** に割り当てます。

操作の終了

TestXXEFileUpload()

まず、長さが 10 のランダム値rndTokenを作成し、その rndToken をXML 形式ペイロードに書き込みます

すべてのファイル入力に対してTListクラスfileInputListを作成する

入力タイプがファイルかどうかを判断し、ファイルであればそれをクラスfileInputListに追加します。

クラスfileInputListに値がない場合はtrue を返します

クラスfileInputListの配列が空でない場合、処理のために配列をフレームワーク関数selectvariationsForInputListに送信します。この関数の機能は、配列をフレームワークにアップロードし、クラスfileInputListの配列の値を配列バリエーションに割り当てることです。

配列バリエーションの値を順番にロードします( loadvariation() )、

次に、setInputFileName()setInputContentType()、 **setInputValue()** を使用して、ファイル名 (関数呼び出し時に渡される)、ファイル タイプ (関数呼び出し時に渡される)、およびファイル内の値 (ペイロード) を作成します ) (ランダムな文字列がここにあります)

このファイルを dnslog とともに送信します。応答パケットがエラーを報告しない場合、またはエラー コードが983043であり、dnslog が乱数を監視できる場合は、alertXXE()を呼び出します。

alertXXE() は、XML_External_Entity_Injection_And_XML_Injection2.xmlの脆弱性を宣言します(xxe 脆弱性)


startTesting() 呼び出しメソッド:

最初に **this.TestXXEFileUpload(“SanTest” + random(maxRandomNumber) + “.xml”, “text/xml”)** を呼び出します。 false が返された場合は、

次に、**this.TestXXEFileUpload(“SanTest” + random(maxRandomNumber) + “.jpg”, “image/jpeg”)** を使用して呼び出します。

上記 2 つの呼び出しの結果に関係なく、**this.TestXSLTFileUpload(“SanTest” + random(maxRandomNumber) + “.xml”, “text/xml”)** を使用して再度呼び出します。

TestPerlJam2()

入力ポイントの入力タイプが FILE である入力ポイントと一致するように変数fileInputNameを初期化します。一致する場合は、ループを終了して、それをfileInputNameに割り当てます。

fileInputNameを使用してパケット本体を構築します

データ パケット本体にフォーム タイプ データを含むデータ パケットを送信し、応答パケットに特殊な文字列 (root、bin など) がある場合は、 alertPerljam2()を呼び出します。

alertPerljam2() は、Directory_Traversal.xml の脆弱性があることを宣言します(ディレクトリトラバーサルの脆弱性)

TestZipSymlinkUpload()

Base64の復号結果の文字列として変数ペイロードを作成するのですが、base64のデコードされた内容が分かりません。? インターネットでは、これは絶対パス (path_(コンピューター サイエンス)) または相対パスの形式で他のファイルまたはディレクトリへの参照を含むソフト リンクであると言われています。

画像.png

すべてのファイル入力に対してTListクラスfileInputListを作成する

入力タイプがファイルかどうかを判断し、ファイルであればそれをクラスfileInputListに追加します。

クラスfileInputListに値がない場合はtrue を返します

クラスfileInputListの配列が空でない場合、処理のために配列をフレームワーク関数selectvariationsForInputListに送信します。この関数の機能は、配列をフレームワークにアップロードし、クラスfileInputListの配列の値を配列バリエーションに割り当てることです。

配列バリエーションの値を順番にロードします( loadvariation() )、

次に、setInputFileName()setInputContentType()、 **setInputValue()** を順番に使用して、ファイル名 (関数呼び出し時に渡される)、ファイル タイプ (関数呼び出し時に渡される)、およびファイル内の値を作成します。 (ペイロード)

応答パッケージがエラーを報告しない場合は、パッケージを送信します。

まず応答パケットに特殊な文字列(root、binなど)があるかどうかを判断し、あればalertZipSymlink()を呼び出しtrueを返す

そうでない場合、base64 は応答パケットのデータを一度復号化し、復号化されたコンテンツに特殊な文字列 (root、bin など) が含まれている場合は、alertZipSymlink()を呼び出しtrue を返します。

alertZipSymlink() は、File_Upload_ZIP_symlink.xml の脆弱性があることを宣言します(圧縮パッケージのソフトリンクファイルアップロードの脆弱性)

TestImageUploadExifXSS()

Base64 復号結果の文字列として変数ペイロードを作成します。Base64 デコードされたコンテンツは絵馬になるはずであり、多くのポップアップ コマンドがあります。

画像.png

すべてのファイル入力に対してTListクラスfileInputListを作成する

入力タイプがファイルかどうかを判断し、ファイルであればそれをクラスfileInputListに追加します。

クラスfileInputListに値がない場合はtrue を返します

クラスfileInputListの配列が空でない場合、処理のために配列をフレームワーク関数selectvariationsForInputListに送信します。この関数の機能は、配列をフレームワークにアップロードし、クラスfileInputListの配列の値を配列バリエーションに割り当てることです。

配列バリエーションの値を順番にロードします( loadvariation() )、

次に、setInputFileName()setInputContentType()、 **setInputValue()** を順番に使用して、ファイル名 (関数呼び出し時に渡される)、ファイル タイプ (関数呼び出し時に渡される)、およびファイル内の値を作成します。 (ペイロード)

次にパッケージを送信します。応答パッケージがエラーを報告せず、 html 解析後にtag=svg|onlοad=alert(7346763)が認識された場合は、 alertEXIFXSS()を呼び出します。

alertEXIFXSS() は、File_Upload_XSS.xml の脆弱性があることを宣言します(ファイルのアップロードにより XSS 脆弱性が引き起こされます)

TestFileUpload()

1.0すべてのファイル入力に対してTListクラスfileInputListを作成する

入力タイプがファイルかどうかを判断し、ファイルであればそれをクラスfileInputListに追加します。

クラスfileInputListに値がない場合はtrue を返します

クラスfileInputListの配列が空でない場合、処理のために配列をフレームワーク関数selectvariationsForInputListに送信します。この関数の機能は、配列をフレームワークにアップロードし、クラスfileInputListの配列の値を配列バリエーションに割り当てることです。

配列バリエーションの値を順番にロードします( loadvariation() )、

次に、setInputFileName()setInputContentType()、 **setInputValue()** を順番に使用して、ファイル名 (関数呼び出し時に渡される)、ファイル タイプ (関数呼び出し時に渡される)、およびファイル内の値を作成します。 (ペイロード)

その後、パッケージを送信します。

ファイル名に\x00.jpg 」が含まれている場合は、その「 \x00.jpg」を削除します。

応答パケットがエラーを報告しない場合

2.1 **this.uploadURLs[varIndex] の値を決定します。this.uploadURLs[varIndex] == {NOT_FOUND}** の場合は、この関数を直接終了します。

2.2 this.uploadURLs[varIndex] == {TO_BE_DETECTED}または{BRUTEFORCE}の場合

まず、以前に決定したファイル アップロード ディレクトリをテストし、url = スキャン パス + ファイル名を作成します。

2.2.1 関数TestUploadedFileOnUrl()を呼び出します。 TestUploadedFileOnUrl() == trueの場合、変数this.foundOneUploadURL = trueを定義し、スキャンされたファイル パスの最後の " / " から URL をインターセプトし、それをthis.uploadURLsに割り当てます。 [varIndex]lookFor (関数の呼び出し時に渡される) = detectURLstr(sangforr-file-upload-test)の場合 alert()を呼び出しtrueを返し、この関数を終了します

2.2.2 関数TestUploadedFileOnUrl()を呼び出します。TestUploadedFileOnUrl() == falseの場合、クラスpd = getParserData(this.lastJob.response.body, this.lastJob.response.headerValue('content-type'))を作成します。 if pd .getLinks()が存在し、その値がファイル名に存在する場合、配列links = pd.getLinks()を作成します URL が http 経由で渡され、ドメイン名 ( baseDomain )がある場合、最後の URL からURL をインターセプトしますスキャンされたファイル パスの" / " を取得し、 this.uploadURLs[varIndex]に割り当てますlookFor (関数呼び出し時に渡される) = detectURLstr(sangforr-file-upload-test)の場合 this.foundOneUploadURL = trueとします。この関数の実行を終了するには、alert()を呼び出してtrue を返します

2.2.3 2.2.1 と 2.2.2 の判定が成功しなかった場合、変数fileExtリンクの配列があれば、ファイル名の接尾辞である変数fileExt = getFileExt(filename)を作成します(これは配列は 3.2 で作成されました)、新しい配列を作成しますnewLinks = new TStringList()、配列リンクの値の末尾が"." + fileExtの場合、配列リンクの値を配列newLinksに追加します

配列newLinksの長さが 0 でない場合、この長さを変数linksCountに割り当てます。変数linksCountの長さは5 を超えることはできません。5 より大きい場合は、5 に再割り当てされます。URL の送信方法がhttp であり、ドメイン名 ( baseDomain )がある場合、スキャンされたファイル パスの最後の「 /、それをthis.uploadURLs[varIndex]に割り当て、lookForの場合はthis.foundOneUploadURL = trueにします(入力時にこの関数を終了するには、alert ( )を呼び出し true を返します。

2.2.4 2.2.3の判定が失敗した場合、変数this.uploadURLs[varIndex] == '{TO_BE_DETECTED}'の値をthis.uploadURLs[varIndex] = '{NOT_FOUND}'に変更する

2.3変数this.uploadURLs[varIndex]の値は、{NOT_FOUND} {TO_BE_DETECTED}、または{BRUTEFORCE}に属していません

変数this.uploadURLs[varIndex] != ''の場合、クラスcanonUrlを作成します

appendPHPFilename (関数呼び出し時に渡される) == 1の場合canonUrl = new TURL(this.uploadURLs[varIndex] + filename + '/sangfort.php')、それ以外の場合canonUrl = new TURL(this.uploadURLs[varIndex] + filename) )

次に、関数 **TestUploadedFileOnUrl()** を呼び出します。戻り値が true で、lookFor (関数呼び出し時に渡される) = detectURLstr(sangforr-file-upload-test) の場合は alert()を呼び出してtrue を返しこれを終了します。関数

3.0 上記の条件がいずれも満たされていないため、ファイル アップロードの脆弱性がないことを示し、false を返します。

TestUploadedFileOnUrl()

応答パケットに変数searchStr (関数の呼び出し時に渡される) があり、ファイル タイプが変数ExpectedContentType (関数の呼び出し時に渡される) である場合、パッケージを直接送信します (関数の呼び出し時にパッケージ情報が渡されます)。関数が呼び出された場合)、true を返し、それ以外の場合は false を返します

存在ファイルアップロード()

すべてのファイル入力に対してTListクラスfileInputListを作成する

入力タイプがファイルかどうかを判断し、ファイルであればそれをクラスfileInputListに追加します。

クラスfileInputListの配列が空ではない場合、処理のためにその配列をフレームワーク関数selectvariationsForInputListに送信します。この関数の機能は、配列をフレームワークにアップロードすることです。

次に、setInputFileName、setInputContentType、および setInputValue を使用して、fileInputList からファイル名、ファイル タイプ、およびファイル内の値を順に作成します (ランダムな文字列はここにあります)。

次に、ランダムな文字列を含むデータ パケットを送信します。応答パケットがエラーを報告しないか、エラー コードが 0xF0003 で、応答パケットに以前に送信されたランダムな文字列が含まれている場合は、alertXSLT() を呼び出します

alertXSLT()ステートメントにはXSLT_injection.xml の脆弱性があります

おすすめ

転載: blog.csdn.net/weixin_46706771/article/details/125682422